invensys-ng 21.3.10 → 21.3.12

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.
@@ -3003,6 +3003,239 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
3003
3003
  type: Input
3004
3004
  }] } });
3005
3005
 
3006
+ class IMessage {
3007
+ /**
3008
+ * Severity type of the message
3009
+ * @default 'info'
3010
+ */
3011
+ severity = 'info';
3012
+ /**
3013
+ * Size of the message
3014
+ * @default 'medium'
3015
+ */
3016
+ size = 'medium';
3017
+ /**
3018
+ * Icon to display (Material Icons)
3019
+ * If not provided, default icons based on severity will be used
3020
+ */
3021
+ icon;
3022
+ /**
3023
+ * Whether the message can be closed
3024
+ * @default false
3025
+ */
3026
+ closable = false;
3027
+ /**
3028
+ * Whether the message is visible
3029
+ * @default true
3030
+ */
3031
+ visible = true;
3032
+ /**
3033
+ * Event emitted when visible changes (for two-way binding)
3034
+ */
3035
+ visibleChange = new EventEmitter();
3036
+ /**
3037
+ * Get the default icon based on severity
3038
+ */
3039
+ getDefaultIcon() {
3040
+ if (this.icon)
3041
+ return this.icon;
3042
+ const iconMap = {
3043
+ success: 'pi pi-check-circle',
3044
+ info: 'pi pi-lightbulb',
3045
+ warning: 'pi pi-exclamation-triangle',
3046
+ danger: 'pi pi-times-circle',
3047
+ primary: 'pi pi-info-circle',
3048
+ secondary: 'pi pi-info-circle',
3049
+ tertiary: 'pi pi-info-circle',
3050
+ contrast: 'pi pi-info-circle',
3051
+ };
3052
+ return iconMap[this.severity] || 'pi pi-info-circle';
3053
+ }
3054
+ /**
3055
+ * Close the message
3056
+ */
3057
+ close() {
3058
+ this.visible = false;
3059
+ this.visibleChange.emit(this.visible);
3060
+ }
3061
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: IMessage, deps: [], target: i0.ɵɵFactoryTarget.Component });
3062
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: IMessage, isStandalone: true, selector: "i-message", inputs: { severity: "severity", size: "size", icon: "icon", closable: "closable", visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "@if (visible) {\n <div\n class=\"i-message i-message-{{ severity }} i-message--{{ size }}\"\n role=\"alert\"\n >\n <div class=\"i-message-content\">\n <div class=\"i-message-icon\">\n <i [class]=\"getDefaultIcon()\"></i>\n </div>\n <div class=\"i-message-text\">\n <ng-content></ng-content>\n </div>\n @if (closable) {\n <button\n class=\"i-message-close\"\n type=\"button\"\n (click)=\"close()\"\n aria-label=\"Close\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n}\n", styles: [".i-message{background-color:var(--surface-section);border-left:4px solid transparent}.i-message .i-message-text{color:var(--color-text-primary)}.i-message .i-message-close{color:var(--color-text-secondary)}.i-message .i-message-close:hover{color:var(--color-text-primary);background-color:var(--surface-hover)}.i-message.i-message-success{border-left-color:var(--color-success)}.i-message.i-message-success .i-message-icon{color:var(--color-success)}.i-message.i-message-info{border-left-color:var(--color-info)}.i-message.i-message-info .i-message-icon{color:var(--color-info)}.i-message.i-message-warning{border-left-color:var(--color-warning)}.i-message.i-message-warning .i-message-icon{color:var(--color-warning)}.i-message.i-message-danger{border-left-color:var(--color-danger)}.i-message.i-message-danger .i-message-icon{color:var(--color-danger)}.i-message.i-message-primary{border-left-color:var(--color-primary)}.i-message.i-message-primary .i-message-icon{color:var(--color-primary)}.i-message.i-message-secondary{border-left-color:var(--color-secondary)}.i-message.i-message-secondary .i-message-icon{color:var(--color-secondary)}.i-message.i-message-tertiary{border-left-color:var(--color-text-tertiary)}.i-message.i-message-tertiary .i-message-icon{color:var(--color-text-tertiary)}.i-message.i-message-contrast{border-left-color:var(--color-contrast)}.i-message.i-message-contrast .i-message-icon{color:var(--color-contrast)}.i-message{display:flex;align-items:flex-start;border-radius:8px;margin-bottom:16px}.i-message:last-child{margin-bottom:0}.i-message--small .i-message-content{gap:8px;padding:8px 12px}.i-message--small .i-message-content .i-message-icon i{font-size:14px}.i-message--small .i-message-content .i-message-text{font-size:.95em}.i-message--small .i-message-content .i-message-close{padding:2px}.i-message--small .i-message-content .i-message-close i{font-size:10px}.i-message--medium .i-message-content{gap:12px;padding:16px}.i-message--medium .i-message-content .i-message-icon i{font-size:18px}.i-message--medium .i-message-content .i-message-text{font-size:1em}.i-message--medium .i-message-content .i-message-close i{font-size:12px}.i-message--large .i-message-content{gap:16px;padding:20px 24px}.i-message--large .i-message-content .i-message-icon i{font-size:24px}.i-message--large .i-message-content .i-message-text{font-size:1.1em}.i-message--large .i-message-content .i-message-close{padding:6px}.i-message--large .i-message-content .i-message-close i{font-size:14px}.i-message .i-message-content{display:flex;align-items:flex-start;width:100%}.i-message .i-message-content .i-message-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}.i-message .i-message-content .i-message-text{flex:1;line-height:1.5;min-width:0;word-wrap:break-word}.i-message .i-message-content .i-message-close{background:none;border:none;cursor:pointer;padding:4px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;transition:background-color .2s,color .2s}\n"] });
3063
+ }
3064
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: IMessage, decorators: [{
3065
+ type: Component,
3066
+ args: [{ selector: 'i-message', imports: [], template: "@if (visible) {\n <div\n class=\"i-message i-message-{{ severity }} i-message--{{ size }}\"\n role=\"alert\"\n >\n <div class=\"i-message-content\">\n <div class=\"i-message-icon\">\n <i [class]=\"getDefaultIcon()\"></i>\n </div>\n <div class=\"i-message-text\">\n <ng-content></ng-content>\n </div>\n @if (closable) {\n <button\n class=\"i-message-close\"\n type=\"button\"\n (click)=\"close()\"\n aria-label=\"Close\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n}\n", styles: [".i-message{background-color:var(--surface-section);border-left:4px solid transparent}.i-message .i-message-text{color:var(--color-text-primary)}.i-message .i-message-close{color:var(--color-text-secondary)}.i-message .i-message-close:hover{color:var(--color-text-primary);background-color:var(--surface-hover)}.i-message.i-message-success{border-left-color:var(--color-success)}.i-message.i-message-success .i-message-icon{color:var(--color-success)}.i-message.i-message-info{border-left-color:var(--color-info)}.i-message.i-message-info .i-message-icon{color:var(--color-info)}.i-message.i-message-warning{border-left-color:var(--color-warning)}.i-message.i-message-warning .i-message-icon{color:var(--color-warning)}.i-message.i-message-danger{border-left-color:var(--color-danger)}.i-message.i-message-danger .i-message-icon{color:var(--color-danger)}.i-message.i-message-primary{border-left-color:var(--color-primary)}.i-message.i-message-primary .i-message-icon{color:var(--color-primary)}.i-message.i-message-secondary{border-left-color:var(--color-secondary)}.i-message.i-message-secondary .i-message-icon{color:var(--color-secondary)}.i-message.i-message-tertiary{border-left-color:var(--color-text-tertiary)}.i-message.i-message-tertiary .i-message-icon{color:var(--color-text-tertiary)}.i-message.i-message-contrast{border-left-color:var(--color-contrast)}.i-message.i-message-contrast .i-message-icon{color:var(--color-contrast)}.i-message{display:flex;align-items:flex-start;border-radius:8px;margin-bottom:16px}.i-message:last-child{margin-bottom:0}.i-message--small .i-message-content{gap:8px;padding:8px 12px}.i-message--small .i-message-content .i-message-icon i{font-size:14px}.i-message--small .i-message-content .i-message-text{font-size:.95em}.i-message--small .i-message-content .i-message-close{padding:2px}.i-message--small .i-message-content .i-message-close i{font-size:10px}.i-message--medium .i-message-content{gap:12px;padding:16px}.i-message--medium .i-message-content .i-message-icon i{font-size:18px}.i-message--medium .i-message-content .i-message-text{font-size:1em}.i-message--medium .i-message-content .i-message-close i{font-size:12px}.i-message--large .i-message-content{gap:16px;padding:20px 24px}.i-message--large .i-message-content .i-message-icon i{font-size:24px}.i-message--large .i-message-content .i-message-text{font-size:1.1em}.i-message--large .i-message-content .i-message-close{padding:6px}.i-message--large .i-message-content .i-message-close i{font-size:14px}.i-message .i-message-content{display:flex;align-items:flex-start;width:100%}.i-message .i-message-content .i-message-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}.i-message .i-message-content .i-message-text{flex:1;line-height:1.5;min-width:0;word-wrap:break-word}.i-message .i-message-content .i-message-close{background:none;border:none;cursor:pointer;padding:4px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;transition:background-color .2s,color .2s}\n"] }]
3067
+ }], propDecorators: { severity: [{
3068
+ type: Input
3069
+ }], size: [{
3070
+ type: Input
3071
+ }], icon: [{
3072
+ type: Input
3073
+ }], closable: [{
3074
+ type: Input
3075
+ }], visible: [{
3076
+ type: Input
3077
+ }], visibleChange: [{
3078
+ type: Output
3079
+ }] } });
3080
+
3081
+ /**
3082
+ * Selects and validates local files. The consuming app owns the selection and upload transport.
3083
+ * @example
3084
+ * <i-file-upload [(files)]="files" [options]="uploadOptions" />
3085
+ */
3086
+ class IFileUpload {
3087
+ /** Controlled selection; supports [(files)]. */
3088
+ files = [];
3089
+ options = {};
3090
+ disabled = false;
3091
+ dropLabel = 'Drop your files here';
3092
+ description = 'or choose files from your device';
3093
+ chooseLabel = 'Choose files';
3094
+ ariaLabel = 'Choose files';
3095
+ uploadIcon = 'pi pi-cloud-upload';
3096
+ fileIcon = 'pi pi-file';
3097
+ /** Emits only when a valid selection changes. Invalid batches are rejected as a whole. */
3098
+ filesChange = new EventEmitter();
3099
+ validationError = new EventEmitter();
3100
+ componentId = UniqueComponentId('i-file-upload-');
3101
+ dragging = false;
3102
+ error = null;
3103
+ get limits() {
3104
+ return {
3105
+ fileTypes: this.options.fileTypes ?? [],
3106
+ multiple: this.options.multiple ?? true,
3107
+ maxFiles: this.options.maxFiles ?? 20,
3108
+ maxFileSize: this.options.maxFileSize ?? 25 * 1024 * 1024,
3109
+ maxTotalSize: this.options.maxTotalSize ?? 100 * 1024 * 1024,
3110
+ allowEmptyFiles: this.options.allowEmptyFiles ?? false,
3111
+ };
3112
+ }
3113
+ get accept() {
3114
+ return this.limits.fileTypes.join(',');
3115
+ }
3116
+ get limitsLabel() {
3117
+ const limits = this.limits;
3118
+ return `Up to ${limits.multiple ? limits.maxFiles : Math.min(1, limits.maxFiles)} files · ${this.formatSize(limits.maxFileSize)} per file · ${this.formatSize(limits.maxTotalSize)} total`;
3119
+ }
3120
+ onSelect(event) {
3121
+ const element = event.target;
3122
+ this.addFiles(Array.from(element.files ?? []));
3123
+ element.value = '';
3124
+ }
3125
+ onDragOver(event) {
3126
+ event.preventDefault();
3127
+ if (!this.disabled)
3128
+ this.dragging = true;
3129
+ }
3130
+ onDragLeave(event) {
3131
+ const zone = event.currentTarget;
3132
+ if (!(event.relatedTarget instanceof Node) || !zone.contains(event.relatedTarget)) {
3133
+ this.dragging = false;
3134
+ }
3135
+ }
3136
+ onDrop(event) {
3137
+ event.preventDefault();
3138
+ this.dragging = false;
3139
+ this.addFiles(Array.from(event.dataTransfer?.files ?? []));
3140
+ }
3141
+ addFiles(incoming) {
3142
+ if (this.disabled || incoming.length === 0)
3143
+ return;
3144
+ this.error = null;
3145
+ const limits = this.limits;
3146
+ for (const file of incoming) {
3147
+ if (!this.accepts(file)) {
3148
+ this.reject({ code: 'fileType', file, message: `${file.name}: supported file types are ${limits.fileTypes.join(', ')}.` });
3149
+ return;
3150
+ }
3151
+ if (!limits.allowEmptyFiles && file.size === 0) {
3152
+ this.reject({ code: 'emptyFile', file, message: `${file.name} is empty.` });
3153
+ return;
3154
+ }
3155
+ if (file.size > limits.maxFileSize) {
3156
+ this.reject({ code: 'fileSize', file, message: `${file.name} exceeds ${this.formatSize(limits.maxFileSize)} per file.` });
3157
+ return;
3158
+ }
3159
+ }
3160
+ // Single-file mode replaces the existing selection. A multi-file drop is still rejected.
3161
+ const combined = limits.multiple ? [...this.files] : [];
3162
+ for (const file of incoming) {
3163
+ if (!combined.some((existing) => this.sameFile(existing, file)))
3164
+ combined.push(file);
3165
+ }
3166
+ const maxFiles = limits.multiple ? limits.maxFiles : Math.min(1, limits.maxFiles);
3167
+ if (combined.length > maxFiles) {
3168
+ this.reject({ code: 'fileCount', message: `Select at most ${maxFiles} file${maxFiles === 1 ? '' : 's'}.` });
3169
+ return;
3170
+ }
3171
+ if (combined.reduce((total, file) => total + file.size, 0) > limits.maxTotalSize) {
3172
+ this.reject({ code: 'totalSize', message: `Selected files exceed ${this.formatSize(limits.maxTotalSize)} in total.` });
3173
+ return;
3174
+ }
3175
+ if (combined.length !== this.files.length || combined.some((file, index) => !this.sameFile(file, this.files[index]))) {
3176
+ this.filesChange.emit(combined);
3177
+ }
3178
+ }
3179
+ remove(index) {
3180
+ if (this.disabled || index < 0 || index >= this.files.length)
3181
+ return;
3182
+ this.error = null;
3183
+ this.filesChange.emit(this.files.filter((_, position) => position !== index));
3184
+ }
3185
+ formatSize(bytes) {
3186
+ if (bytes < 1024)
3187
+ return `${bytes} B`;
3188
+ if (bytes < 1024 * 1024)
3189
+ return `${Number((bytes / 1024).toFixed(1))} KB`;
3190
+ return `${Number((bytes / (1024 * 1024)).toFixed(1))} MB`;
3191
+ }
3192
+ accepts(file) {
3193
+ return this.limits.fileTypes.length === 0 || this.limits.fileTypes.some((type) => {
3194
+ const token = type.toLowerCase();
3195
+ if (token.startsWith('.'))
3196
+ return file.name.toLowerCase().endsWith(token);
3197
+ if (token.endsWith('/*'))
3198
+ return file.type.toLowerCase().startsWith(token.slice(0, -1));
3199
+ return file.type.toLowerCase() === token;
3200
+ });
3201
+ }
3202
+ sameFile(a, b) {
3203
+ return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;
3204
+ }
3205
+ reject(error) {
3206
+ this.error = error;
3207
+ this.validationError.emit(error);
3208
+ }
3209
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: IFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Component });
3210
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: IFileUpload, isStandalone: true, selector: "i-file-upload", inputs: { files: "files", options: "options", disabled: "disabled", dropLabel: "dropLabel", description: "description", chooseLabel: "chooseLabel", ariaLabel: "ariaLabel", uploadIcon: "uploadIcon", fileIcon: "fileIcon" }, outputs: { filesChange: "filesChange", validationError: "validationError" }, ngImport: i0, template: "<div class=\"i-file-upload\" [class.i-file-upload--disabled]=\"disabled\">\n <div class=\"i-file-upload__drop-zone\" [class.i-file-upload__drop-zone--active]=\"dragging && !disabled\"\n (dragover)=\"onDragOver($event)\" (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event)\">\n <i [class]=\"uploadIcon + ' i-file-upload__icon'\" aria-hidden=\"true\"></i>\n <strong>{{ dropLabel }}</strong>\n <span class=\"i-file-upload__description\">{{ description }}</span>\n <input #fileInput type=\"file\" hidden [multiple]=\"limits.multiple\" [accept]=\"accept\"\n [disabled]=\"disabled\" (change)=\"onSelect($event)\" [attr.aria-label]=\"ariaLabel\"\n [attr.aria-describedby]=\"componentId + '-limits'\" />\n <i-button icon=\"pi pi-plus\" [outlined]=\"true\" [disabled]=\"disabled\" [ariaLabel]=\"ariaLabel\"\n (clicked)=\"fileInput.click()\">{{ chooseLabel }}</i-button>\n <small [id]=\"componentId + '-limits'\" class=\"i-file-upload__description\">{{ limitsLabel }}</small>\n @if (accept) {\n <small class=\"i-file-upload__description\">Accepted types: {{ accept }}</small>\n }\n </div>\n @if (error) {\n <i-message severity=\"danger\" role=\"alert\">{{ error.message }}</i-message>\n }\n <div class=\"i-file-upload__list\" aria-live=\"polite\" aria-relevant=\"additions removals text\">\n @if (files.length) {\n <strong>{{ files.length }} file{{ files.length === 1 ? '' : 's' }} selected</strong>\n @for (file of files; track $index) {\n <div class=\"i-file-upload__row\">\n <i [class]=\"fileIcon\" aria-hidden=\"true\"></i>\n <span class=\"i-file-upload__name\" [title]=\"file.name\">{{ file.name }}</span>\n <small class=\"i-file-upload__description\">{{ formatSize(file.size) }}</small>\n <i-button icon=\"pi pi-times\" [text]=\"true\" size=\"small\" [ariaLabel]=\"'Remove ' + file.name\"\n [disabled]=\"disabled\" (clicked)=\"remove($index)\" />\n </div>\n }\n }\n </div>\n</div>\n", styles: [".i-file-upload{color:var(--color-text-primary)}.i-file-upload__drop-zone{border-color:var(--surface-border);background:var(--color-component-background)}.i-file-upload__drop-zone--active,.i-file-upload__drop-zone:focus-within{border-color:var(--color-primary);background:var(--surface-hover)}.i-file-upload__icon,.i-file-upload__row>i{color:var(--color-primary)}.i-file-upload__description{color:var(--color-text-secondary)}.i-file-upload__row{border-color:var(--surface-border)}.i-file-upload--disabled .i-file-upload__drop-zone{background:var(--color-disabled-background);border-color:var(--color-disabled-border)}:host{display:block}.i-file-upload{display:flex;flex-direction:column;gap:1rem}.i-file-upload__drop-zone{display:flex;flex-direction:column;align-items:center;gap:.75rem;padding:1.5rem 1rem;text-align:center;border:2px dashed;border-radius:8px;transition:border-color .2s,background .2s}.i-file-upload__icon{font-size:2rem}.i-file-upload--disabled .i-file-upload__drop-zone{opacity:.65}.i-file-upload__list{display:flex;flex-direction:column;gap:.5rem}.i-file-upload__row{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-bottom:1px solid}.i-file-upload__row small{white-space:nowrap}.i-file-upload__name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "component", type: IButton, selector: "i-button", inputs: ["severity", "size", "type", "ariaLabel", "ariaExpanded", "disabled", "outlined", "raised", "text", "icon", "fluid", "loading"], outputs: ["clicked"] }, { kind: "component", type: IMessage, selector: "i-message", inputs: ["severity", "size", "icon", "closable", "visible"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3211
+ }
3212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: IFileUpload, decorators: [{
3213
+ type: Component,
3214
+ args: [{ selector: 'i-file-upload', standalone: true, imports: [IButton, IMessage], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"i-file-upload\" [class.i-file-upload--disabled]=\"disabled\">\n <div class=\"i-file-upload__drop-zone\" [class.i-file-upload__drop-zone--active]=\"dragging && !disabled\"\n (dragover)=\"onDragOver($event)\" (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event)\">\n <i [class]=\"uploadIcon + ' i-file-upload__icon'\" aria-hidden=\"true\"></i>\n <strong>{{ dropLabel }}</strong>\n <span class=\"i-file-upload__description\">{{ description }}</span>\n <input #fileInput type=\"file\" hidden [multiple]=\"limits.multiple\" [accept]=\"accept\"\n [disabled]=\"disabled\" (change)=\"onSelect($event)\" [attr.aria-label]=\"ariaLabel\"\n [attr.aria-describedby]=\"componentId + '-limits'\" />\n <i-button icon=\"pi pi-plus\" [outlined]=\"true\" [disabled]=\"disabled\" [ariaLabel]=\"ariaLabel\"\n (clicked)=\"fileInput.click()\">{{ chooseLabel }}</i-button>\n <small [id]=\"componentId + '-limits'\" class=\"i-file-upload__description\">{{ limitsLabel }}</small>\n @if (accept) {\n <small class=\"i-file-upload__description\">Accepted types: {{ accept }}</small>\n }\n </div>\n @if (error) {\n <i-message severity=\"danger\" role=\"alert\">{{ error.message }}</i-message>\n }\n <div class=\"i-file-upload__list\" aria-live=\"polite\" aria-relevant=\"additions removals text\">\n @if (files.length) {\n <strong>{{ files.length }} file{{ files.length === 1 ? '' : 's' }} selected</strong>\n @for (file of files; track $index) {\n <div class=\"i-file-upload__row\">\n <i [class]=\"fileIcon\" aria-hidden=\"true\"></i>\n <span class=\"i-file-upload__name\" [title]=\"file.name\">{{ file.name }}</span>\n <small class=\"i-file-upload__description\">{{ formatSize(file.size) }}</small>\n <i-button icon=\"pi pi-times\" [text]=\"true\" size=\"small\" [ariaLabel]=\"'Remove ' + file.name\"\n [disabled]=\"disabled\" (clicked)=\"remove($index)\" />\n </div>\n }\n }\n </div>\n</div>\n", styles: [".i-file-upload{color:var(--color-text-primary)}.i-file-upload__drop-zone{border-color:var(--surface-border);background:var(--color-component-background)}.i-file-upload__drop-zone--active,.i-file-upload__drop-zone:focus-within{border-color:var(--color-primary);background:var(--surface-hover)}.i-file-upload__icon,.i-file-upload__row>i{color:var(--color-primary)}.i-file-upload__description{color:var(--color-text-secondary)}.i-file-upload__row{border-color:var(--surface-border)}.i-file-upload--disabled .i-file-upload__drop-zone{background:var(--color-disabled-background);border-color:var(--color-disabled-border)}:host{display:block}.i-file-upload{display:flex;flex-direction:column;gap:1rem}.i-file-upload__drop-zone{display:flex;flex-direction:column;align-items:center;gap:.75rem;padding:1.5rem 1rem;text-align:center;border:2px dashed;border-radius:8px;transition:border-color .2s,background .2s}.i-file-upload__icon{font-size:2rem}.i-file-upload--disabled .i-file-upload__drop-zone{opacity:.65}.i-file-upload__list{display:flex;flex-direction:column;gap:.5rem}.i-file-upload__row{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-bottom:1px solid}.i-file-upload__row small{white-space:nowrap}.i-file-upload__name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
3215
+ }], propDecorators: { files: [{
3216
+ type: Input
3217
+ }], options: [{
3218
+ type: Input
3219
+ }], disabled: [{
3220
+ type: Input
3221
+ }], dropLabel: [{
3222
+ type: Input
3223
+ }], description: [{
3224
+ type: Input
3225
+ }], chooseLabel: [{
3226
+ type: Input
3227
+ }], ariaLabel: [{
3228
+ type: Input
3229
+ }], uploadIcon: [{
3230
+ type: Input
3231
+ }], fileIcon: [{
3232
+ type: Input
3233
+ }], filesChange: [{
3234
+ type: Output
3235
+ }], validationError: [{
3236
+ type: Output
3237
+ }] } });
3238
+
3006
3239
  /**
3007
3240
  * Textarea Component
3008
3241
  *
@@ -4813,81 +5046,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
4813
5046
  type: Output
4814
5047
  }] } });
4815
5048
 
4816
- class IMessage {
4817
- /**
4818
- * Severity type of the message
4819
- * @default 'info'
4820
- */
4821
- severity = 'info';
4822
- /**
4823
- * Size of the message
4824
- * @default 'medium'
4825
- */
4826
- size = 'medium';
4827
- /**
4828
- * Icon to display (Material Icons)
4829
- * If not provided, default icons based on severity will be used
4830
- */
4831
- icon;
4832
- /**
4833
- * Whether the message can be closed
4834
- * @default false
4835
- */
4836
- closable = false;
4837
- /**
4838
- * Whether the message is visible
4839
- * @default true
4840
- */
4841
- visible = true;
4842
- /**
4843
- * Event emitted when visible changes (for two-way binding)
4844
- */
4845
- visibleChange = new EventEmitter();
4846
- /**
4847
- * Get the default icon based on severity
4848
- */
4849
- getDefaultIcon() {
4850
- if (this.icon)
4851
- return this.icon;
4852
- const iconMap = {
4853
- success: 'pi pi-check-circle',
4854
- info: 'pi pi-lightbulb',
4855
- warning: 'pi pi-exclamation-triangle',
4856
- danger: 'pi pi-times-circle',
4857
- primary: 'pi pi-info-circle',
4858
- secondary: 'pi pi-info-circle',
4859
- tertiary: 'pi pi-info-circle',
4860
- contrast: 'pi pi-info-circle',
4861
- };
4862
- return iconMap[this.severity] || 'pi pi-info-circle';
4863
- }
4864
- /**
4865
- * Close the message
4866
- */
4867
- close() {
4868
- this.visible = false;
4869
- this.visibleChange.emit(this.visible);
4870
- }
4871
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: IMessage, deps: [], target: i0.ɵɵFactoryTarget.Component });
4872
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: IMessage, isStandalone: true, selector: "i-message", inputs: { severity: "severity", size: "size", icon: "icon", closable: "closable", visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "@if (visible) {\n <div\n class=\"i-message i-message-{{ severity }} i-message--{{ size }}\"\n role=\"alert\"\n >\n <div class=\"i-message-content\">\n <div class=\"i-message-icon\">\n <i [class]=\"getDefaultIcon()\"></i>\n </div>\n <div class=\"i-message-text\">\n <ng-content></ng-content>\n </div>\n @if (closable) {\n <button\n class=\"i-message-close\"\n type=\"button\"\n (click)=\"close()\"\n aria-label=\"Close\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n}\n", styles: [".i-message{background-color:var(--surface-section);border-left:4px solid transparent}.i-message .i-message-text{color:var(--color-text-primary)}.i-message .i-message-close{color:var(--color-text-secondary)}.i-message .i-message-close:hover{color:var(--color-text-primary);background-color:var(--surface-hover)}.i-message.i-message-success{border-left-color:var(--color-success)}.i-message.i-message-success .i-message-icon{color:var(--color-success)}.i-message.i-message-info{border-left-color:var(--color-info)}.i-message.i-message-info .i-message-icon{color:var(--color-info)}.i-message.i-message-warning{border-left-color:var(--color-warning)}.i-message.i-message-warning .i-message-icon{color:var(--color-warning)}.i-message.i-message-danger{border-left-color:var(--color-danger)}.i-message.i-message-danger .i-message-icon{color:var(--color-danger)}.i-message.i-message-primary{border-left-color:var(--color-primary)}.i-message.i-message-primary .i-message-icon{color:var(--color-primary)}.i-message.i-message-secondary{border-left-color:var(--color-secondary)}.i-message.i-message-secondary .i-message-icon{color:var(--color-secondary)}.i-message.i-message-tertiary{border-left-color:var(--color-text-tertiary)}.i-message.i-message-tertiary .i-message-icon{color:var(--color-text-tertiary)}.i-message.i-message-contrast{border-left-color:var(--color-contrast)}.i-message.i-message-contrast .i-message-icon{color:var(--color-contrast)}.i-message{display:flex;align-items:flex-start;border-radius:8px;margin-bottom:16px}.i-message:last-child{margin-bottom:0}.i-message--small .i-message-content{gap:8px;padding:8px 12px}.i-message--small .i-message-content .i-message-icon i{font-size:14px}.i-message--small .i-message-content .i-message-text{font-size:.95em}.i-message--small .i-message-content .i-message-close{padding:2px}.i-message--small .i-message-content .i-message-close i{font-size:10px}.i-message--medium .i-message-content{gap:12px;padding:16px}.i-message--medium .i-message-content .i-message-icon i{font-size:18px}.i-message--medium .i-message-content .i-message-text{font-size:1em}.i-message--medium .i-message-content .i-message-close i{font-size:12px}.i-message--large .i-message-content{gap:16px;padding:20px 24px}.i-message--large .i-message-content .i-message-icon i{font-size:24px}.i-message--large .i-message-content .i-message-text{font-size:1.1em}.i-message--large .i-message-content .i-message-close{padding:6px}.i-message--large .i-message-content .i-message-close i{font-size:14px}.i-message .i-message-content{display:flex;align-items:flex-start;width:100%}.i-message .i-message-content .i-message-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}.i-message .i-message-content .i-message-text{flex:1;line-height:1.5;min-width:0;word-wrap:break-word}.i-message .i-message-content .i-message-close{background:none;border:none;cursor:pointer;padding:4px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;transition:background-color .2s,color .2s}\n"] });
4873
- }
4874
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: IMessage, decorators: [{
4875
- type: Component,
4876
- args: [{ selector: 'i-message', imports: [], template: "@if (visible) {\n <div\n class=\"i-message i-message-{{ severity }} i-message--{{ size }}\"\n role=\"alert\"\n >\n <div class=\"i-message-content\">\n <div class=\"i-message-icon\">\n <i [class]=\"getDefaultIcon()\"></i>\n </div>\n <div class=\"i-message-text\">\n <ng-content></ng-content>\n </div>\n @if (closable) {\n <button\n class=\"i-message-close\"\n type=\"button\"\n (click)=\"close()\"\n aria-label=\"Close\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </div>\n </div>\n}\n", styles: [".i-message{background-color:var(--surface-section);border-left:4px solid transparent}.i-message .i-message-text{color:var(--color-text-primary)}.i-message .i-message-close{color:var(--color-text-secondary)}.i-message .i-message-close:hover{color:var(--color-text-primary);background-color:var(--surface-hover)}.i-message.i-message-success{border-left-color:var(--color-success)}.i-message.i-message-success .i-message-icon{color:var(--color-success)}.i-message.i-message-info{border-left-color:var(--color-info)}.i-message.i-message-info .i-message-icon{color:var(--color-info)}.i-message.i-message-warning{border-left-color:var(--color-warning)}.i-message.i-message-warning .i-message-icon{color:var(--color-warning)}.i-message.i-message-danger{border-left-color:var(--color-danger)}.i-message.i-message-danger .i-message-icon{color:var(--color-danger)}.i-message.i-message-primary{border-left-color:var(--color-primary)}.i-message.i-message-primary .i-message-icon{color:var(--color-primary)}.i-message.i-message-secondary{border-left-color:var(--color-secondary)}.i-message.i-message-secondary .i-message-icon{color:var(--color-secondary)}.i-message.i-message-tertiary{border-left-color:var(--color-text-tertiary)}.i-message.i-message-tertiary .i-message-icon{color:var(--color-text-tertiary)}.i-message.i-message-contrast{border-left-color:var(--color-contrast)}.i-message.i-message-contrast .i-message-icon{color:var(--color-contrast)}.i-message{display:flex;align-items:flex-start;border-radius:8px;margin-bottom:16px}.i-message:last-child{margin-bottom:0}.i-message--small .i-message-content{gap:8px;padding:8px 12px}.i-message--small .i-message-content .i-message-icon i{font-size:14px}.i-message--small .i-message-content .i-message-text{font-size:.95em}.i-message--small .i-message-content .i-message-close{padding:2px}.i-message--small .i-message-content .i-message-close i{font-size:10px}.i-message--medium .i-message-content{gap:12px;padding:16px}.i-message--medium .i-message-content .i-message-icon i{font-size:18px}.i-message--medium .i-message-content .i-message-text{font-size:1em}.i-message--medium .i-message-content .i-message-close i{font-size:12px}.i-message--large .i-message-content{gap:16px;padding:20px 24px}.i-message--large .i-message-content .i-message-icon i{font-size:24px}.i-message--large .i-message-content .i-message-text{font-size:1.1em}.i-message--large .i-message-content .i-message-close{padding:6px}.i-message--large .i-message-content .i-message-close i{font-size:14px}.i-message .i-message-content{display:flex;align-items:flex-start;width:100%}.i-message .i-message-content .i-message-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}.i-message .i-message-content .i-message-text{flex:1;line-height:1.5;min-width:0;word-wrap:break-word}.i-message .i-message-content .i-message-close{background:none;border:none;cursor:pointer;padding:4px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;transition:background-color .2s,color .2s}\n"] }]
4877
- }], propDecorators: { severity: [{
4878
- type: Input
4879
- }], size: [{
4880
- type: Input
4881
- }], icon: [{
4882
- type: Input
4883
- }], closable: [{
4884
- type: Input
4885
- }], visible: [{
4886
- type: Input
4887
- }], visibleChange: [{
4888
- type: Output
4889
- }] } });
4890
-
4891
5049
  /**
4892
5050
  * Multi-Select Component
4893
5051
  *
@@ -10465,5 +10623,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
10465
10623
  * Generated bundle index. Do not edit.
10466
10624
  */
10467
10625
 
10468
- export { AbstractDialog, CLAIMS_CHECKER, ConfirmationDialogComponent, ConfirmationDialogService, DataUpdateEventService, DialogService, EmptyStateComponent, IAccordion, IAccordionList, IButton, ICalendar, ICard, IChart, ICheckbox, IChip, IChipsComponent, IDialog, IDialogActions, IDialogBase, IDivider, IFieldPicker, IInputText, IListbox, IMessage, IMultiSelect, IOrderedList, IOverlayPanel, IPanel, IPlaceholder, IProgressSpinner, IRadioButton, IRuleEditor, ISelect, IStep, IStepper, ITabPanel, ITable, ITabs, ITag, ITextarea, IToggle, ITreeView, IWhisper, LayoutComponent, LayoutService, LocalStorageColorSchemeKey, MenuComponent, NoContentComponent, SeoService, SidebarComponent, StructuredDataService, TooltipComponent, TooltipDirective, TopbarComponent, UniqueComponentId, WhisperService, ZIndexUtils, lastId, provideMenuClaimsChecker };
10626
+ export { AbstractDialog, CLAIMS_CHECKER, ConfirmationDialogComponent, ConfirmationDialogService, DataUpdateEventService, DialogService, EmptyStateComponent, IAccordion, IAccordionList, IButton, ICalendar, ICard, IChart, ICheckbox, IChip, IChipsComponent, IDialog, IDialogActions, IDialogBase, IDivider, IFieldPicker, IFileUpload, IInputText, IListbox, IMessage, IMultiSelect, IOrderedList, IOverlayPanel, IPanel, IPlaceholder, IProgressSpinner, IRadioButton, IRuleEditor, ISelect, IStep, IStepper, ITabPanel, ITable, ITabs, ITag, ITextarea, IToggle, ITreeView, IWhisper, LayoutComponent, LayoutService, LocalStorageColorSchemeKey, MenuComponent, NoContentComponent, SeoService, SidebarComponent, StructuredDataService, TooltipComponent, TooltipDirective, TopbarComponent, UniqueComponentId, WhisperService, ZIndexUtils, lastId, provideMenuClaimsChecker };
10469
10627
  //# sourceMappingURL=invensys-ng.mjs.map