@acorex/core 22.2.8 → 22.2.10
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/acorex-core-file.mjs +10 -3
- package/fesm2022/acorex-core-file.mjs.map +1 -1
- package/fesm2022/acorex-core-full-screen.mjs +210 -55
- package/fesm2022/acorex-core-full-screen.mjs.map +1 -1
- package/i18n/en-AU/acorex.json +14 -3
- package/i18n/en-US/acorex.json +14 -3
- package/i18n/fa-IR/acorex.json +14 -3
- package/package.json +1 -1
- package/types/acorex-core-file.d.ts +1 -0
- package/types/acorex-core-full-screen.d.ts +62 -18
|
@@ -662,19 +662,26 @@ class AXFileTypeRendererOutletComponent {
|
|
|
662
662
|
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
663
663
|
this.mergedInputs = signal({}, /* @ts-ignore */
|
|
664
664
|
...(ngDevMode ? [{ debugName: "mergedInputs" }] : /* istanbul ignore next */ []));
|
|
665
|
+
this.loadId = 0;
|
|
665
666
|
effect(() => {
|
|
666
667
|
const name = this.fileType();
|
|
667
|
-
const payload = this.payload();
|
|
668
668
|
const hint = this.extensionHint();
|
|
669
|
-
const
|
|
670
|
-
this.mergedInputs.set({ payload, ...extra });
|
|
669
|
+
const id = ++this.loadId;
|
|
671
670
|
this.loading.set(true);
|
|
672
671
|
this.resolvedComponent.set(null);
|
|
673
672
|
void this.registry.loadComponent(name, hint).then((component) => {
|
|
673
|
+
if (id !== this.loadId)
|
|
674
|
+
return;
|
|
674
675
|
this.resolvedComponent.set(component ?? null);
|
|
675
676
|
this.loading.set(false);
|
|
676
677
|
});
|
|
677
678
|
});
|
|
679
|
+
effect(() => {
|
|
680
|
+
this.mergedInputs.set({
|
|
681
|
+
payload: this.payload(),
|
|
682
|
+
...this.inputs(),
|
|
683
|
+
});
|
|
684
|
+
});
|
|
678
685
|
}
|
|
679
686
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileTypeRendererOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
680
687
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXFileTypeRendererOutletComponent, isStandalone: true, selector: "ax-file-type-renderer", inputs: { fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: true, transformFunction: null }, payload: { classPropertyName: "payload", publicName: "payload", isSignal: true, isRequired: true, transformFunction: null }, extensionHint: { classPropertyName: "extensionHint", publicName: "extensionHint", isSignal: true, isRequired: false, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-core-file.mjs","sources":["../../../../packages/core/file/src/lib/file-size-formatter.ts","../../../../packages/core/file/src/lib/format-file-size.ts","../../../../packages/core/file/src/lib/file-type/file-type.models.ts","../../../../packages/core/file/src/lib/file-type/file-type.metadata.ts","../../../../packages/core/file/src/lib/file-type/file-type.copy.ts","../../../../packages/core/file/src/lib/file-type/file-type.merge.ts","../../../../packages/core/file/src/lib/file-type/file-type.renderer.ts","../../../../packages/core/file/src/lib/file-type/file-type.resolve.ts","../../../../packages/core/file/src/lib/file-type/file-type.open.ts","../../../../packages/core/file/src/lib/file-type/file-type.define.ts","../../../../packages/core/file/src/lib/file-type/file-type-info-provider.ts","../../../../packages/core/file/src/lib/file-type/file-type.providers.ts","../../../../packages/core/file/src/lib/file-type/file-type.validate.ts","../../../../packages/core/file/src/lib/file-type/rules/file-max-size.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-mime-type.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-min-size.rule.ts","../../../../packages/core/file/src/lib/file-type/file-validation-rules.bootstrap.ts","../../../../packages/core/file/src/lib/file-type/file-type-registry.service.ts","../../../../packages/core/file/src/lib/file-type/file-type-renderer-outlet.component.ts","../../../../packages/core/file/src/lib/file-type/types.providers/audio-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/document-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/file-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/image-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/video-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/index.ts","../../../../packages/core/file/src/lib/file-type/index.ts","../../../../packages/core/file/src/lib/file.module.ts","../../../../packages/core/file/src/lib/file.service.ts","../../../../packages/core/file/src/acorex-core-file.ts"],"sourcesContent":["import { AXFormatOptions, AXFormatter } from '@acorex/core/format';\nimport { Injectable } from '@angular/core';\n\nexport interface AXFileSizeFormatterOptions extends AXFormatOptions {\n format: string;\n}\n\ndeclare module '@acorex/core/format' {\n interface AXFormatOptionsMap {\n filesize: AXFileSizeFormatterOptions;\n }\n}\n\n@Injectable()\nexport class AXFileSizeFormatter implements AXFormatter {\n /**\n * Gets the name of the formatter.\n *\n * @returns string - The formatter name 'filesize'\n */\n\n get name(): string {\n return 'filesize';\n }\n\n /**\n * Formats a file size value to human-readable format.\n *\n * @param value - The file size in bytes\n * @returns string - The formatted file size string (e.g., '1.5 MB')\n */\n\n format(value: number): string {\n const size = Number(value);\n\n if (size === 0) return '0 Bytes';\n if (Number.isNaN(size)) return 'Unknown';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(size) / Math.log(k));\n\n return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n}\n","/** Human-readable file size (binary units, e.g. `41.5 MB`). */\nexport function formatFileSizeBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return '0 B';\n }\n if (bytes === 0) {\n return '0 B';\n }\n\n const k = 1024;\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), units.length - 1);\n const value = bytes / Math.pow(k, i);\n\n if (i === 0) {\n return `${bytes} B`;\n }\n\n const digits = value >= 100 ? 0 : value >= 10 ? 1 : 2;\n return `${value.toFixed(digits)} ${units[i]}`;\n}\n","import type { AXValidationRuleOptions } from '@acorex/core/validation';\nimport type { AXFileTypeContext, AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport type { AXFileOpenResult } from './file-type.open';\nimport type { AXFileTypeComponent } from './file-type.renderer';\n\n/** Metadata key for catalog usage context. */\nexport const AX_FILE_TYPE_METADATA_PURPOSE = 'purpose' as const;\n\n/** Catalog metadata bag; `purpose` lists usage contexts (e.g. `['system']`). */\nexport type AXFileTypeMetadata = Record<string, unknown> & {\n [AX_FILE_TYPE_METADATA_PURPOSE]?: string[];\n};\n\n/** Filter catalog entries by {@link AX_FILE_TYPE_METADATA_PURPOSE}. */\nexport interface AXFileTypeQuery {\n purpose?: string | string[];\n}\n\n/** Generic rule executed via {@link AXValidationService}. */\nexport interface AXFileValidationRule {\n rule: string;\n options?: AXValidationRuleOptions;\n}\n\n/**\n * Common file constraints shared by {@link AXFileType} and {@link AXFileTypeExtension}.\n * Extension `validations` override the parent type field-by-field when merged.\n */\nexport interface AXFileValidations {\n mimeTypes?: string[];\n minSize?: number;\n maxSize?: number;\n rules?: AXFileValidationRule[];\n}\n\ntype AXFileTypeUtilities = Record<\n string,\n (ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\n>;\n\n/**\n * Logical file category (image, video, …).\n *\n * - With type `validations` set: any file matching those rules is allowed; `extensions` only override when matched.\n * - With empty / omitted `validations` and `extensions` listed: only those extensions are allowed.\n */\nexport interface AXFileType<T extends AXFileTypeUtilities = AXFileTypeUtilities> {\n name: string;\n title?: string;\n icon?: string;\n metadata?: AXFileTypeMetadata;\n validations?: AXFileValidations;\n extensions?: AXFileTypeExtension<T>[];\n /** Dynamic utility functions available for this file type. */\n utilities?: T;\n paste?: () => Promise<unknown>;\n /**\n * Produce copyable content from a payload (does not write to the clipboard).\n * Returns a plain string or {@link AXFileCopyData} with `text` and optional `meta`.\n */\n copy?: (payload: unknown) => Promise<AXFileCopyResult> | AXFileCopyResult;\n /**\n * Open or preview a payload (e.g. navigate, show a dialog).\n * Invoke via {@link runFileTypeOpen} so `inject()` works in the caller's context.\n */\n open?: (\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\n /** Optional view component (eager class or lazy `() => import(...)`) for this file type's payload. */\n component?: AXFileTypeComponent;\n}\n\n/** Extension entry — {@link AXFileType} without nested `extensions`. */\nexport type AXFileTypeExtension<T extends AXFileTypeUtilities = AXFileTypeUtilities> = Omit<\n AXFileType<T>,\n 'extensions'\n>;\n","import type { AXFileType } from './file-type.models';\nimport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nexport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nconst CONVERSATION_NAME_PREFIX = 'conversation-';\n\nexport function getFileTypePurposes(type: AXFileType): string[] {\n const raw = type.metadata?.[AX_FILE_TYPE_METADATA_PURPOSE];\n if (Array.isArray(raw)) {\n const values = raw.filter((entry): entry is string => typeof entry === 'string' && entry.trim().length > 0);\n if (values.length) {\n return values;\n }\n }\n if (type.name.startsWith(CONVERSATION_NAME_PREFIX)) {\n return ['conversation'];\n }\n return ['system'];\n}\n\nexport function fileTypeMatchesPurpose(type: AXFileType, purpose: string | string[]): boolean {\n const allowed = Array.isArray(purpose) ? purpose : [purpose];\n return getFileTypePurposes(type).some((entry) => allowed.includes(entry));\n}\n\nexport function filterFileTypesByPurpose(types: AXFileType[], purpose?: string | string[]): AXFileType[] {\n if (!purpose) {\n return types;\n }\n return types.filter((type) => fileTypeMatchesPurpose(type, purpose));\n}\n\nexport function createFileTypeMetadata(purpose: string | string[]): NonNullable<AXFileType['metadata']> {\n const values = (Array.isArray(purpose) ? purpose : [purpose]).filter(\n (entry): entry is string => typeof entry === 'string' && entry.trim().length > 0,\n );\n return { [AX_FILE_TYPE_METADATA_PURPOSE]: values };\n}\n","/** Structured copy payload from {@link AXFileType.copy}. */\nexport interface AXFileCopyData {\n /** Primary plain-text value for clipboard or previews. */\n text: string;\n /** Optional type-specific metadata for consumers (URLs, names, mime types, …). */\n meta?: Record<string, unknown>;\n}\n\n/** Return value of {@link AXFileType.copy} — shorthand string or structured data. */\nexport type AXFileCopyResult = string | AXFileCopyData | null | undefined;\n\n/** Resolves clipboard/plain text from a copy result. */\nexport function resolveFileCopyText(result: AXFileCopyResult): string | null {\n if (result == null) {\n return null;\n }\n if (typeof result === 'string') {\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n const trimmed = result.text?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n}\n","import type { AXFileType, AXFileTypeExtension, AXFileValidations } from './file-type.models';\n\n/** Merges type-level validations with extension overrides (extension wins per field). */\nexport function mergeFileValidations(\n base: AXFileValidations,\n override?: Partial<AXFileValidations>,\n): AXFileValidations {\n if (!override) {\n return { ...base };\n }\n\n return {\n mimeTypes: override.mimeTypes ?? base.mimeTypes,\n minSize: override.minSize ?? base.minSize,\n maxSize: override.maxSize ?? base.maxSize,\n rules: override.rules ?? base.rules,\n };\n}\n\n/** Resolved validations for a type + optional extension entry. */\nexport function resolveFileValidations(type: AXFileType, extension?: AXFileTypeExtension): AXFileValidations {\n return mergeFileValidations(type.validations ?? {}, extension?.validations);\n}\n\n/** True when no mime/size/rules are defined on the type. */\nexport function isEmptyFileValidations(validations?: AXFileValidations): boolean {\n if (!validations) {\n return true;\n }\n return (\n (validations.mimeTypes?.length ?? 0) === 0 &&\n validations.minSize == null &&\n validations.maxSize == null &&\n (validations.rules?.length ?? 0) === 0\n );\n}\n\n/**\n * Extension-only mode: empty type `validations` and a non-empty `extensions` list.\n * Files must match a listed extension; rules come from that extension entry.\n */\nexport function isExtensionsOnlyType(type: AXFileType): boolean {\n return isEmptyFileValidations(type.validations) && (type.extensions?.length ?? 0) > 0;\n}\n\n/** File extension from name (lowercase, no dot). */\nexport function getFileExtension(fileName: string): string {\n const parts = fileName.trim().split('.');\n return parts.length > 1 ? (parts.pop()?.toLowerCase() ?? '') : '';\n}\n","import type { InputSignal, Signal, Type } from '@angular/core';\n\n/**\n * View component for a file type — either an Angular component class or a lazy loader.\n *\n * @example\n * ```ts\n * // eager\n * component: ImageViewerComponent,\n *\n * // lazy\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\n * ```\n */\nexport type AXFileTypeComponent =\n | Type<AXFileTypeViewComponent>\n | (() => Promise<Type<AXFileTypeViewComponent>>);\n\n/**\n * Recommended contract for file-type view components.\n * Implement `readonly payload = input.required<TPayload>()` in new components.\n */\nexport interface AXFileTypeViewComponent<TPayload = unknown> {\n readonly payload: InputSignal<TPayload> | Signal<TPayload>;\n}\n\n/** Resolves a {@link AXFileTypeComponent} to an Angular component type. */\nexport async function resolveFileTypeComponentType(\n component: AXFileTypeComponent,\n): Promise<Type<unknown>> {\n if (isLazyFileTypeComponentLoader(component)) {\n return component();\n }\n return component;\n}\n\n/** Whether `value` is a lazy loader rather than an Angular component class. */\nexport function isLazyFileTypeComponentLoader(\n value: AXFileTypeComponent,\n): value is () => Promise<Type<AXFileTypeViewComponent>> {\n return typeof value === 'function' && !('ɵcmp' in value);\n}\n","import type { Type } from '@angular/core';\n\nimport type { AXFileTypeContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport { getFileExtension } from './file-type.merge';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport type { AXFileTypeComponent } from './file-type.renderer';\nimport { resolveFileTypeComponentType } from './file-type.renderer';\n\n/** Hint for resolving a catalog extension entry. */\nexport interface AXFileTypeExtensionHint {\n file?: File;\n extensionName?: string;\n mimeType?: string;\n}\n\n/** Matches a MIME type against a catalog pattern (`image/*`, exact type, …). */\nexport function matchesFileMime(mime: string, pattern: string): boolean {\n const normalizedMime = mime.trim().toLowerCase();\n const normalizedPattern = pattern.trim().toLowerCase();\n\n if (!normalizedPattern || normalizedPattern === '*/*' || normalizedPattern === '*') {\n return true;\n }\n\n if (normalizedPattern.endsWith('/*')) {\n const category = normalizedPattern.slice(0, -2);\n return normalizedMime.startsWith(`${category}/`) || (normalizedMime === '' && category === 'application');\n }\n\n return normalizedMime === normalizedPattern;\n}\n\n/** Finds an extension entry by its `name` (without dot). */\nexport function findFileTypeExtensionByName(\n type: AXFileType,\n extensionName: string,\n): AXFileTypeExtension | undefined {\n const ext = extensionName.replace(/^\\./, '').trim().toLowerCase();\n if (!ext || !type.extensions?.length) {\n return undefined;\n }\n return type.extensions.find((entry) => entry.name.toLowerCase() === ext);\n}\n\n/** Finds an extension entry whose validations include the given MIME type. */\nexport function findFileTypeExtensionForMime(\n type: AXFileType,\n mimeType: string,\n): AXFileTypeExtension | undefined {\n const mime = mimeType.trim().toLowerCase();\n if (!mime || !type.extensions?.length) {\n return undefined;\n }\n\n return type.extensions.find((entry) =>\n entry.validations?.mimeTypes?.some((pattern) => matchesFileMime(mime, pattern)),\n );\n}\n\n/** Matching extension entry for a file within a type, if any. */\nexport function findFileTypeExtension(file: File, type: AXFileType): AXFileTypeExtension | undefined {\n return resolveFileTypeExtension(type, { file });\n}\n\n/** Resolves the best-matching extension entry for a file or hint. */\nexport function resolveFileTypeExtension(\n type: AXFileType,\n hint?: AXFileTypeExtensionHint,\n): AXFileTypeExtension | undefined {\n if (!hint) {\n return undefined;\n }\n\n if (hint.file) {\n const byFileName = findFileTypeExtensionByName(type, getFileExtension(hint.file.name));\n if (byFileName) {\n return byFileName;\n }\n if (hint.file.type) {\n const byFileMime = findFileTypeExtensionForMime(type, hint.file.type);\n if (byFileMime) {\n return byFileMime;\n }\n }\n }\n\n if (hint.extensionName) {\n const byName = findFileTypeExtensionByName(type, hint.extensionName);\n if (byName) {\n return byName;\n }\n }\n\n if (hint.mimeType) {\n return findFileTypeExtensionForMime(type, hint.mimeType);\n }\n\n return undefined;\n}\n\nexport function resolveFileTypeCopy(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['copy'] | undefined {\n return extension?.copy ?? type.copy;\n}\n\nexport function resolveFileTypeOpen(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['open'] | undefined {\n return extension?.open ?? type.open;\n}\n\nexport function resolveFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['component'] | undefined {\n return extension?.component ?? type.component;\n}\n\n/** Loads the resolved view component (extension override first). */\nexport async function loadFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<Type<unknown> | undefined> {\n const component = resolveFileTypeComponent(type, extension);\n if (!component) {\n return undefined;\n }\n return resolveFileTypeComponentType(component);\n}\n\nexport function resolveFileTypePaste(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['paste'] | undefined {\n return extension?.paste ?? type.paste;\n}\n\nexport function resolveFileTypeUtility(\n type: AXFileType,\n extension: AXFileTypeExtension | undefined,\n name: string,\n): ((ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown) | undefined {\n const fromExtension = extension?.utilities?.[name];\n if (fromExtension) {\n return fromExtension;\n }\n return type.utilities?.[name];\n}\n\n/** Runs `copy` from extension first, then parent type. */\nexport async function runFileTypeCopy(\n type: AXFileType,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileCopyResult> {\n const copy = resolveFileTypeCopy(type, extension);\n if (!copy) {\n return undefined;\n }\n return copy(payload);\n}\n\n/** Runs a utility from extension first, then parent type. */\nexport function runFileTypeUtility(\n type: AXFileType,\n ctx: AXFileTypeContext,\n extension: AXFileTypeExtension | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const utility = resolveFileTypeUtility(type, extension, name);\n if (!utility) {\n return undefined;\n }\n return utility(ctx, ...args);\n}\n\n/** Runs a catalog utility with optional file-based extension resolution. */\nexport function runFileTypeUtilityForFile(\n type: AXFileType,\n ctx: AXFileTypeContext,\n file: File | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const extension = file ? findFileTypeExtension(file, type) : undefined;\n return runFileTypeUtility(type, ctx, extension, name, file, ...args);\n}\n","import { runInInjectionContext } from '@angular/core';\n\nimport type { AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport { resolveFileTypeOpen } from './file-type.resolve';\n\n/** Result of {@link AXFileType.open}; `false` means the payload was not opened. */\nexport type AXFileOpenResult = void | boolean | null | undefined;\n\n/** Runs `open` from extension first, then parent type, in the caller's injection context. */\nexport function runFileTypeOpen(\n type: AXFileType,\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileOpenResult> | AXFileOpenResult {\n const open = resolveFileTypeOpen(type, extension);\n if (!open) {\n return false;\n }\n return runInInjectionContext(ctx.injector, () => open(ctx, payload));\n}\n","import type { Type } from '@angular/core';\r\r\n\r\r\nimport type { AXFileCopyResult } from './file-type.copy';\r\r\nimport type { AXFileType, AXFileTypeExtension, AXFileValidations, AXFileTypeMetadata } from './file-type.models';\r\r\nimport type { AXFileOpenResult } from './file-type.open';\r\r\nimport type { AXFileTypeOpenContext } from './file-type.context';\r\r\nimport type { AXFileTypeComponent } from './file-type.renderer';\r\r\n\r\r\ntype AXFileTypeUtilities = Record<\r\r\n string,\r\r\n (ctx: import('./file-type.context').AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\r\r\n>;\r\r\n\r\r\n/** Config for {@link defineFileType}. */\r\r\nexport interface DefineFileTypeConfig<\r\r\n TPayload = unknown,\r\r\n TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities,\r\r\n> {\r\r\n name: string;\r\r\n title?: string;\r\r\n icon?: string;\r\r\n metadata?: AXFileTypeMetadata;\r\r\n validations?: AXFileValidations;\r\r\n extensions?: AXFileTypeExtension<TUtilities>[];\r\r\n utilities?: TUtilities;\r\r\n paste?: AXFileType<TUtilities>['paste'];\r\r\n copy?: (payload: TPayload) => Promise<AXFileCopyResult> | AXFileCopyResult;\r\r\n open?: (\r\r\n ctx: AXFileTypeOpenContext,\r\r\n payload: TPayload,\r\r\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\r\r\n /** Eager component class or lazy `() => import(...).then(m => m.Component)`. */\r\r\n component?: AXFileTypeComponent;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Builds an {@link AXFileType} with optional typed handlers and view component.\r\r\n *\r\r\n * @example\r\r\n * ```ts\r\r\n * export const imageFileType = defineFileType<ImagePayload>({\r\r\n * name: 'image',\r\r\n * copy: (p) => p.caption ?? p.url,\r\r\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\r\r\n * });\r\r\n * ```\r\r\n */\r\r\nexport function defineFileType<TPayload = unknown, TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities>(\r\r\n config: DefineFileTypeConfig<TPayload, TUtilities>,\r\r\n): AXFileType<TUtilities> {\r\r\n const { copy, open, ...rest } = config;\r\r\n\r\r\n return {\r\r\n ...rest,\r\r\n ...(copy ? { copy: copy as AXFileType<TUtilities>['copy'] } : {}),\r\r\n ...(open ? { open: open as AXFileType<TUtilities>['open'] } : {}),\r\r\n };\r\r\n}\r\r\n\r","import { InjectionToken, Provider, Type } from '@angular/core';\nimport type { AXFileType } from './file-type.models';\n\n/** Contributes {@link AXFileType} entries (multi provider). */\nexport abstract class AXFileTypeInfoProvider {\n abstract items(): Promise<AXFileType[]>;\n}\n\nexport const AX_FILE_TYPE_INFO_PROVIDER = new InjectionToken<AXFileTypeInfoProvider[]>('AX_FILE_TYPE_INFO_PROVIDER');\n\nexport function provideFileTypeInfoProvider(provider: Type<AXFileTypeInfoProvider>): Provider {\n return {\n provide: AX_FILE_TYPE_INFO_PROVIDER,\n useClass: provider,\n multi: true,\n };\n}\n","import { Injectable, Provider } from '@angular/core';\n\nimport type { AXFileType } from './file-type.models';\nimport { AXFileTypeInfoProvider, provideFileTypeInfoProvider } from './file-type-info-provider';\n\n/** Registers static file types via the existing {@link AXFileTypeInfoProvider} multi-token. */\nexport function provideFileTypes(types: AXFileType[] | (() => AXFileType[] | Promise<AXFileType[]>)): Provider {\n @Injectable()\n class AXStaticFileTypeProvider extends AXFileTypeInfoProvider {\n override items(): Promise<AXFileType[]> {\n const value = typeof types === 'function' ? types() : types;\n return Promise.resolve(value);\n }\n }\n\n return provideFileTypeInfoProvider(AXStaticFileTypeProvider);\n}\n","import { AXValidationService, type AXValidationRuleResult } from '@acorex/core/validation';\nimport {\n getFileExtension,\n isExtensionsOnlyType,\n resolveFileValidations,\n} from './file-type.merge';\nimport { findFileTypeExtension } from './file-type.resolve';\nimport type { AXFileType, AXFileTypeExtension, AXFileValidationRule, AXFileValidations } from './file-type.models';\n\n/** Maps {@link AXFileValidations} to executable validation entries. */\nexport function fileValidationsToRules(validations: AXFileValidations): AXFileValidationRule[] {\n const rules: AXFileValidationRule[] = [];\n\n if (validations.mimeTypes?.length) {\n rules.push({\n rule: 'fileMimeType',\n options: { allowed: validations.mimeTypes },\n });\n }\n\n if (validations.minSize != null) {\n rules.push({\n rule: 'fileMinSize',\n options: { minSize: validations.minSize },\n });\n }\n\n if (validations.maxSize != null) {\n rules.push({\n rule: 'fileMaxSize',\n options: { maxSize: validations.maxSize },\n });\n }\n\n if (validations.rules?.length) {\n rules.push(...validations.rules);\n }\n\n return rules;\n}\n\n/** Failed validation results; empty array means the file is valid. */\nexport async function validateFileWithValidations(\n validation: AXValidationService,\n file: File,\n validations: AXFileValidations,\n): Promise<AXValidationRuleResult[]> {\n const entries = fileValidationsToRules(validations);\n const errors: AXValidationRuleResult[] = [];\n\n for (const { rule, options } of entries) {\n const result = await validation.validate(rule, file, options);\n if (!result.result) {\n errors.push(result);\n }\n }\n\n return errors;\n}\n\n/** Validates a file against a type; extension rules override when the file name matches. */\nexport async function validateFileAgainstType(\n validation: AXValidationService,\n file: File,\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<AXValidationRuleResult[]> {\n const matchedExtension = extension ?? findFileTypeExtension(file, type);\n\n if (isExtensionsOnlyType(type) && !matchedExtension) {\n const ext = getFileExtension(file.name);\n return [\n {\n rule: 'fileExtension',\n result: false,\n message: ext ? `Extension \".${ext}\" is not allowed.` : 'File must have an allowed extension.',\n value: ext,\n },\n ];\n }\n\n const resolved = resolveFileValidations(type, matchedExtension);\n return validateFileWithValidations(validation, file, resolved);\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMaxSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Maximum size in bytes. */\n maxSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMaxSize: AXFileMaxSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMaxSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMaxSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMaxSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size <= options.maxSize;\n const limitLabel = formatFileSizeBytes(options.maxSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ??\n `File is too large. Maximum size is ${limitLabel}.`),\n value: size,\n maxSize: options.maxSize,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\n\nexport interface AXFileMimeTypeValidationRuleOptions extends AXValidationRuleOptions {\n /** MIME patterns, e.g. `image/*`, `image/png`. */\n allowed: string[];\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMimeType: AXFileMimeTypeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMimeTypeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMimeType';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMimeTypeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const mime = (value instanceof File || value instanceof Blob ? value.type : '').trim().toLowerCase();\n const allowed = options.allowed ?? [];\n const valid =\n allowed.length === 0 ||\n allowed.some((pattern) => this.matchesMime(mime, pattern.trim().toLowerCase()));\n\n return {\n rule: this.name,\n result: valid,\n message: valid ? '' : (options.message ?? 'File type is not allowed.'),\n value: mime,\n };\n }\n\n private matchesMime(mime: string, pattern: string): boolean {\n if (!pattern || pattern === '*/*' || pattern === '*') {\n return true;\n }\n if (pattern.endsWith('/*')) {\n const category = pattern.slice(0, -2);\n return mime.startsWith(`${category}/`) || (mime === '' && category === 'application');\n }\n return mime === pattern;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMinSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Minimum size in bytes. */\n minSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMinSize: AXFileMinSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMinSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMinSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMinSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size >= options.minSize;\n const limitLabel = formatFileSizeBytes(options.minSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ?? `File is too small. Minimum size is ${limitLabel}.`),\n value: size,\n minSize: options.minSize,\n };\n }\n}\n","import { AXValidationRegistryService } from '@acorex/core/validation';\nimport { AXFileMaxSizeValidationRule } from './rules/file-max-size.rule';\nimport { AXFileMimeTypeValidationRule } from './rules/file-mime-type.rule';\nimport { AXFileMinSizeValidationRule } from './rules/file-min-size.rule';\n\n/** Validation rule classes to register with {@link AXValidationModule}. */\nexport const AX_FILE_VALIDATION_RULES = [\n AXFileMimeTypeValidationRule,\n AXFileMinSizeValidationRule,\n AXFileMaxSizeValidationRule,\n] as const;\n\nlet fileValidationRulesRegistered = false;\n\n/** Idempotent registration for bootstrap providers and first validation call. */\nexport function ensureFileValidationRules(registry: AXValidationRegistryService): void {\n if (fileValidationRulesRegistered) {\n return;\n }\n registry.register(...AX_FILE_VALIDATION_RULES);\n fileValidationRulesRegistered = true;\n}\n","import { AXValidationRegistryService, AXValidationService, type AXValidationRuleResult } from '@acorex/core/validation';\n\nimport { inject, Injectable, Type } from '@angular/core';\n\nimport { AX_FILE_TYPE_INFO_PROVIDER } from './file-type-info-provider';\n\nimport {\n findFileTypeExtension,\n loadFileTypeComponent,\n matchesFileMime,\n resolveFileTypeComponent,\n resolveFileTypeExtension,\n type AXFileTypeExtensionHint,\n} from './file-type.resolve';\n\nimport type { AXFileType, AXFileTypeQuery } from './file-type.models';\n\nimport { filterFileTypesByPurpose } from './file-type.metadata';\n\nimport { validateFileAgainstType } from './file-type.validate';\nimport { ensureFileValidationRules } from './file-validation-rules.bootstrap';\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileTypeRegistryService {\n private readonly validation = inject(AXValidationService);\n private readonly validationRegistry = inject(AXValidationRegistryService);\n\n private readonly providers = inject(AX_FILE_TYPE_INFO_PROVIDER, { optional: true }) ?? [];\n\n private readonly registeredTypes: AXFileType[] = [];\n\n private cache: AXFileType[] | null = null;\n\n /** Registers or replaces catalog entries (e.g. from feature bootstrap). */\n\n registerTypes(types: AXFileType[]): void {\n for (const type of types) {\n const index = this.registeredTypes.findIndex((t) => t.name === type.name);\n\n if (index >= 0) {\n this.registeredTypes[index] = type;\n } else {\n this.registeredTypes.push(type);\n }\n }\n\n this.invalidateCache();\n }\n\n invalidateCache(): void {\n this.cache = null;\n }\n\n private async resolveTypes(): Promise<AXFileType[]> {\n if (this.cache) {\n return this.cache;\n }\n\n const byName = new Map<string, AXFileType>();\n\n if (this.providers.length) {\n const batches = await Promise.all(this.providers.map((p) => p.items()));\n\n for (const batch of batches) {\n for (const type of batch) {\n if (!byName.has(type.name)) {\n byName.set(type.name, type);\n }\n }\n }\n }\n\n for (const type of this.registeredTypes) {\n byName.set(type.name, type);\n }\n\n this.cache = [...byName.values()];\n\n return this.cache;\n }\n\n async getTypes(query?: AXFileTypeQuery): Promise<AXFileType[]> {\n const types = await this.resolveTypes();\n return filterFileTypesByPurpose(types, query?.purpose);\n }\n\n async get(name: string): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n return types.find((t) => t.name === name);\n }\n\n /** Resolved view component ref for a catalog entry (optional extension hint). */\n async getComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<AXFileType['component'] | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return resolveFileTypeComponent(type, extension);\n }\n\n /** Loads the view component for a catalog entry. */\n async loadComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<Type<unknown> | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return loadFileTypeComponent(type, extension);\n }\n\n async accept(typeNames?: string | string[]): Promise<string> {\n const names = typeNames ? (Array.isArray(typeNames) ? typeNames : [typeNames]) : undefined;\n\n const types = await this.resolveTypes();\n\n const selected = names?.length ? types.filter((t) => names.includes(t.name)) : types;\n\n if (names?.length && selected.length === 0) {\n return '';\n }\n\n const parts = new Set<string>();\n\n for (const type of selected) {\n type.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n type.extensions?.forEach((ext) => {\n ext.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n parts.add(`.${ext.name.replace(/^\\./, '')}`);\n });\n }\n\n return [...parts].join(',');\n }\n\n async matchType(file: File): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n const mime = file.type.trim().toLowerCase();\n\n return types.find((type) => {\n const patterns = [\n ...(type.validations?.mimeTypes ?? []),\n\n ...(type.extensions?.flatMap((e) => e.validations?.mimeTypes ?? []) ?? []),\n ];\n\n if (!patterns.length) {\n return false;\n }\n\n return patterns.some((pattern) => matchesFileMime(mime, pattern));\n });\n }\n\n async validate(file: File, typeName: string): Promise<AXValidationRuleResult[]> {\n ensureFileValidationRules(this.validationRegistry);\n\n const type = await this.get(typeName);\n\n if (!type) {\n return [\n {\n rule: 'fileType',\n\n result: false,\n\n message: `Unknown file type: ${typeName}`,\n\n value: typeName,\n },\n ];\n }\n\n const extension = findFileTypeExtension(file, type);\n\n return validateFileAgainstType(this.validation, file, type, extension);\n }\n\n async validateAgainstTypes(\n file: File,\n\n typeNames: string | string[],\n ): Promise<AXValidationRuleResult[]> {\n const names = Array.isArray(typeNames) ? typeNames : [typeNames];\n\n let lastErrors: AXValidationRuleResult[] = [];\n\n for (const name of names) {\n const errors = await this.validate(file, name);\n\n if (errors.length === 0) {\n return [];\n }\n\n lastErrors = errors;\n }\n\n return lastErrors;\n }\n\n async validateMany(\n files: File[],\n\n typeNames: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const accepted: File[] = [];\n\n const rejected: { file: File; errors: AXValidationRuleResult[] }[] = [];\n\n for (const file of files) {\n const errors = await this.validateAgainstTypes(file, typeNames);\n\n if (errors.length === 0) {\n accepted.push(file);\n } else {\n rejected.push({ file, errors });\n }\n }\n\n return { accepted, rejected };\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { Component, effect, inject, input, signal, type Type } from '@angular/core';\n\nimport { AXFileTypeRegistryService } from '../file-type/file-type-registry.service';\nimport type { AXFileTypeExtensionHint } from '../file-type/file-type.resolve';\n\n@Component({\n selector: 'ax-file-type-renderer',\n\n imports: [NgComponentOutlet],\n template: `\n @if (resolvedComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: mergedInputs()\" />\n } @else if (loading()) {\n <span class=\"ax-file-type-renderer__loading\" aria-hidden=\"true\"></span>\n }\n `,\n styles: `\n :host {\n display: contents;\n }\n\n .ax-file-type-renderer__loading {\n display: inline-block;\n min-height: 1rem;\n min-width: 1rem;\n }\n `,\n})\nexport class AXFileTypeRendererOutletComponent {\n private readonly registry = inject(AXFileTypeRegistryService);\n\n /** Catalog name (e.g. `image`, `conversation-image`). */\n readonly fileType = input.required<string>();\n\n /** Payload passed to the file-type view component. */\n readonly payload = input.required<unknown>();\n\n /** Optional extension / MIME hint for extension-level renderer overrides. */\n readonly extensionHint = input<AXFileTypeExtensionHint>();\n\n /** Extra inputs merged with `payload` (e.g. `message` in conversation). */\n readonly inputs = input<Record<string, unknown>>({});\n\n readonly resolvedComponent = signal<Type<unknown> | null>(null);\n readonly loading = signal(false);\n\n readonly mergedInputs = signal<Record<string, unknown>>({});\n\n constructor() {\n effect(() => {\n const name = this.fileType();\n const payload = this.payload();\n const hint = this.extensionHint();\n const extra = this.inputs();\n\n this.mergedInputs.set({ payload, ...extra });\n this.loading.set(true);\n this.resolvedComponent.set(null);\n\n void this.registry.loadComponent(name, hint).then((component) => {\n this.resolvedComponent.set(component ?? null);\n this.loading.set(false);\n });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_AUDIO_FILE_TYPE: AXFileType = {\n name: 'audio',\n metadata: createFileTypeMetadata('system'),\n title: 'Audio',\n icon: 'fa-light fa-music ax-text-amber-500',\n validations: {\n mimeTypes: ['audio/*'],\n minSize: 1,\n maxSize: 50 * MB,\n },\n extensions: [\n { name: 'mp3', title: 'MP3' },\n { name: 'wav', title: 'WAV', validations: { maxSize: 30 * MB } },\n { name: 'ogg', title: 'OGG' },\n { name: 'm4a', title: 'M4A' },\n ],\n};\n\n@Injectable()\nexport class AXAudioFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_AUDIO_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\n/** Extension-only: no type `validations` — only listed extensions are allowed. */\nexport const AX_DOCUMENT_FILE_TYPE: AXFileType = {\n name: 'document',\n metadata: createFileTypeMetadata('system'),\n title: 'Document',\n icon: 'fa-light fa-file-lines ax-text-red-500',\n extensions: [{ name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 5 * MB } }],\n};\n\n@Injectable()\nexport class AXDocumentFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_DOCUMENT_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_FILE_FILE_TYPE: AXFileType = {\n name: 'file',\n metadata: createFileTypeMetadata('system'),\n title: 'File',\n icon: 'fa-light fa-file ax-text-neutral-500',\n validations: {\n mimeTypes: ['application/*', 'text/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 25 * MB } },\n { name: 'doc', title: 'Word' },\n { name: 'docx', title: 'Word' },\n { name: 'txt', title: 'Text', validations: { mimeTypes: ['text/plain'], maxSize: 5 * MB } },\n { name: 'zip', title: 'ZIP', validations: { maxSize: 50 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXFileFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_FILE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_IMAGE_FILE_TYPE: AXFileType = {\n name: 'image',\n metadata: createFileTypeMetadata('system'),\n title: 'Image',\n icon: 'fa-light fa-image ax-text-purple-500',\n validations: {\n mimeTypes: ['image/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'jpg', title: 'JPEG' },\n { name: 'jpeg', title: 'JPEG', validations: { maxSize: 5 * MB } },\n { name: 'png', title: 'PNG' },\n { name: 'gif', title: 'GIF' },\n { name: 'webp', title: 'WebP' },\n { name: 'svg', title: 'SVG', validations: { maxSize: 2 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXImageFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_IMAGE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_VIDEO_FILE_TYPE: AXFileType = {\n name: 'video',\n metadata: createFileTypeMetadata('system'),\n title: 'Video',\n icon: 'fa-light fa-video ax-text-blue-500',\n validations: {\n mimeTypes: ['video/*'],\n minSize: 1,\n maxSize: 500 * MB,\n },\n extensions: [\n { name: 'mp4', title: 'MP4' },\n { name: 'webm', title: 'WebM', validations: { maxSize: 200 * MB } },\n { name: 'ogg', title: 'OGG' },\n ],\n};\n\n@Injectable()\nexport class AXVideoFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_VIDEO_FILE_TYPE]);\n }\n}\n","import { Provider, Type } from '@angular/core';\nimport { provideFileTypeInfoProvider, AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { AXAudioFileTypeProvider } from './audio-file-type.provider';\nimport { AXDocumentFileTypeProvider } from './document-file-type.provider';\nimport { AXFileFileTypeProvider } from './file-file-type.provider';\nimport { AXImageFileTypeProvider } from './image-file-type.provider';\nimport { AXVideoFileTypeProvider } from './video-file-type.provider';\n\nexport * from './image-file-type.provider';\nexport * from './video-file-type.provider';\nexport * from './audio-file-type.provider';\nexport * from './file-file-type.provider';\nexport * from './document-file-type.provider';\n\n/** Built-in file type provider classes (one logical type per provider). */\nexport const AX_BUILTIN_FILE_TYPE_PROVIDERS = [\n AXImageFileTypeProvider,\n AXVideoFileTypeProvider,\n AXAudioFileTypeProvider,\n AXFileFileTypeProvider,\n AXDocumentFileTypeProvider,\n] as const satisfies readonly Type<AXFileTypeInfoProvider>[];\n\n/** Registers all built-in file type providers (image, video, audio, file, document). */\nexport function provideBuiltinFileTypeProviders(): Provider[] {\n return AX_BUILTIN_FILE_TYPE_PROVIDERS.map((provider) => provideFileTypeInfoProvider(provider));\n}\n\n/** @deprecated Use {@link provideBuiltinFileTypeProviders}. */\nexport const provideDefaultFileTypeProviders = provideBuiltinFileTypeProviders;\n","export * from './file-type.metadata';\r\r\nexport * from './file-type.models';\r\r\nexport * from './file-type.context';\r\r\nexport * from './file-type.copy';\r\r\nexport * from './file-type.open';\r\r\nexport * from './file-type.resolve';\r\r\nexport * from './file-type.renderer';\r\r\nexport * from './file-type.define';\r\r\nexport * from './file-type.providers';\r\r\nexport * from './file-type-renderer-outlet.component';\r\r\nexport * from './file-type-info-provider';\r\r\nexport * from './file-type-registry.service';\r\r\nexport * from './file-type.merge';\r\r\nexport * from './file-type.validate';\r\r\nexport * from './types.providers';\r\r\nexport * from './rules/file-mime-type.rule';\r\r\nexport * from './rules/file-min-size.rule';\r\r\nexport * from './rules/file-max-size.rule';\r\r\nexport * from './file-validation-rules.bootstrap';\r\r\n\r\r\nimport { Provider } from '@angular/core';\r\r\nimport { AXValidationRegistryService } from '@acorex/core/validation';\r\r\nimport { provideBuiltinFileTypeProviders } from './types.providers';\r\r\nimport { AX_FILE_VALIDATION_RULES, ensureFileValidationRules } from './file-validation-rules.bootstrap';\r\r\n\r\r\nexport { AX_FILE_VALIDATION_RULES } from './file-validation-rules.bootstrap';\r\r\n\r\r\n/** Registers file validation rules with {@link AXValidationRegistryService}. */\r\r\nexport function provideFileValidationRules(): Provider {\r\r\n return {\r\r\n provide: 'AXValidationModuleFactory',\r\r\n useFactory: (registry: AXValidationRegistryService) => () => {\r\r\n ensureFileValidationRules(registry);\r\r\n },\r\r\n deps: [AXValidationRegistryService],\r\r\n multi: true,\r\r\n };\r\r\n}\r\r\n\r\r\n/** Registers built-in image / video / audio / file / document type providers. */\r\r\nexport { provideBuiltinFileTypeProviders, provideDefaultFileTypeProviders } from './types.providers';\r\r\n\r\r\n/**\r\r\n * Registers validation rules and optional built-in file type providers.\r\r\n * {@link AXFileTypeRegistryService} and {@link AXFileService} are `providedIn: 'root'`.\r\r\n */\r\r\nexport function provideFileTypeSystem(): Provider[] {\r\r\n return [provideFileValidationRules(), ...provideBuiltinFileTypeProviders()];\r\r\n}\r\r\n\r","import { AXFormatModule } from '@acorex/core/format';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { AXFileSizeFormatter } from './file-size-formatter';\nimport {\n AX_FILE_VALIDATION_RULES,\n provideDefaultFileTypeProviders,\n provideFileValidationRules,\n} from './file-type';\n\nexport interface AXFileModuleConfig {\n fileTypeProviders?: Provider[];\n includeDefaultFileTypes?: boolean;\n}\n\n@NgModule({\n imports: [\n AXFormatModule.forChild({ formatters: [AXFileSizeFormatter] }),\n AXValidationModule.forChild({ rules: [...AX_FILE_VALIDATION_RULES] }),\n ],\n providers: [AXFileSizeFormatter],\n})\nexport class AXFileModule {\n static forRoot(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n const includeDefaults = config?.includeDefaultFileTypes !== false;\n\n return {\n ngModule: AXFileModule,\n providers: [\n provideFileValidationRules(),\n ...(includeDefaults ? provideDefaultFileTypeProviders() : []),\n ...(config?.fileTypeProviders ?? []),\n ],\n };\n }\n\n static forChild(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n return AXFileModule.forRoot(config);\n }\n}\n","import type { AXValidationRuleResult } from '@acorex/core/validation';\nimport { DOCUMENT, inject, Injectable, isDevMode } from '@angular/core';\nimport { AXFileTypeRegistryService } from './file-type/file-type-registry.service';\nimport type { AXFileType } from './file-type/file-type.models';\n\nexport interface AXFileChooseOptions {\n /** Logical type name(s) from {@link AXFileTypeRegistryService}. When set, files are validated against the catalog. */\n fileType?: string | string[];\n accept?: string;\n multiple?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileService {\n private readonly document = inject(DOCUMENT);\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n\n async getFileTypes(): Promise<AXFileType[]> {\n return this.fileTypes.getTypes();\n }\n\n async getFileType(name: string): Promise<AXFileType | undefined> {\n return this.fileTypes.get(name);\n }\n\n async getAcceptAttribute(fileType?: string | string[]): Promise<string> {\n return this.fileTypes.accept(fileType);\n }\n\n async matchFileType(file: File): Promise<AXFileType | undefined> {\n return this.fileTypes.matchType(file);\n }\n\n validate(file: File, fileType: string | string[]): Promise<AXValidationRuleResult[]> {\n return this.fileTypes.validateAgainstTypes(file, fileType);\n }\n\n validateMany(\n files: File[],\n fileType: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n return this.fileTypes.validateMany(files, fileType);\n }\n\n /**\n * Opens a file selection dialog.\n * With `fileType`, returns files that pass catalog validation (`accept` defaults from the catalog).\n * Without `fileType`, returns all selected files (legacy `accept` / `multiple` only).\n */\n async chooseValidated(\n options: AXFileChooseOptions,\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const resolved = await this.resolveChooseOptions(options);\n const files = await this.openFileDialog(resolved);\n\n if (files.length === 0) {\n return { accepted: [], rejected: [] };\n }\n\n if (options.fileType) {\n return this.validateMany(files, options.fileType);\n }\n\n return { accepted: files, rejected: [] };\n }\n\n async choose(options: AXFileChooseOptions): Promise<File[]> {\n const { accepted } = await this.chooseValidated(options);\n return accepted;\n }\n\n blobToBase64(blob: Blob): Promise<string> {\n if (!(blob instanceof Blob)) {\n return Promise.reject(new Error('input is not blob'));\n }\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(reader.error);\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n }\n\n getSize(file: File | Blob | string): number | false {\n if (this.isBase64(file as string)) {\n return this.getBase64Size(file as string);\n }\n return false;\n }\n\n isBase64(base64: string): boolean {\n const regx = /[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/;\n return regx.test(base64);\n }\n\n getBase64Size(base64: string): number {\n return atob(base64.substring(base64.indexOf(',') + 1)).length;\n }\n\n private async resolveChooseOptions(\n options: AXFileChooseOptions,\n ): Promise<{ accept: string; multiple: boolean }> {\n const multiple = options.multiple ?? false;\n\n if (options.fileType) {\n const accept = options.accept ?? (await this.getAcceptAttribute(options.fileType));\n\n if (isDevMode() && !accept) {\n const name = Array.isArray(options.fileType) ? options.fileType.join(', ') : options.fileType;\n console.warn(\n `[AXFileService] No accept filter for file type \"${name}\". ` +\n 'Register a file type provider (e.g. provideConversationFileCatalog).',\n );\n }\n\n return { accept, multiple };\n }\n\n return { accept: options.accept ?? '', multiple };\n }\n\n private openFileDialog(options: { accept: string; multiple: boolean }): Promise<File[]> {\n return new Promise<File[]>((resolve, reject) => {\n const input: HTMLInputElement = this.document.createElement('input');\n input.style.display = 'none';\n this.document.body.appendChild(input);\n input.type = 'file';\n input.accept = options.accept;\n input.multiple = options.multiple;\n\n const cleanup = () => {\n input.removeEventListener('change', onChange);\n input.removeEventListener('error', onError);\n if (input.parentNode) {\n this.document.body.removeChild(input);\n }\n input.remove();\n };\n\n const onError = (e: Event) => {\n cleanup();\n reject(e);\n };\n\n const onChange = () => {\n const files = Array.from(input.files ?? []);\n cleanup();\n resolve(files);\n };\n\n input.addEventListener('change', onChange);\n input.addEventListener('error', onError);\n input.click();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["MB"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-core-file.mjs","sources":["../../../../packages/core/file/src/lib/file-size-formatter.ts","../../../../packages/core/file/src/lib/format-file-size.ts","../../../../packages/core/file/src/lib/file-type/file-type.models.ts","../../../../packages/core/file/src/lib/file-type/file-type.metadata.ts","../../../../packages/core/file/src/lib/file-type/file-type.copy.ts","../../../../packages/core/file/src/lib/file-type/file-type.merge.ts","../../../../packages/core/file/src/lib/file-type/file-type.renderer.ts","../../../../packages/core/file/src/lib/file-type/file-type.resolve.ts","../../../../packages/core/file/src/lib/file-type/file-type.open.ts","../../../../packages/core/file/src/lib/file-type/file-type.define.ts","../../../../packages/core/file/src/lib/file-type/file-type-info-provider.ts","../../../../packages/core/file/src/lib/file-type/file-type.providers.ts","../../../../packages/core/file/src/lib/file-type/file-type.validate.ts","../../../../packages/core/file/src/lib/file-type/rules/file-max-size.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-mime-type.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-min-size.rule.ts","../../../../packages/core/file/src/lib/file-type/file-validation-rules.bootstrap.ts","../../../../packages/core/file/src/lib/file-type/file-type-registry.service.ts","../../../../packages/core/file/src/lib/file-type/file-type-renderer-outlet.component.ts","../../../../packages/core/file/src/lib/file-type/types.providers/audio-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/document-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/file-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/image-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/video-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/index.ts","../../../../packages/core/file/src/lib/file-type/index.ts","../../../../packages/core/file/src/lib/file.module.ts","../../../../packages/core/file/src/lib/file.service.ts","../../../../packages/core/file/src/acorex-core-file.ts"],"sourcesContent":["import { AXFormatOptions, AXFormatter } from '@acorex/core/format';\nimport { Injectable } from '@angular/core';\n\nexport interface AXFileSizeFormatterOptions extends AXFormatOptions {\n format: string;\n}\n\ndeclare module '@acorex/core/format' {\n interface AXFormatOptionsMap {\n filesize: AXFileSizeFormatterOptions;\n }\n}\n\n@Injectable()\nexport class AXFileSizeFormatter implements AXFormatter {\n /**\n * Gets the name of the formatter.\n *\n * @returns string - The formatter name 'filesize'\n */\n\n get name(): string {\n return 'filesize';\n }\n\n /**\n * Formats a file size value to human-readable format.\n *\n * @param value - The file size in bytes\n * @returns string - The formatted file size string (e.g., '1.5 MB')\n */\n\n format(value: number): string {\n const size = Number(value);\n\n if (size === 0) return '0 Bytes';\n if (Number.isNaN(size)) return 'Unknown';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(size) / Math.log(k));\n\n return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n}\n","/** Human-readable file size (binary units, e.g. `41.5 MB`). */\nexport function formatFileSizeBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return '0 B';\n }\n if (bytes === 0) {\n return '0 B';\n }\n\n const k = 1024;\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), units.length - 1);\n const value = bytes / Math.pow(k, i);\n\n if (i === 0) {\n return `${bytes} B`;\n }\n\n const digits = value >= 100 ? 0 : value >= 10 ? 1 : 2;\n return `${value.toFixed(digits)} ${units[i]}`;\n}\n","import type { AXValidationRuleOptions } from '@acorex/core/validation';\nimport type { AXFileTypeContext, AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport type { AXFileOpenResult } from './file-type.open';\nimport type { AXFileTypeComponent } from './file-type.renderer';\n\n/** Metadata key for catalog usage context. */\nexport const AX_FILE_TYPE_METADATA_PURPOSE = 'purpose' as const;\n\n/** Catalog metadata bag; `purpose` lists usage contexts (e.g. `['system']`). */\nexport type AXFileTypeMetadata = Record<string, unknown> & {\n [AX_FILE_TYPE_METADATA_PURPOSE]?: string[];\n};\n\n/** Filter catalog entries by {@link AX_FILE_TYPE_METADATA_PURPOSE}. */\nexport interface AXFileTypeQuery {\n purpose?: string | string[];\n}\n\n/** Generic rule executed via {@link AXValidationService}. */\nexport interface AXFileValidationRule {\n rule: string;\n options?: AXValidationRuleOptions;\n}\n\n/**\n * Common file constraints shared by {@link AXFileType} and {@link AXFileTypeExtension}.\n * Extension `validations` override the parent type field-by-field when merged.\n */\nexport interface AXFileValidations {\n mimeTypes?: string[];\n minSize?: number;\n maxSize?: number;\n rules?: AXFileValidationRule[];\n}\n\ntype AXFileTypeUtilities = Record<\n string,\n (ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\n>;\n\n/**\n * Logical file category (image, video, …).\n *\n * - With type `validations` set: any file matching those rules is allowed; `extensions` only override when matched.\n * - With empty / omitted `validations` and `extensions` listed: only those extensions are allowed.\n */\nexport interface AXFileType<T extends AXFileTypeUtilities = AXFileTypeUtilities> {\n name: string;\n title?: string;\n icon?: string;\n metadata?: AXFileTypeMetadata;\n validations?: AXFileValidations;\n extensions?: AXFileTypeExtension<T>[];\n /** Dynamic utility functions available for this file type. */\n utilities?: T;\n paste?: () => Promise<unknown>;\n /**\n * Produce copyable content from a payload (does not write to the clipboard).\n * Returns a plain string or {@link AXFileCopyData} with `text` and optional `meta`.\n */\n copy?: (payload: unknown) => Promise<AXFileCopyResult> | AXFileCopyResult;\n /**\n * Open or preview a payload (e.g. navigate, show a dialog).\n * Invoke via {@link runFileTypeOpen} so `inject()` works in the caller's context.\n */\n open?: (\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\n /** Optional view component (eager class or lazy `() => import(...)`) for this file type's payload. */\n component?: AXFileTypeComponent;\n}\n\n/** Extension entry — {@link AXFileType} without nested `extensions`. */\nexport type AXFileTypeExtension<T extends AXFileTypeUtilities = AXFileTypeUtilities> = Omit<\n AXFileType<T>,\n 'extensions'\n>;\n","import type { AXFileType } from './file-type.models';\nimport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nexport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nconst CONVERSATION_NAME_PREFIX = 'conversation-';\n\nexport function getFileTypePurposes(type: AXFileType): string[] {\n const raw = type.metadata?.[AX_FILE_TYPE_METADATA_PURPOSE];\n if (Array.isArray(raw)) {\n const values = raw.filter((entry): entry is string => typeof entry === 'string' && entry.trim().length > 0);\n if (values.length) {\n return values;\n }\n }\n if (type.name.startsWith(CONVERSATION_NAME_PREFIX)) {\n return ['conversation'];\n }\n return ['system'];\n}\n\nexport function fileTypeMatchesPurpose(type: AXFileType, purpose: string | string[]): boolean {\n const allowed = Array.isArray(purpose) ? purpose : [purpose];\n return getFileTypePurposes(type).some((entry) => allowed.includes(entry));\n}\n\nexport function filterFileTypesByPurpose(types: AXFileType[], purpose?: string | string[]): AXFileType[] {\n if (!purpose) {\n return types;\n }\n return types.filter((type) => fileTypeMatchesPurpose(type, purpose));\n}\n\nexport function createFileTypeMetadata(purpose: string | string[]): NonNullable<AXFileType['metadata']> {\n const values = (Array.isArray(purpose) ? purpose : [purpose]).filter(\n (entry): entry is string => typeof entry === 'string' && entry.trim().length > 0,\n );\n return { [AX_FILE_TYPE_METADATA_PURPOSE]: values };\n}\n","/** Structured copy payload from {@link AXFileType.copy}. */\nexport interface AXFileCopyData {\n /** Primary plain-text value for clipboard or previews. */\n text: string;\n /** Optional type-specific metadata for consumers (URLs, names, mime types, …). */\n meta?: Record<string, unknown>;\n}\n\n/** Return value of {@link AXFileType.copy} — shorthand string or structured data. */\nexport type AXFileCopyResult = string | AXFileCopyData | null | undefined;\n\n/** Resolves clipboard/plain text from a copy result. */\nexport function resolveFileCopyText(result: AXFileCopyResult): string | null {\n if (result == null) {\n return null;\n }\n if (typeof result === 'string') {\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n const trimmed = result.text?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n}\n","import type { AXFileType, AXFileTypeExtension, AXFileValidations } from './file-type.models';\n\n/** Merges type-level validations with extension overrides (extension wins per field). */\nexport function mergeFileValidations(\n base: AXFileValidations,\n override?: Partial<AXFileValidations>,\n): AXFileValidations {\n if (!override) {\n return { ...base };\n }\n\n return {\n mimeTypes: override.mimeTypes ?? base.mimeTypes,\n minSize: override.minSize ?? base.minSize,\n maxSize: override.maxSize ?? base.maxSize,\n rules: override.rules ?? base.rules,\n };\n}\n\n/** Resolved validations for a type + optional extension entry. */\nexport function resolveFileValidations(type: AXFileType, extension?: AXFileTypeExtension): AXFileValidations {\n return mergeFileValidations(type.validations ?? {}, extension?.validations);\n}\n\n/** True when no mime/size/rules are defined on the type. */\nexport function isEmptyFileValidations(validations?: AXFileValidations): boolean {\n if (!validations) {\n return true;\n }\n return (\n (validations.mimeTypes?.length ?? 0) === 0 &&\n validations.minSize == null &&\n validations.maxSize == null &&\n (validations.rules?.length ?? 0) === 0\n );\n}\n\n/**\n * Extension-only mode: empty type `validations` and a non-empty `extensions` list.\n * Files must match a listed extension; rules come from that extension entry.\n */\nexport function isExtensionsOnlyType(type: AXFileType): boolean {\n return isEmptyFileValidations(type.validations) && (type.extensions?.length ?? 0) > 0;\n}\n\n/** File extension from name (lowercase, no dot). */\nexport function getFileExtension(fileName: string): string {\n const parts = fileName.trim().split('.');\n return parts.length > 1 ? (parts.pop()?.toLowerCase() ?? '') : '';\n}\n","import type { InputSignal, Signal, Type } from '@angular/core';\n\n/**\n * View component for a file type — either an Angular component class or a lazy loader.\n *\n * @example\n * ```ts\n * // eager\n * component: ImageViewerComponent,\n *\n * // lazy\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\n * ```\n */\nexport type AXFileTypeComponent =\n | Type<AXFileTypeViewComponent>\n | (() => Promise<Type<AXFileTypeViewComponent>>);\n\n/**\n * Recommended contract for file-type view components.\n * Implement `readonly payload = input.required<TPayload>()` in new components.\n */\nexport interface AXFileTypeViewComponent<TPayload = unknown> {\n readonly payload: InputSignal<TPayload> | Signal<TPayload>;\n}\n\n/** Resolves a {@link AXFileTypeComponent} to an Angular component type. */\nexport async function resolveFileTypeComponentType(\n component: AXFileTypeComponent,\n): Promise<Type<unknown>> {\n if (isLazyFileTypeComponentLoader(component)) {\n return component();\n }\n return component;\n}\n\n/** Whether `value` is a lazy loader rather than an Angular component class. */\nexport function isLazyFileTypeComponentLoader(\n value: AXFileTypeComponent,\n): value is () => Promise<Type<AXFileTypeViewComponent>> {\n return typeof value === 'function' && !('ɵcmp' in value);\n}\n","import type { Type } from '@angular/core';\n\nimport type { AXFileTypeContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport { getFileExtension } from './file-type.merge';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport type { AXFileTypeComponent } from './file-type.renderer';\nimport { resolveFileTypeComponentType } from './file-type.renderer';\n\n/** Hint for resolving a catalog extension entry. */\nexport interface AXFileTypeExtensionHint {\n file?: File;\n extensionName?: string;\n mimeType?: string;\n}\n\n/** Matches a MIME type against a catalog pattern (`image/*`, exact type, …). */\nexport function matchesFileMime(mime: string, pattern: string): boolean {\n const normalizedMime = mime.trim().toLowerCase();\n const normalizedPattern = pattern.trim().toLowerCase();\n\n if (!normalizedPattern || normalizedPattern === '*/*' || normalizedPattern === '*') {\n return true;\n }\n\n if (normalizedPattern.endsWith('/*')) {\n const category = normalizedPattern.slice(0, -2);\n return normalizedMime.startsWith(`${category}/`) || (normalizedMime === '' && category === 'application');\n }\n\n return normalizedMime === normalizedPattern;\n}\n\n/** Finds an extension entry by its `name` (without dot). */\nexport function findFileTypeExtensionByName(\n type: AXFileType,\n extensionName: string,\n): AXFileTypeExtension | undefined {\n const ext = extensionName.replace(/^\\./, '').trim().toLowerCase();\n if (!ext || !type.extensions?.length) {\n return undefined;\n }\n return type.extensions.find((entry) => entry.name.toLowerCase() === ext);\n}\n\n/** Finds an extension entry whose validations include the given MIME type. */\nexport function findFileTypeExtensionForMime(\n type: AXFileType,\n mimeType: string,\n): AXFileTypeExtension | undefined {\n const mime = mimeType.trim().toLowerCase();\n if (!mime || !type.extensions?.length) {\n return undefined;\n }\n\n return type.extensions.find((entry) =>\n entry.validations?.mimeTypes?.some((pattern) => matchesFileMime(mime, pattern)),\n );\n}\n\n/** Matching extension entry for a file within a type, if any. */\nexport function findFileTypeExtension(file: File, type: AXFileType): AXFileTypeExtension | undefined {\n return resolveFileTypeExtension(type, { file });\n}\n\n/** Resolves the best-matching extension entry for a file or hint. */\nexport function resolveFileTypeExtension(\n type: AXFileType,\n hint?: AXFileTypeExtensionHint,\n): AXFileTypeExtension | undefined {\n if (!hint) {\n return undefined;\n }\n\n if (hint.file) {\n const byFileName = findFileTypeExtensionByName(type, getFileExtension(hint.file.name));\n if (byFileName) {\n return byFileName;\n }\n if (hint.file.type) {\n const byFileMime = findFileTypeExtensionForMime(type, hint.file.type);\n if (byFileMime) {\n return byFileMime;\n }\n }\n }\n\n if (hint.extensionName) {\n const byName = findFileTypeExtensionByName(type, hint.extensionName);\n if (byName) {\n return byName;\n }\n }\n\n if (hint.mimeType) {\n return findFileTypeExtensionForMime(type, hint.mimeType);\n }\n\n return undefined;\n}\n\nexport function resolveFileTypeCopy(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['copy'] | undefined {\n return extension?.copy ?? type.copy;\n}\n\nexport function resolveFileTypeOpen(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['open'] | undefined {\n return extension?.open ?? type.open;\n}\n\nexport function resolveFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['component'] | undefined {\n return extension?.component ?? type.component;\n}\n\n/** Loads the resolved view component (extension override first). */\nexport async function loadFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<Type<unknown> | undefined> {\n const component = resolveFileTypeComponent(type, extension);\n if (!component) {\n return undefined;\n }\n return resolveFileTypeComponentType(component);\n}\n\nexport function resolveFileTypePaste(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['paste'] | undefined {\n return extension?.paste ?? type.paste;\n}\n\nexport function resolveFileTypeUtility(\n type: AXFileType,\n extension: AXFileTypeExtension | undefined,\n name: string,\n): ((ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown) | undefined {\n const fromExtension = extension?.utilities?.[name];\n if (fromExtension) {\n return fromExtension;\n }\n return type.utilities?.[name];\n}\n\n/** Runs `copy` from extension first, then parent type. */\nexport async function runFileTypeCopy(\n type: AXFileType,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileCopyResult> {\n const copy = resolveFileTypeCopy(type, extension);\n if (!copy) {\n return undefined;\n }\n return copy(payload);\n}\n\n/** Runs a utility from extension first, then parent type. */\nexport function runFileTypeUtility(\n type: AXFileType,\n ctx: AXFileTypeContext,\n extension: AXFileTypeExtension | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const utility = resolveFileTypeUtility(type, extension, name);\n if (!utility) {\n return undefined;\n }\n return utility(ctx, ...args);\n}\n\n/** Runs a catalog utility with optional file-based extension resolution. */\nexport function runFileTypeUtilityForFile(\n type: AXFileType,\n ctx: AXFileTypeContext,\n file: File | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const extension = file ? findFileTypeExtension(file, type) : undefined;\n return runFileTypeUtility(type, ctx, extension, name, file, ...args);\n}\n","import { runInInjectionContext } from '@angular/core';\n\nimport type { AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport { resolveFileTypeOpen } from './file-type.resolve';\n\n/** Result of {@link AXFileType.open}; `false` means the payload was not opened. */\nexport type AXFileOpenResult = void | boolean | null | undefined;\n\n/** Runs `open` from extension first, then parent type, in the caller's injection context. */\nexport function runFileTypeOpen(\n type: AXFileType,\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileOpenResult> | AXFileOpenResult {\n const open = resolveFileTypeOpen(type, extension);\n if (!open) {\n return false;\n }\n return runInInjectionContext(ctx.injector, () => open(ctx, payload));\n}\n","import type { Type } from '@angular/core';\r\r\n\r\r\nimport type { AXFileCopyResult } from './file-type.copy';\r\r\nimport type { AXFileType, AXFileTypeExtension, AXFileValidations, AXFileTypeMetadata } from './file-type.models';\r\r\nimport type { AXFileOpenResult } from './file-type.open';\r\r\nimport type { AXFileTypeOpenContext } from './file-type.context';\r\r\nimport type { AXFileTypeComponent } from './file-type.renderer';\r\r\n\r\r\ntype AXFileTypeUtilities = Record<\r\r\n string,\r\r\n (ctx: import('./file-type.context').AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\r\r\n>;\r\r\n\r\r\n/** Config for {@link defineFileType}. */\r\r\nexport interface DefineFileTypeConfig<\r\r\n TPayload = unknown,\r\r\n TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities,\r\r\n> {\r\r\n name: string;\r\r\n title?: string;\r\r\n icon?: string;\r\r\n metadata?: AXFileTypeMetadata;\r\r\n validations?: AXFileValidations;\r\r\n extensions?: AXFileTypeExtension<TUtilities>[];\r\r\n utilities?: TUtilities;\r\r\n paste?: AXFileType<TUtilities>['paste'];\r\r\n copy?: (payload: TPayload) => Promise<AXFileCopyResult> | AXFileCopyResult;\r\r\n open?: (\r\r\n ctx: AXFileTypeOpenContext,\r\r\n payload: TPayload,\r\r\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\r\r\n /** Eager component class or lazy `() => import(...).then(m => m.Component)`. */\r\r\n component?: AXFileTypeComponent;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Builds an {@link AXFileType} with optional typed handlers and view component.\r\r\n *\r\r\n * @example\r\r\n * ```ts\r\r\n * export const imageFileType = defineFileType<ImagePayload>({\r\r\n * name: 'image',\r\r\n * copy: (p) => p.caption ?? p.url,\r\r\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\r\r\n * });\r\r\n * ```\r\r\n */\r\r\nexport function defineFileType<TPayload = unknown, TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities>(\r\r\n config: DefineFileTypeConfig<TPayload, TUtilities>,\r\r\n): AXFileType<TUtilities> {\r\r\n const { copy, open, ...rest } = config;\r\r\n\r\r\n return {\r\r\n ...rest,\r\r\n ...(copy ? { copy: copy as AXFileType<TUtilities>['copy'] } : {}),\r\r\n ...(open ? { open: open as AXFileType<TUtilities>['open'] } : {}),\r\r\n };\r\r\n}\r\r\n\r","import { InjectionToken, Provider, Type } from '@angular/core';\nimport type { AXFileType } from './file-type.models';\n\n/** Contributes {@link AXFileType} entries (multi provider). */\nexport abstract class AXFileTypeInfoProvider {\n abstract items(): Promise<AXFileType[]>;\n}\n\nexport const AX_FILE_TYPE_INFO_PROVIDER = new InjectionToken<AXFileTypeInfoProvider[]>('AX_FILE_TYPE_INFO_PROVIDER');\n\nexport function provideFileTypeInfoProvider(provider: Type<AXFileTypeInfoProvider>): Provider {\n return {\n provide: AX_FILE_TYPE_INFO_PROVIDER,\n useClass: provider,\n multi: true,\n };\n}\n","import { Injectable, Provider } from '@angular/core';\n\nimport type { AXFileType } from './file-type.models';\nimport { AXFileTypeInfoProvider, provideFileTypeInfoProvider } from './file-type-info-provider';\n\n/** Registers static file types via the existing {@link AXFileTypeInfoProvider} multi-token. */\nexport function provideFileTypes(types: AXFileType[] | (() => AXFileType[] | Promise<AXFileType[]>)): Provider {\n @Injectable()\n class AXStaticFileTypeProvider extends AXFileTypeInfoProvider {\n override items(): Promise<AXFileType[]> {\n const value = typeof types === 'function' ? types() : types;\n return Promise.resolve(value);\n }\n }\n\n return provideFileTypeInfoProvider(AXStaticFileTypeProvider);\n}\n","import { AXValidationService, type AXValidationRuleResult } from '@acorex/core/validation';\nimport {\n getFileExtension,\n isExtensionsOnlyType,\n resolveFileValidations,\n} from './file-type.merge';\nimport { findFileTypeExtension } from './file-type.resolve';\nimport type { AXFileType, AXFileTypeExtension, AXFileValidationRule, AXFileValidations } from './file-type.models';\n\n/** Maps {@link AXFileValidations} to executable validation entries. */\nexport function fileValidationsToRules(validations: AXFileValidations): AXFileValidationRule[] {\n const rules: AXFileValidationRule[] = [];\n\n if (validations.mimeTypes?.length) {\n rules.push({\n rule: 'fileMimeType',\n options: { allowed: validations.mimeTypes },\n });\n }\n\n if (validations.minSize != null) {\n rules.push({\n rule: 'fileMinSize',\n options: { minSize: validations.minSize },\n });\n }\n\n if (validations.maxSize != null) {\n rules.push({\n rule: 'fileMaxSize',\n options: { maxSize: validations.maxSize },\n });\n }\n\n if (validations.rules?.length) {\n rules.push(...validations.rules);\n }\n\n return rules;\n}\n\n/** Failed validation results; empty array means the file is valid. */\nexport async function validateFileWithValidations(\n validation: AXValidationService,\n file: File,\n validations: AXFileValidations,\n): Promise<AXValidationRuleResult[]> {\n const entries = fileValidationsToRules(validations);\n const errors: AXValidationRuleResult[] = [];\n\n for (const { rule, options } of entries) {\n const result = await validation.validate(rule, file, options);\n if (!result.result) {\n errors.push(result);\n }\n }\n\n return errors;\n}\n\n/** Validates a file against a type; extension rules override when the file name matches. */\nexport async function validateFileAgainstType(\n validation: AXValidationService,\n file: File,\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<AXValidationRuleResult[]> {\n const matchedExtension = extension ?? findFileTypeExtension(file, type);\n\n if (isExtensionsOnlyType(type) && !matchedExtension) {\n const ext = getFileExtension(file.name);\n return [\n {\n rule: 'fileExtension',\n result: false,\n message: ext ? `Extension \".${ext}\" is not allowed.` : 'File must have an allowed extension.',\n value: ext,\n },\n ];\n }\n\n const resolved = resolveFileValidations(type, matchedExtension);\n return validateFileWithValidations(validation, file, resolved);\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMaxSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Maximum size in bytes. */\n maxSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMaxSize: AXFileMaxSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMaxSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMaxSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMaxSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size <= options.maxSize;\n const limitLabel = formatFileSizeBytes(options.maxSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ??\n `File is too large. Maximum size is ${limitLabel}.`),\n value: size,\n maxSize: options.maxSize,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\n\nexport interface AXFileMimeTypeValidationRuleOptions extends AXValidationRuleOptions {\n /** MIME patterns, e.g. `image/*`, `image/png`. */\n allowed: string[];\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMimeType: AXFileMimeTypeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMimeTypeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMimeType';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMimeTypeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const mime = (value instanceof File || value instanceof Blob ? value.type : '').trim().toLowerCase();\n const allowed = options.allowed ?? [];\n const valid =\n allowed.length === 0 ||\n allowed.some((pattern) => this.matchesMime(mime, pattern.trim().toLowerCase()));\n\n return {\n rule: this.name,\n result: valid,\n message: valid ? '' : (options.message ?? 'File type is not allowed.'),\n value: mime,\n };\n }\n\n private matchesMime(mime: string, pattern: string): boolean {\n if (!pattern || pattern === '*/*' || pattern === '*') {\n return true;\n }\n if (pattern.endsWith('/*')) {\n const category = pattern.slice(0, -2);\n return mime.startsWith(`${category}/`) || (mime === '' && category === 'application');\n }\n return mime === pattern;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMinSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Minimum size in bytes. */\n minSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMinSize: AXFileMinSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMinSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMinSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMinSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size >= options.minSize;\n const limitLabel = formatFileSizeBytes(options.minSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ?? `File is too small. Minimum size is ${limitLabel}.`),\n value: size,\n minSize: options.minSize,\n };\n }\n}\n","import { AXValidationRegistryService } from '@acorex/core/validation';\nimport { AXFileMaxSizeValidationRule } from './rules/file-max-size.rule';\nimport { AXFileMimeTypeValidationRule } from './rules/file-mime-type.rule';\nimport { AXFileMinSizeValidationRule } from './rules/file-min-size.rule';\n\n/** Validation rule classes to register with {@link AXValidationModule}. */\nexport const AX_FILE_VALIDATION_RULES = [\n AXFileMimeTypeValidationRule,\n AXFileMinSizeValidationRule,\n AXFileMaxSizeValidationRule,\n] as const;\n\nlet fileValidationRulesRegistered = false;\n\n/** Idempotent registration for bootstrap providers and first validation call. */\nexport function ensureFileValidationRules(registry: AXValidationRegistryService): void {\n if (fileValidationRulesRegistered) {\n return;\n }\n registry.register(...AX_FILE_VALIDATION_RULES);\n fileValidationRulesRegistered = true;\n}\n","import { AXValidationRegistryService, AXValidationService, type AXValidationRuleResult } from '@acorex/core/validation';\n\nimport { inject, Injectable, Type } from '@angular/core';\n\nimport { AX_FILE_TYPE_INFO_PROVIDER } from './file-type-info-provider';\n\nimport {\n findFileTypeExtension,\n loadFileTypeComponent,\n matchesFileMime,\n resolveFileTypeComponent,\n resolveFileTypeExtension,\n type AXFileTypeExtensionHint,\n} from './file-type.resolve';\n\nimport type { AXFileType, AXFileTypeQuery } from './file-type.models';\n\nimport { filterFileTypesByPurpose } from './file-type.metadata';\n\nimport { validateFileAgainstType } from './file-type.validate';\nimport { ensureFileValidationRules } from './file-validation-rules.bootstrap';\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileTypeRegistryService {\n private readonly validation = inject(AXValidationService);\n private readonly validationRegistry = inject(AXValidationRegistryService);\n\n private readonly providers = inject(AX_FILE_TYPE_INFO_PROVIDER, { optional: true }) ?? [];\n\n private readonly registeredTypes: AXFileType[] = [];\n\n private cache: AXFileType[] | null = null;\n\n /** Registers or replaces catalog entries (e.g. from feature bootstrap). */\n\n registerTypes(types: AXFileType[]): void {\n for (const type of types) {\n const index = this.registeredTypes.findIndex((t) => t.name === type.name);\n\n if (index >= 0) {\n this.registeredTypes[index] = type;\n } else {\n this.registeredTypes.push(type);\n }\n }\n\n this.invalidateCache();\n }\n\n invalidateCache(): void {\n this.cache = null;\n }\n\n private async resolveTypes(): Promise<AXFileType[]> {\n if (this.cache) {\n return this.cache;\n }\n\n const byName = new Map<string, AXFileType>();\n\n if (this.providers.length) {\n const batches = await Promise.all(this.providers.map((p) => p.items()));\n\n for (const batch of batches) {\n for (const type of batch) {\n if (!byName.has(type.name)) {\n byName.set(type.name, type);\n }\n }\n }\n }\n\n for (const type of this.registeredTypes) {\n byName.set(type.name, type);\n }\n\n this.cache = [...byName.values()];\n\n return this.cache;\n }\n\n async getTypes(query?: AXFileTypeQuery): Promise<AXFileType[]> {\n const types = await this.resolveTypes();\n return filterFileTypesByPurpose(types, query?.purpose);\n }\n\n async get(name: string): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n return types.find((t) => t.name === name);\n }\n\n /** Resolved view component ref for a catalog entry (optional extension hint). */\n async getComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<AXFileType['component'] | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return resolveFileTypeComponent(type, extension);\n }\n\n /** Loads the view component for a catalog entry. */\n async loadComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<Type<unknown> | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return loadFileTypeComponent(type, extension);\n }\n\n async accept(typeNames?: string | string[]): Promise<string> {\n const names = typeNames ? (Array.isArray(typeNames) ? typeNames : [typeNames]) : undefined;\n\n const types = await this.resolveTypes();\n\n const selected = names?.length ? types.filter((t) => names.includes(t.name)) : types;\n\n if (names?.length && selected.length === 0) {\n return '';\n }\n\n const parts = new Set<string>();\n\n for (const type of selected) {\n type.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n type.extensions?.forEach((ext) => {\n ext.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n parts.add(`.${ext.name.replace(/^\\./, '')}`);\n });\n }\n\n return [...parts].join(',');\n }\n\n async matchType(file: File): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n const mime = file.type.trim().toLowerCase();\n\n return types.find((type) => {\n const patterns = [\n ...(type.validations?.mimeTypes ?? []),\n\n ...(type.extensions?.flatMap((e) => e.validations?.mimeTypes ?? []) ?? []),\n ];\n\n if (!patterns.length) {\n return false;\n }\n\n return patterns.some((pattern) => matchesFileMime(mime, pattern));\n });\n }\n\n async validate(file: File, typeName: string): Promise<AXValidationRuleResult[]> {\n ensureFileValidationRules(this.validationRegistry);\n\n const type = await this.get(typeName);\n\n if (!type) {\n return [\n {\n rule: 'fileType',\n\n result: false,\n\n message: `Unknown file type: ${typeName}`,\n\n value: typeName,\n },\n ];\n }\n\n const extension = findFileTypeExtension(file, type);\n\n return validateFileAgainstType(this.validation, file, type, extension);\n }\n\n async validateAgainstTypes(\n file: File,\n\n typeNames: string | string[],\n ): Promise<AXValidationRuleResult[]> {\n const names = Array.isArray(typeNames) ? typeNames : [typeNames];\n\n let lastErrors: AXValidationRuleResult[] = [];\n\n for (const name of names) {\n const errors = await this.validate(file, name);\n\n if (errors.length === 0) {\n return [];\n }\n\n lastErrors = errors;\n }\n\n return lastErrors;\n }\n\n async validateMany(\n files: File[],\n\n typeNames: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const accepted: File[] = [];\n\n const rejected: { file: File; errors: AXValidationRuleResult[] }[] = [];\n\n for (const file of files) {\n const errors = await this.validateAgainstTypes(file, typeNames);\n\n if (errors.length === 0) {\n accepted.push(file);\n } else {\n rejected.push({ file, errors });\n }\n }\n\n return { accepted, rejected };\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { Component, effect, inject, input, signal, type Type } from '@angular/core';\n\nimport { AXFileTypeRegistryService } from '../file-type/file-type-registry.service';\nimport type { AXFileTypeExtensionHint } from '../file-type/file-type.resolve';\n\n@Component({\n selector: 'ax-file-type-renderer',\n\n imports: [NgComponentOutlet],\n template: `\n @if (resolvedComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: mergedInputs()\" />\n } @else if (loading()) {\n <span class=\"ax-file-type-renderer__loading\" aria-hidden=\"true\"></span>\n }\n `,\n styles: `\n :host {\n display: contents;\n }\n\n .ax-file-type-renderer__loading {\n display: inline-block;\n min-height: 1rem;\n min-width: 1rem;\n }\n `,\n})\nexport class AXFileTypeRendererOutletComponent {\n private readonly registry = inject(AXFileTypeRegistryService);\n\n /** Catalog name (e.g. `image`, `conversation-image`). */\n readonly fileType = input.required<string>();\n\n /** Payload passed to the file-type view component. */\n readonly payload = input.required<unknown>();\n\n /** Optional extension / MIME hint for extension-level renderer overrides. */\n readonly extensionHint = input<AXFileTypeExtensionHint>();\n\n /** Extra inputs merged with `payload` (e.g. `message` in conversation). */\n readonly inputs = input<Record<string, unknown>>({});\n\n readonly resolvedComponent = signal<Type<unknown> | null>(null);\n readonly loading = signal(false);\n\n readonly mergedInputs = signal<Record<string, unknown>>({});\n\n private loadId = 0;\n\n constructor() {\n effect(() => {\n const name = this.fileType();\n const hint = this.extensionHint();\n const id = ++this.loadId;\n\n this.loading.set(true);\n this.resolvedComponent.set(null);\n\n void this.registry.loadComponent(name, hint).then((component) => {\n if (id !== this.loadId) return;\n this.resolvedComponent.set(component ?? null);\n this.loading.set(false);\n });\n });\n\n effect(() => {\n this.mergedInputs.set({\n payload: this.payload(),\n ...this.inputs(),\n });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_AUDIO_FILE_TYPE: AXFileType = {\n name: 'audio',\n metadata: createFileTypeMetadata('system'),\n title: 'Audio',\n icon: 'fa-light fa-music ax-text-amber-500',\n validations: {\n mimeTypes: ['audio/*'],\n minSize: 1,\n maxSize: 50 * MB,\n },\n extensions: [\n { name: 'mp3', title: 'MP3' },\n { name: 'wav', title: 'WAV', validations: { maxSize: 30 * MB } },\n { name: 'ogg', title: 'OGG' },\n { name: 'm4a', title: 'M4A' },\n ],\n};\n\n@Injectable()\nexport class AXAudioFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_AUDIO_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\n/** Extension-only: no type `validations` — only listed extensions are allowed. */\nexport const AX_DOCUMENT_FILE_TYPE: AXFileType = {\n name: 'document',\n metadata: createFileTypeMetadata('system'),\n title: 'Document',\n icon: 'fa-light fa-file-lines ax-text-red-500',\n extensions: [{ name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 5 * MB } }],\n};\n\n@Injectable()\nexport class AXDocumentFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_DOCUMENT_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_FILE_FILE_TYPE: AXFileType = {\n name: 'file',\n metadata: createFileTypeMetadata('system'),\n title: 'File',\n icon: 'fa-light fa-file ax-text-neutral-500',\n validations: {\n mimeTypes: ['application/*', 'text/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 25 * MB } },\n { name: 'doc', title: 'Word' },\n { name: 'docx', title: 'Word' },\n { name: 'txt', title: 'Text', validations: { mimeTypes: ['text/plain'], maxSize: 5 * MB } },\n { name: 'zip', title: 'ZIP', validations: { maxSize: 50 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXFileFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_FILE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_IMAGE_FILE_TYPE: AXFileType = {\n name: 'image',\n metadata: createFileTypeMetadata('system'),\n title: 'Image',\n icon: 'fa-light fa-image ax-text-purple-500',\n validations: {\n mimeTypes: ['image/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'jpg', title: 'JPEG' },\n { name: 'jpeg', title: 'JPEG', validations: { maxSize: 5 * MB } },\n { name: 'png', title: 'PNG' },\n { name: 'gif', title: 'GIF' },\n { name: 'webp', title: 'WebP' },\n { name: 'svg', title: 'SVG', validations: { maxSize: 2 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXImageFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_IMAGE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_VIDEO_FILE_TYPE: AXFileType = {\n name: 'video',\n metadata: createFileTypeMetadata('system'),\n title: 'Video',\n icon: 'fa-light fa-video ax-text-blue-500',\n validations: {\n mimeTypes: ['video/*'],\n minSize: 1,\n maxSize: 500 * MB,\n },\n extensions: [\n { name: 'mp4', title: 'MP4' },\n { name: 'webm', title: 'WebM', validations: { maxSize: 200 * MB } },\n { name: 'ogg', title: 'OGG' },\n ],\n};\n\n@Injectable()\nexport class AXVideoFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_VIDEO_FILE_TYPE]);\n }\n}\n","import { Provider, Type } from '@angular/core';\nimport { provideFileTypeInfoProvider, AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { AXAudioFileTypeProvider } from './audio-file-type.provider';\nimport { AXDocumentFileTypeProvider } from './document-file-type.provider';\nimport { AXFileFileTypeProvider } from './file-file-type.provider';\nimport { AXImageFileTypeProvider } from './image-file-type.provider';\nimport { AXVideoFileTypeProvider } from './video-file-type.provider';\n\nexport * from './image-file-type.provider';\nexport * from './video-file-type.provider';\nexport * from './audio-file-type.provider';\nexport * from './file-file-type.provider';\nexport * from './document-file-type.provider';\n\n/** Built-in file type provider classes (one logical type per provider). */\nexport const AX_BUILTIN_FILE_TYPE_PROVIDERS = [\n AXImageFileTypeProvider,\n AXVideoFileTypeProvider,\n AXAudioFileTypeProvider,\n AXFileFileTypeProvider,\n AXDocumentFileTypeProvider,\n] as const satisfies readonly Type<AXFileTypeInfoProvider>[];\n\n/** Registers all built-in file type providers (image, video, audio, file, document). */\nexport function provideBuiltinFileTypeProviders(): Provider[] {\n return AX_BUILTIN_FILE_TYPE_PROVIDERS.map((provider) => provideFileTypeInfoProvider(provider));\n}\n\n/** @deprecated Use {@link provideBuiltinFileTypeProviders}. */\nexport const provideDefaultFileTypeProviders = provideBuiltinFileTypeProviders;\n","export * from './file-type.metadata';\r\r\nexport * from './file-type.models';\r\r\nexport * from './file-type.context';\r\r\nexport * from './file-type.copy';\r\r\nexport * from './file-type.open';\r\r\nexport * from './file-type.resolve';\r\r\nexport * from './file-type.renderer';\r\r\nexport * from './file-type.define';\r\r\nexport * from './file-type.providers';\r\r\nexport * from './file-type-renderer-outlet.component';\r\r\nexport * from './file-type-info-provider';\r\r\nexport * from './file-type-registry.service';\r\r\nexport * from './file-type.merge';\r\r\nexport * from './file-type.validate';\r\r\nexport * from './types.providers';\r\r\nexport * from './rules/file-mime-type.rule';\r\r\nexport * from './rules/file-min-size.rule';\r\r\nexport * from './rules/file-max-size.rule';\r\r\nexport * from './file-validation-rules.bootstrap';\r\r\n\r\r\nimport { Provider } from '@angular/core';\r\r\nimport { AXValidationRegistryService } from '@acorex/core/validation';\r\r\nimport { provideBuiltinFileTypeProviders } from './types.providers';\r\r\nimport { AX_FILE_VALIDATION_RULES, ensureFileValidationRules } from './file-validation-rules.bootstrap';\r\r\n\r\r\nexport { AX_FILE_VALIDATION_RULES } from './file-validation-rules.bootstrap';\r\r\n\r\r\n/** Registers file validation rules with {@link AXValidationRegistryService}. */\r\r\nexport function provideFileValidationRules(): Provider {\r\r\n return {\r\r\n provide: 'AXValidationModuleFactory',\r\r\n useFactory: (registry: AXValidationRegistryService) => () => {\r\r\n ensureFileValidationRules(registry);\r\r\n },\r\r\n deps: [AXValidationRegistryService],\r\r\n multi: true,\r\r\n };\r\r\n}\r\r\n\r\r\n/** Registers built-in image / video / audio / file / document type providers. */\r\r\nexport { provideBuiltinFileTypeProviders, provideDefaultFileTypeProviders } from './types.providers';\r\r\n\r\r\n/**\r\r\n * Registers validation rules and optional built-in file type providers.\r\r\n * {@link AXFileTypeRegistryService} and {@link AXFileService} are `providedIn: 'root'`.\r\r\n */\r\r\nexport function provideFileTypeSystem(): Provider[] {\r\r\n return [provideFileValidationRules(), ...provideBuiltinFileTypeProviders()];\r\r\n}\r\r\n\r","import { AXFormatModule } from '@acorex/core/format';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { AXFileSizeFormatter } from './file-size-formatter';\nimport {\n AX_FILE_VALIDATION_RULES,\n provideDefaultFileTypeProviders,\n provideFileValidationRules,\n} from './file-type';\n\nexport interface AXFileModuleConfig {\n fileTypeProviders?: Provider[];\n includeDefaultFileTypes?: boolean;\n}\n\n@NgModule({\n imports: [\n AXFormatModule.forChild({ formatters: [AXFileSizeFormatter] }),\n AXValidationModule.forChild({ rules: [...AX_FILE_VALIDATION_RULES] }),\n ],\n providers: [AXFileSizeFormatter],\n})\nexport class AXFileModule {\n static forRoot(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n const includeDefaults = config?.includeDefaultFileTypes !== false;\n\n return {\n ngModule: AXFileModule,\n providers: [\n provideFileValidationRules(),\n ...(includeDefaults ? provideDefaultFileTypeProviders() : []),\n ...(config?.fileTypeProviders ?? []),\n ],\n };\n }\n\n static forChild(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n return AXFileModule.forRoot(config);\n }\n}\n","import type { AXValidationRuleResult } from '@acorex/core/validation';\nimport { DOCUMENT, inject, Injectable, isDevMode } from '@angular/core';\nimport { AXFileTypeRegistryService } from './file-type/file-type-registry.service';\nimport type { AXFileType } from './file-type/file-type.models';\n\nexport interface AXFileChooseOptions {\n /** Logical type name(s) from {@link AXFileTypeRegistryService}. When set, files are validated against the catalog. */\n fileType?: string | string[];\n accept?: string;\n multiple?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileService {\n private readonly document = inject(DOCUMENT);\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n\n async getFileTypes(): Promise<AXFileType[]> {\n return this.fileTypes.getTypes();\n }\n\n async getFileType(name: string): Promise<AXFileType | undefined> {\n return this.fileTypes.get(name);\n }\n\n async getAcceptAttribute(fileType?: string | string[]): Promise<string> {\n return this.fileTypes.accept(fileType);\n }\n\n async matchFileType(file: File): Promise<AXFileType | undefined> {\n return this.fileTypes.matchType(file);\n }\n\n validate(file: File, fileType: string | string[]): Promise<AXValidationRuleResult[]> {\n return this.fileTypes.validateAgainstTypes(file, fileType);\n }\n\n validateMany(\n files: File[],\n fileType: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n return this.fileTypes.validateMany(files, fileType);\n }\n\n /**\n * Opens a file selection dialog.\n * With `fileType`, returns files that pass catalog validation (`accept` defaults from the catalog).\n * Without `fileType`, returns all selected files (legacy `accept` / `multiple` only).\n */\n async chooseValidated(\n options: AXFileChooseOptions,\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const resolved = await this.resolveChooseOptions(options);\n const files = await this.openFileDialog(resolved);\n\n if (files.length === 0) {\n return { accepted: [], rejected: [] };\n }\n\n if (options.fileType) {\n return this.validateMany(files, options.fileType);\n }\n\n return { accepted: files, rejected: [] };\n }\n\n async choose(options: AXFileChooseOptions): Promise<File[]> {\n const { accepted } = await this.chooseValidated(options);\n return accepted;\n }\n\n blobToBase64(blob: Blob): Promise<string> {\n if (!(blob instanceof Blob)) {\n return Promise.reject(new Error('input is not blob'));\n }\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(reader.error);\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n }\n\n getSize(file: File | Blob | string): number | false {\n if (this.isBase64(file as string)) {\n return this.getBase64Size(file as string);\n }\n return false;\n }\n\n isBase64(base64: string): boolean {\n const regx = /[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/;\n return regx.test(base64);\n }\n\n getBase64Size(base64: string): number {\n return atob(base64.substring(base64.indexOf(',') + 1)).length;\n }\n\n private async resolveChooseOptions(\n options: AXFileChooseOptions,\n ): Promise<{ accept: string; multiple: boolean }> {\n const multiple = options.multiple ?? false;\n\n if (options.fileType) {\n const accept = options.accept ?? (await this.getAcceptAttribute(options.fileType));\n\n if (isDevMode() && !accept) {\n const name = Array.isArray(options.fileType) ? options.fileType.join(', ') : options.fileType;\n console.warn(\n `[AXFileService] No accept filter for file type \"${name}\". ` +\n 'Register a file type provider (e.g. provideConversationFileCatalog).',\n );\n }\n\n return { accept, multiple };\n }\n\n return { accept: options.accept ?? '', multiple };\n }\n\n private openFileDialog(options: { accept: string; multiple: boolean }): Promise<File[]> {\n return new Promise<File[]>((resolve, reject) => {\n const input: HTMLInputElement = this.document.createElement('input');\n input.style.display = 'none';\n this.document.body.appendChild(input);\n input.type = 'file';\n input.accept = options.accept;\n input.multiple = options.multiple;\n\n const cleanup = () => {\n input.removeEventListener('change', onChange);\n input.removeEventListener('error', onError);\n if (input.parentNode) {\n this.document.body.removeChild(input);\n }\n input.remove();\n };\n\n const onError = (e: Event) => {\n cleanup();\n reject(e);\n };\n\n const onChange = () => {\n const files = Array.from(input.files ?? []);\n cleanup();\n resolve(files);\n };\n\n input.addEventListener('change', onChange);\n input.addEventListener('error', onError);\n input.click();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["MB"],"mappings":"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"}
|
|
@@ -1,92 +1,189 @@
|
|
|
1
1
|
import { AXZIndexService } from '@acorex/core/z-index';
|
|
2
|
+
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
2
3
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { inject, signal, Injectable } from '@angular/core';
|
|
4
|
+
import { inject, PLATFORM_ID, DestroyRef, signal, Injectable } from '@angular/core';
|
|
4
5
|
|
|
5
6
|
class AXFullScreenService {
|
|
6
7
|
constructor() {
|
|
7
8
|
this.zIndexService = inject(AXZIndexService);
|
|
9
|
+
this.document = inject(DOCUMENT);
|
|
10
|
+
this.platformId = inject(PLATFORM_ID);
|
|
11
|
+
this.destroyRef = inject(DestroyRef);
|
|
8
12
|
/**
|
|
9
|
-
* Current fullscreen state
|
|
13
|
+
* Current fullscreen state.
|
|
10
14
|
*/
|
|
11
15
|
this.isFullscreenState = signal(false, /* @ts-ignore */
|
|
12
16
|
...(ngDevMode ? [{ debugName: "isFullscreenState" }] : /* istanbul ignore next */ []));
|
|
13
17
|
/**
|
|
14
|
-
*
|
|
18
|
+
* Active fullscreen element.
|
|
19
|
+
*/
|
|
20
|
+
this.activeElementState = signal(null, /* @ts-ignore */
|
|
21
|
+
...(ngDevMode ? [{ debugName: "activeElementState" }] : /* istanbul ignore next */ []));
|
|
22
|
+
/**
|
|
23
|
+
* Active fullscreen mode.
|
|
24
|
+
*/
|
|
25
|
+
this.currentMode = null;
|
|
26
|
+
/**
|
|
27
|
+
* Original element styles to restore (overlay mode).
|
|
15
28
|
*/
|
|
16
29
|
this.originalStyles = {};
|
|
17
30
|
/**
|
|
18
|
-
* Original parent element reference
|
|
31
|
+
* Original parent element reference (overlay mode).
|
|
19
32
|
*/
|
|
20
33
|
this.originalParent = null;
|
|
21
34
|
/**
|
|
22
|
-
* Fullscreen container element
|
|
35
|
+
* Fullscreen container element (overlay mode).
|
|
23
36
|
*/
|
|
24
37
|
this.fullscreenContainer = null;
|
|
25
38
|
/**
|
|
26
|
-
* Z-index token for
|
|
39
|
+
* Z-index token for overlay fullscreen.
|
|
27
40
|
*/
|
|
28
41
|
this.zToken = null;
|
|
42
|
+
this.fullscreenChangeHandler = () => {
|
|
43
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (this.currentMode !== 'browser') {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const activeElement = this.activeElementState();
|
|
50
|
+
if (!activeElement) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const fullscreenElement = this.getFullscreenElement();
|
|
54
|
+
if (fullscreenElement !== activeElement) {
|
|
55
|
+
this.clearBrowserState();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Read-only signal of the active fullscreen element.
|
|
60
|
+
*/
|
|
61
|
+
this.activeElement = this.activeElementState.asReadonly();
|
|
62
|
+
/**
|
|
63
|
+
* Read-only signal of the fullscreen state.
|
|
64
|
+
*/
|
|
65
|
+
this.fullscreen = this.isFullscreenState.asReadonly();
|
|
66
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
67
|
+
this.document.addEventListener('fullscreenchange', this.fullscreenChangeHandler);
|
|
68
|
+
this.document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);
|
|
69
|
+
this.destroyRef.onDestroy(() => {
|
|
70
|
+
this.document.removeEventListener('fullscreenchange', this.fullscreenChangeHandler);
|
|
71
|
+
this.document.removeEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);
|
|
72
|
+
const activeElement = this.activeElementState();
|
|
73
|
+
if (activeElement) {
|
|
74
|
+
this.exit(activeElement);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
29
78
|
}
|
|
30
79
|
/**
|
|
31
|
-
* Toggle fullscreen state
|
|
80
|
+
* Toggle fullscreen state.
|
|
32
81
|
*/
|
|
33
|
-
toggle(element) {
|
|
34
|
-
if (this.
|
|
82
|
+
toggle(element, mode = 'overlay') {
|
|
83
|
+
if (this.isActive(element)) {
|
|
35
84
|
this.exit(element);
|
|
36
85
|
}
|
|
37
86
|
else {
|
|
38
|
-
this.enter(element);
|
|
87
|
+
this.enter(element, mode);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Enter fullscreen mode.
|
|
92
|
+
*/
|
|
93
|
+
enter(element, mode = 'overlay') {
|
|
94
|
+
if (!element || this.isFullscreenState()) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (mode === 'browser') {
|
|
98
|
+
this.enterBrowser(element);
|
|
99
|
+
return;
|
|
39
100
|
}
|
|
101
|
+
this.enterOverlay(element);
|
|
40
102
|
}
|
|
41
103
|
/**
|
|
42
|
-
*
|
|
104
|
+
* Exit fullscreen mode.
|
|
43
105
|
*/
|
|
44
|
-
|
|
45
|
-
if (this.isFullscreenState())
|
|
106
|
+
exit(element) {
|
|
107
|
+
if (!this.isFullscreenState()) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const activeElement = this.activeElementState();
|
|
111
|
+
const targetElement = element ?? activeElement;
|
|
112
|
+
if (!targetElement || activeElement !== targetElement) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (this.currentMode === 'browser') {
|
|
116
|
+
this.exitBrowser(targetElement);
|
|
46
117
|
return;
|
|
118
|
+
}
|
|
119
|
+
this.exitOverlay(targetElement);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check whether any element is in fullscreen mode.
|
|
123
|
+
*/
|
|
124
|
+
isFullscreen() {
|
|
125
|
+
return this.isFullscreenState();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check whether the given element is the active fullscreen element.
|
|
129
|
+
*/
|
|
130
|
+
isActive(element) {
|
|
131
|
+
return this.activeElementState() === element && this.isFullscreenState();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Returns the currently active fullscreen element, if any.
|
|
135
|
+
*/
|
|
136
|
+
getActiveElement() {
|
|
137
|
+
return this.activeElementState();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Returns the active fullscreen mode, if any.
|
|
141
|
+
*/
|
|
142
|
+
getActiveMode() {
|
|
143
|
+
return this.currentMode;
|
|
144
|
+
}
|
|
145
|
+
enterOverlay(element) {
|
|
146
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
47
149
|
try {
|
|
48
|
-
// Store original styles & parent
|
|
49
150
|
this.storeOriginalStyles(element);
|
|
50
151
|
this.originalParent = element.parentElement;
|
|
51
|
-
// Acquire z-index token
|
|
52
152
|
this.zToken = this.zIndexService.acquire();
|
|
53
|
-
|
|
54
|
-
const container = document.createElement('div');
|
|
153
|
+
const container = this.document.createElement('div');
|
|
55
154
|
container.style.position = 'fixed';
|
|
56
155
|
container.style.top = '0';
|
|
57
156
|
container.style.left = '0';
|
|
58
157
|
container.style.width = '100vw';
|
|
59
158
|
container.style.height = '100vh';
|
|
60
159
|
container.style.zIndex = String(this.zToken.zIndex);
|
|
160
|
+
container.style.backgroundColor = '#ffffff';
|
|
61
161
|
container.style.overflow = 'auto';
|
|
62
|
-
// Move element into container
|
|
63
162
|
container.appendChild(element);
|
|
64
|
-
// Apply fullscreen styles to element
|
|
65
163
|
element.style.position = 'relative';
|
|
66
164
|
element.style.width = '100%';
|
|
67
165
|
element.style.height = '100%';
|
|
68
166
|
element.style.margin = '0';
|
|
69
167
|
element.style.padding = '0';
|
|
70
|
-
|
|
71
|
-
document.body.
|
|
72
|
-
// Prevent body scroll
|
|
73
|
-
document.body.style.overflow = 'hidden';
|
|
168
|
+
this.document.body.appendChild(container);
|
|
169
|
+
this.document.body.style.overflow = 'hidden';
|
|
74
170
|
this.fullscreenContainer = container;
|
|
171
|
+
this.currentMode = 'overlay';
|
|
172
|
+
this.activeElementState.set(element);
|
|
75
173
|
this.isFullscreenState.set(true);
|
|
76
174
|
}
|
|
77
175
|
catch (error) {
|
|
78
|
-
console.error('Error entering fullscreen:', error);
|
|
176
|
+
console.error('Error entering overlay fullscreen:', error);
|
|
79
177
|
this.restoreOriginalStyles(element);
|
|
178
|
+
this.cleanupOverlayResources();
|
|
80
179
|
}
|
|
81
180
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
*/
|
|
85
|
-
exit(element) {
|
|
86
|
-
if (!this.isFullscreenState())
|
|
181
|
+
exitOverlay(element) {
|
|
182
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
87
183
|
return;
|
|
184
|
+
}
|
|
88
185
|
try {
|
|
89
|
-
document.body.style.overflow = '';
|
|
186
|
+
this.document.body.style.overflow = '';
|
|
90
187
|
if (this.fullscreenContainer) {
|
|
91
188
|
if (element.parentElement === this.fullscreenContainer) {
|
|
92
189
|
this.fullscreenContainer.removeChild(element);
|
|
@@ -94,35 +191,94 @@ class AXFullScreenService {
|
|
|
94
191
|
if (this.originalParent?.isConnected && !this.originalParent.contains(element)) {
|
|
95
192
|
this.originalParent.appendChild(element);
|
|
96
193
|
}
|
|
97
|
-
if (this.fullscreenContainer.parentNode === document.body) {
|
|
98
|
-
document.body.removeChild(this.fullscreenContainer);
|
|
194
|
+
if (this.fullscreenContainer.parentNode === this.document.body) {
|
|
195
|
+
this.document.body.removeChild(this.fullscreenContainer);
|
|
99
196
|
}
|
|
100
197
|
}
|
|
101
|
-
this.fullscreenContainer = null;
|
|
102
|
-
this.originalParent = null;
|
|
103
|
-
this.zIndexService.release(this.zToken);
|
|
104
|
-
this.zToken = null;
|
|
105
198
|
this.restoreOriginalStyles(element);
|
|
106
|
-
this.
|
|
199
|
+
this.cleanupOverlayResources();
|
|
200
|
+
this.clearActiveState();
|
|
107
201
|
}
|
|
108
202
|
catch (error) {
|
|
109
|
-
console.error('Error exiting fullscreen:', error);
|
|
110
|
-
this.
|
|
111
|
-
this.
|
|
112
|
-
this.zIndexService.release(this.zToken);
|
|
113
|
-
this.zToken = null;
|
|
114
|
-
this.isFullscreenState.set(false);
|
|
203
|
+
console.error('Error exiting overlay fullscreen:', error);
|
|
204
|
+
this.cleanupOverlayResources();
|
|
205
|
+
this.clearActiveState();
|
|
115
206
|
}
|
|
116
207
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
208
|
+
enterBrowser(element) {
|
|
209
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const requestFullscreen = this.getRequestFullscreen(element);
|
|
213
|
+
if (!requestFullscreen) {
|
|
214
|
+
console.error('Browser fullscreen API is not supported in this environment.');
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
void requestFullscreen()
|
|
218
|
+
.then(() => {
|
|
219
|
+
if (this.getFullscreenElement() !== element) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
this.currentMode = 'browser';
|
|
223
|
+
this.activeElementState.set(element);
|
|
224
|
+
this.isFullscreenState.set(true);
|
|
225
|
+
})
|
|
226
|
+
.catch((error) => {
|
|
227
|
+
console.error('Error entering browser fullscreen:', error);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
exitBrowser(element) {
|
|
231
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const fullscreenElement = this.getFullscreenElement();
|
|
235
|
+
if (fullscreenElement === element) {
|
|
236
|
+
const exitFullscreen = this.getExitFullscreen();
|
|
237
|
+
if (exitFullscreen) {
|
|
238
|
+
void exitFullscreen().catch((error) => {
|
|
239
|
+
console.error('Error exiting browser fullscreen:', error);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
this.clearBrowserState();
|
|
244
|
+
}
|
|
245
|
+
clearBrowserState() {
|
|
246
|
+
this.clearActiveState();
|
|
247
|
+
}
|
|
248
|
+
clearActiveState() {
|
|
249
|
+
this.currentMode = null;
|
|
250
|
+
this.activeElementState.set(null);
|
|
251
|
+
this.isFullscreenState.set(false);
|
|
252
|
+
}
|
|
253
|
+
cleanupOverlayResources() {
|
|
254
|
+
this.fullscreenContainer = null;
|
|
255
|
+
this.originalParent = null;
|
|
256
|
+
this.zIndexService.release(this.zToken);
|
|
257
|
+
this.zToken = null;
|
|
258
|
+
this.originalStyles = {};
|
|
259
|
+
}
|
|
260
|
+
getFullscreenElement() {
|
|
261
|
+
return this.document.fullscreenElement ?? this.document.webkitFullscreenElement ?? null;
|
|
262
|
+
}
|
|
263
|
+
getRequestFullscreen(element) {
|
|
264
|
+
const target = element;
|
|
265
|
+
if (typeof target.requestFullscreen === 'function') {
|
|
266
|
+
return () => target.requestFullscreen();
|
|
267
|
+
}
|
|
268
|
+
if (typeof target.webkitRequestFullscreen === 'function') {
|
|
269
|
+
return () => target.webkitRequestFullscreen();
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
getExitFullscreen() {
|
|
274
|
+
if (typeof this.document.exitFullscreen === 'function') {
|
|
275
|
+
return () => this.document.exitFullscreen();
|
|
276
|
+
}
|
|
277
|
+
if (typeof this.document.webkitExitFullscreen === 'function') {
|
|
278
|
+
return () => this.document.webkitExitFullscreen();
|
|
279
|
+
}
|
|
280
|
+
return null;
|
|
122
281
|
}
|
|
123
|
-
/**
|
|
124
|
-
* Store original computed styles
|
|
125
|
-
*/
|
|
126
282
|
storeOriginalStyles(element) {
|
|
127
283
|
const computed = window.getComputedStyle(element);
|
|
128
284
|
this.originalStyles = {
|
|
@@ -137,15 +293,14 @@ class AXFullScreenService {
|
|
|
137
293
|
padding: computed.padding,
|
|
138
294
|
};
|
|
139
295
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Restore original styles
|
|
142
|
-
*/
|
|
143
296
|
restoreOriginalStyles(element) {
|
|
144
297
|
Object.entries(this.originalStyles).forEach(([key, value]) => {
|
|
145
298
|
if (value) {
|
|
299
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
146
300
|
element.style[key] = value;
|
|
147
301
|
}
|
|
148
302
|
else {
|
|
303
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
149
304
|
element.style[key] = '';
|
|
150
305
|
}
|
|
151
306
|
});
|
|
@@ -159,7 +314,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
159
314
|
args: [{
|
|
160
315
|
providedIn: 'root',
|
|
161
316
|
}]
|
|
162
|
-
}] });
|
|
317
|
+
}], ctorParameters: () => [] });
|
|
163
318
|
|
|
164
319
|
/**
|
|
165
320
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-core-full-screen.mjs","sources":["../../../../packages/core/full-screen/src/lib/full-screen.service.ts","../../../../packages/core/full-screen/src/acorex-core-full-screen.ts"],"sourcesContent":["import { AXZIndexService, AXZToken } from '@acorex/core/z-index';\nimport { inject, Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXFullScreenService {\n private readonly zIndexService = inject(AXZIndexService);\n\n /**\n * Current fullscreen state\n */\n private readonly isFullscreenState = signal<boolean>(false);\n\n /**\n * Original element styles to restore\n */\n private originalStyles: Partial<CSSStyleDeclaration> = {};\n\n /**\n * Original parent element reference\n */\n private originalParent: HTMLElement | null = null;\n\n /**\n * Fullscreen container element\n */\n private fullscreenContainer: HTMLElement | null = null;\n\n /**\n * Z-index token for this fullscreen instance\n */\n private zToken: AXZToken | null = null;\n\n /**\n * Toggle fullscreen state\n */\n toggle(element: HTMLElement): void {\n if (this.isFullscreenState()) {\n this.exit(element);\n } else {\n this.enter(element);\n }\n }\n\n /**\n * Enter fullscreen mode\n */\n enter(element: HTMLElement): void {\n if (this.isFullscreenState()) return;\n\n try {\n // Store original styles & parent\n this.storeOriginalStyles(element);\n this.originalParent = element.parentElement;\n\n // Acquire z-index token\n this.zToken = this.zIndexService.acquire();\n\n // Create fullscreen container\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.top = '0';\n container.style.left = '0';\n container.style.width = '100vw';\n container.style.height = '100vh';\n container.style.zIndex = String(this.zToken.zIndex);\n container.style.overflow = 'auto';\n\n // Move element into container\n container.appendChild(element);\n\n // Apply fullscreen styles to element\n element.style.position = 'relative';\n element.style.width = '100%';\n element.style.height = '100%';\n element.style.margin = '0';\n element.style.padding = '0';\n\n // Append container to body\n document.body.appendChild(container);\n\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n\n this.fullscreenContainer = container;\n this.isFullscreenState.set(true);\n } catch (error) {\n console.error('Error entering fullscreen:', error);\n this.restoreOriginalStyles(element);\n }\n }\n\n /**\n * Exit fullscreen mode\n */\n exit(element: HTMLElement): void {\n if (!this.isFullscreenState()) return;\n\n try {\n document.body.style.overflow = '';\n\n if (this.fullscreenContainer) {\n if (element.parentElement === this.fullscreenContainer) {\n this.fullscreenContainer.removeChild(element);\n }\n\n if (this.originalParent?.isConnected && !this.originalParent.contains(element)) {\n this.originalParent.appendChild(element);\n }\n\n if (this.fullscreenContainer.parentNode === document.body) {\n document.body.removeChild(this.fullscreenContainer);\n }\n }\n\n this.fullscreenContainer = null;\n this.originalParent = null;\n\n this.zIndexService.release(this.zToken);\n this.zToken = null;\n\n this.restoreOriginalStyles(element);\n this.isFullscreenState.set(false);\n } catch (error) {\n console.error('Error exiting fullscreen:', error);\n this.fullscreenContainer = null;\n this.originalParent = null;\n this.zIndexService.release(this.zToken);\n this.zToken = null;\n this.isFullscreenState.set(false);\n }\n }\n\n /**\n * Check fullscreen state\n */\n isFullscreen(): boolean {\n return this.isFullscreenState();\n }\n\n /**\n * Store original computed styles\n */\n private storeOriginalStyles(element: HTMLElement): void {\n const computed = window.getComputedStyle(element);\n\n this.originalStyles = {\n position: computed.position,\n top: computed.top,\n left: computed.left,\n width: computed.width,\n height: computed.height,\n zIndex: computed.zIndex,\n backgroundColor: computed.backgroundColor,\n margin: computed.margin,\n padding: computed.padding,\n };\n }\n\n /**\n * Restore original styles\n */\n private restoreOriginalStyles(element: HTMLElement): void {\n Object.entries(this.originalStyles).forEach(([key, value]) => {\n if (value) {\n (element.style as any)[key] = value;\n } else {\n (element.style as any)[key] = '';\n }\n });\n\n this.originalStyles = {};\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-core-full-screen.mjs","sources":["../../../../packages/core/full-screen/src/lib/full-screen.service.ts","../../../../packages/core/full-screen/src/acorex-core-full-screen.ts"],"sourcesContent":["import { AXZIndexService, AXZToken } from '@acorex/core/z-index';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\n\n/**\n * Fullscreen implementation mode.\n * - `overlay`: CSS fixed container that covers the viewport.\n * - `browser`: Native Fullscreen API via `element.requestFullscreen()`.\n */\nexport type AXFullScreenMode = 'overlay' | 'browser';\n\ntype FullscreenCapableElement = HTMLElement & {\n requestFullscreen?: () => Promise<void>;\n webkitRequestFullscreen?: () => Promise<void>;\n};\n\ntype FullscreenCapableDocument = Document & {\n exitFullscreen?: () => Promise<void>;\n webkitExitFullscreen?: () => Promise<void>;\n fullscreenElement?: Element | null;\n webkitFullscreenElement?: Element | null;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXFullScreenService {\n private readonly zIndexService = inject(AXZIndexService);\n private readonly document = inject(DOCUMENT) as FullscreenCapableDocument;\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * Current fullscreen state.\n */\n private readonly isFullscreenState = signal<boolean>(false);\n\n /**\n * Active fullscreen element.\n */\n private readonly activeElementState = signal<HTMLElement | null>(null);\n\n /**\n * Active fullscreen mode.\n */\n private currentMode: AXFullScreenMode | null = null;\n\n /**\n * Original element styles to restore (overlay mode).\n */\n private originalStyles: Partial<CSSStyleDeclaration> = {};\n\n /**\n * Original parent element reference (overlay mode).\n */\n private originalParent: HTMLElement | null = null;\n\n /**\n * Fullscreen container element (overlay mode).\n */\n private fullscreenContainer: HTMLElement | null = null;\n\n /**\n * Z-index token for overlay fullscreen.\n */\n private zToken: AXZToken | null = null;\n\n private readonly fullscreenChangeHandler = () => {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n if (this.currentMode !== 'browser') {\n return;\n }\n\n const activeElement = this.activeElementState();\n if (!activeElement) {\n return;\n }\n\n const fullscreenElement = this.getFullscreenElement();\n if (fullscreenElement !== activeElement) {\n this.clearBrowserState();\n }\n };\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n this.document.addEventListener('fullscreenchange', this.fullscreenChangeHandler);\n this.document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);\n\n this.destroyRef.onDestroy(() => {\n this.document.removeEventListener('fullscreenchange', this.fullscreenChangeHandler);\n this.document.removeEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);\n\n const activeElement = this.activeElementState();\n if (activeElement) {\n this.exit(activeElement);\n }\n });\n }\n }\n\n /**\n * Toggle fullscreen state.\n */\n toggle(element: HTMLElement, mode: AXFullScreenMode = 'overlay'): void {\n if (this.isActive(element)) {\n this.exit(element);\n } else {\n this.enter(element, mode);\n }\n }\n\n /**\n * Enter fullscreen mode.\n */\n enter(element: HTMLElement, mode: AXFullScreenMode = 'overlay'): void {\n if (!element || this.isFullscreenState()) {\n return;\n }\n\n if (mode === 'browser') {\n this.enterBrowser(element);\n return;\n }\n\n this.enterOverlay(element);\n }\n\n /**\n * Exit fullscreen mode.\n */\n exit(element?: HTMLElement): void {\n if (!this.isFullscreenState()) {\n return;\n }\n\n const activeElement = this.activeElementState();\n const targetElement = element ?? activeElement;\n if (!targetElement || activeElement !== targetElement) {\n return;\n }\n\n if (this.currentMode === 'browser') {\n this.exitBrowser(targetElement);\n return;\n }\n\n this.exitOverlay(targetElement);\n }\n\n /**\n * Check whether any element is in fullscreen mode.\n */\n isFullscreen(): boolean {\n return this.isFullscreenState();\n }\n\n /**\n * Read-only signal of the active fullscreen element.\n */\n readonly activeElement = this.activeElementState.asReadonly();\n\n /**\n * Read-only signal of the fullscreen state.\n */\n readonly fullscreen = this.isFullscreenState.asReadonly();\n\n /**\n * Check whether the given element is the active fullscreen element.\n */\n isActive(element: HTMLElement): boolean {\n return this.activeElementState() === element && this.isFullscreenState();\n }\n\n /**\n * Returns the currently active fullscreen element, if any.\n */\n getActiveElement(): HTMLElement | null {\n return this.activeElementState();\n }\n\n /**\n * Returns the active fullscreen mode, if any.\n */\n getActiveMode(): AXFullScreenMode | null {\n return this.currentMode;\n }\n\n private enterOverlay(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n try {\n this.storeOriginalStyles(element);\n this.originalParent = element.parentElement;\n this.zToken = this.zIndexService.acquire();\n\n const container = this.document.createElement('div');\n container.style.position = 'fixed';\n container.style.top = '0';\n container.style.left = '0';\n container.style.width = '100vw';\n container.style.height = '100vh';\n container.style.zIndex = String(this.zToken.zIndex);\n container.style.backgroundColor = '#ffffff';\n container.style.overflow = 'auto';\n\n container.appendChild(element);\n\n element.style.position = 'relative';\n element.style.width = '100%';\n element.style.height = '100%';\n element.style.margin = '0';\n element.style.padding = '0';\n\n this.document.body.appendChild(container);\n this.document.body.style.overflow = 'hidden';\n\n this.fullscreenContainer = container;\n this.currentMode = 'overlay';\n this.activeElementState.set(element);\n this.isFullscreenState.set(true);\n } catch (error) {\n console.error('Error entering overlay fullscreen:', error);\n this.restoreOriginalStyles(element);\n this.cleanupOverlayResources();\n }\n }\n\n private exitOverlay(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n try {\n this.document.body.style.overflow = '';\n\n if (this.fullscreenContainer) {\n if (element.parentElement === this.fullscreenContainer) {\n this.fullscreenContainer.removeChild(element);\n }\n\n if (this.originalParent?.isConnected && !this.originalParent.contains(element)) {\n this.originalParent.appendChild(element);\n }\n\n if (this.fullscreenContainer.parentNode === this.document.body) {\n this.document.body.removeChild(this.fullscreenContainer);\n }\n }\n\n this.restoreOriginalStyles(element);\n this.cleanupOverlayResources();\n this.clearActiveState();\n } catch (error) {\n console.error('Error exiting overlay fullscreen:', error);\n this.cleanupOverlayResources();\n this.clearActiveState();\n }\n }\n\n private enterBrowser(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const requestFullscreen = this.getRequestFullscreen(element);\n if (!requestFullscreen) {\n console.error('Browser fullscreen API is not supported in this environment.');\n return;\n }\n\n void requestFullscreen()\n .then(() => {\n if (this.getFullscreenElement() !== element) {\n return;\n }\n\n this.currentMode = 'browser';\n this.activeElementState.set(element);\n this.isFullscreenState.set(true);\n })\n .catch((error: unknown) => {\n console.error('Error entering browser fullscreen:', error);\n });\n }\n\n private exitBrowser(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const fullscreenElement = this.getFullscreenElement();\n if (fullscreenElement === element) {\n const exitFullscreen = this.getExitFullscreen();\n if (exitFullscreen) {\n void exitFullscreen().catch((error: unknown) => {\n console.error('Error exiting browser fullscreen:', error);\n });\n }\n }\n\n this.clearBrowserState();\n }\n\n private clearBrowserState(): void {\n this.clearActiveState();\n }\n\n private clearActiveState(): void {\n this.currentMode = null;\n this.activeElementState.set(null);\n this.isFullscreenState.set(false);\n }\n\n private cleanupOverlayResources(): void {\n this.fullscreenContainer = null;\n this.originalParent = null;\n this.zIndexService.release(this.zToken);\n this.zToken = null;\n this.originalStyles = {};\n }\n\n private getFullscreenElement(): Element | null {\n return this.document.fullscreenElement ?? this.document.webkitFullscreenElement ?? null;\n }\n\n private getRequestFullscreen(element: HTMLElement): (() => Promise<void>) | null {\n const target = element as FullscreenCapableElement;\n if (typeof target.requestFullscreen === 'function') {\n return () => target.requestFullscreen!();\n }\n if (typeof target.webkitRequestFullscreen === 'function') {\n return () => target.webkitRequestFullscreen!();\n }\n return null;\n }\n\n private getExitFullscreen(): (() => Promise<void>) | null {\n if (typeof this.document.exitFullscreen === 'function') {\n return () => this.document.exitFullscreen!();\n }\n if (typeof this.document.webkitExitFullscreen === 'function') {\n return () => this.document.webkitExitFullscreen!();\n }\n return null;\n }\n\n private storeOriginalStyles(element: HTMLElement): void {\n const computed = window.getComputedStyle(element);\n\n this.originalStyles = {\n position: computed.position,\n top: computed.top,\n left: computed.left,\n width: computed.width,\n height: computed.height,\n zIndex: computed.zIndex,\n backgroundColor: computed.backgroundColor,\n margin: computed.margin,\n padding: computed.padding,\n };\n }\n\n private restoreOriginalStyles(element: HTMLElement): void {\n Object.entries(this.originalStyles).forEach(([key, value]) => {\n if (value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (element.style as any)[key] = value;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (element.style as any)[key] = '';\n }\n });\n\n this.originalStyles = {};\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/i18n/en-AU/acorex.json
CHANGED
|
@@ -375,10 +375,15 @@
|
|
|
375
375
|
"unpin": "Unpin",
|
|
376
376
|
"choose-image": "Choose Image",
|
|
377
377
|
"change-image": "Change Image",
|
|
378
|
+
"choose-profile": "Choose Profile",
|
|
379
|
+
"change-profile": "Change Profile",
|
|
380
|
+
"edit-profile": "Edit Profile",
|
|
381
|
+
"remove-profile": "Remove Profile",
|
|
378
382
|
"upload-image": "Upload Image",
|
|
379
383
|
"remove-image": "Remove Image",
|
|
380
384
|
"open-in-maps": "Open in Maps",
|
|
381
|
-
"view-attachments": "View all files"
|
|
385
|
+
"view-attachments": "View all files",
|
|
386
|
+
"more": "More"
|
|
382
387
|
},
|
|
383
388
|
"tooltips": {
|
|
384
389
|
"search-in-conversation": "Search in conversation",
|
|
@@ -442,6 +447,8 @@
|
|
|
442
447
|
},
|
|
443
448
|
"new-conversation": {
|
|
444
449
|
"title": "New Conversation",
|
|
450
|
+
"new-group": "New Group",
|
|
451
|
+
"group-name": "Group name",
|
|
445
452
|
"group-details": "Group details",
|
|
446
453
|
"selected-count": "New Conversation ({{ count }} selected)",
|
|
447
454
|
"no-users-search": "No users match your search.",
|
|
@@ -582,9 +589,12 @@
|
|
|
582
589
|
}
|
|
583
590
|
},
|
|
584
591
|
"voice-recorder": {
|
|
585
|
-
"title": "
|
|
592
|
+
"title": "Record voice message",
|
|
586
593
|
"tap-to-start": "Tap to start recording",
|
|
587
|
-
"recording": "Recording"
|
|
594
|
+
"recording": "Recording",
|
|
595
|
+
"stop-recording": "Stop Recording",
|
|
596
|
+
"continue-recording": "Continue Recording",
|
|
597
|
+
"transcribe": "Transcribe"
|
|
588
598
|
},
|
|
589
599
|
"renderer-state": {
|
|
590
600
|
"message-status": "Message status",
|
|
@@ -736,6 +746,7 @@
|
|
|
736
746
|
"play-voice": "Play voice message",
|
|
737
747
|
"pause-voice": "Pause",
|
|
738
748
|
"download-audio": "Download audio",
|
|
749
|
+
"download-file": "Download file",
|
|
739
750
|
"playback-speed": "Playback speed {{ speed }}x",
|
|
740
751
|
"seek": "Seek {{ title }}",
|
|
741
752
|
"images": "images",
|
package/i18n/en-US/acorex.json
CHANGED
|
@@ -375,10 +375,15 @@
|
|
|
375
375
|
"unpin": "Unpin",
|
|
376
376
|
"choose-image": "Choose Image",
|
|
377
377
|
"change-image": "Change Image",
|
|
378
|
+
"choose-profile": "Choose Profile",
|
|
379
|
+
"change-profile": "Change Profile",
|
|
380
|
+
"edit-profile": "Edit Profile",
|
|
381
|
+
"remove-profile": "Remove Profile",
|
|
378
382
|
"upload-image": "Upload Image",
|
|
379
383
|
"remove-image": "Remove Image",
|
|
380
384
|
"open-in-maps": "Open in Maps",
|
|
381
|
-
"view-attachments": "View all files"
|
|
385
|
+
"view-attachments": "View all files",
|
|
386
|
+
"more": "More"
|
|
382
387
|
},
|
|
383
388
|
"tooltips": {
|
|
384
389
|
"search-in-conversation": "Search in conversation",
|
|
@@ -442,6 +447,8 @@
|
|
|
442
447
|
},
|
|
443
448
|
"new-conversation": {
|
|
444
449
|
"title": "New Conversation",
|
|
450
|
+
"new-group": "New Group",
|
|
451
|
+
"group-name": "Group name",
|
|
445
452
|
"group-details": "Group details",
|
|
446
453
|
"selected-count": "New Conversation ({{ count }} selected)",
|
|
447
454
|
"no-users-search": "No users match your search.",
|
|
@@ -582,9 +589,12 @@
|
|
|
582
589
|
}
|
|
583
590
|
},
|
|
584
591
|
"voice-recorder": {
|
|
585
|
-
"title": "
|
|
592
|
+
"title": "Record voice message",
|
|
586
593
|
"tap-to-start": "Tap to start recording",
|
|
587
|
-
"recording": "Recording"
|
|
594
|
+
"recording": "Recording",
|
|
595
|
+
"stop-recording": "Stop Recording",
|
|
596
|
+
"continue-recording": "Continue Recording",
|
|
597
|
+
"transcribe": "Transcribe"
|
|
588
598
|
},
|
|
589
599
|
"renderer-state": {
|
|
590
600
|
"message-status": "Message status",
|
|
@@ -736,6 +746,7 @@
|
|
|
736
746
|
"play-voice": "Play voice message",
|
|
737
747
|
"pause-voice": "Pause",
|
|
738
748
|
"download-audio": "Download audio",
|
|
749
|
+
"download-file": "Download file",
|
|
739
750
|
"playback-speed": "Playback speed {{ speed }}x",
|
|
740
751
|
"seek": "Seek {{ title }}",
|
|
741
752
|
"images": "images",
|
package/i18n/fa-IR/acorex.json
CHANGED
|
@@ -375,10 +375,15 @@
|
|
|
375
375
|
"unpin": "برداشتن از سنجاق",
|
|
376
376
|
"choose-image": "انتخاب تصویر",
|
|
377
377
|
"change-image": "تغییر تصویر",
|
|
378
|
+
"choose-profile": "انتخاب پروفایل",
|
|
379
|
+
"change-profile": "تغییر پروفایل",
|
|
380
|
+
"edit-profile": "ویرایش پروفایل",
|
|
381
|
+
"remove-profile": "حذف پروفایل",
|
|
378
382
|
"upload-image": "بارگذاری تصویر",
|
|
379
383
|
"remove-image": "حذف تصویر",
|
|
380
384
|
"open-in-maps": "باز کردن در نقشه",
|
|
381
|
-
"view-attachments": "مشاهده همه فایلها"
|
|
385
|
+
"view-attachments": "مشاهده همه فایلها",
|
|
386
|
+
"more": "بیشتر"
|
|
382
387
|
},
|
|
383
388
|
"tooltips": {
|
|
384
389
|
"search-in-conversation": "جستجو در گفتگو",
|
|
@@ -442,6 +447,8 @@
|
|
|
442
447
|
},
|
|
443
448
|
"new-conversation": {
|
|
444
449
|
"title": "گفتگوی جدید",
|
|
450
|
+
"new-group": "گروه جدید",
|
|
451
|
+
"group-name": "نام گروه",
|
|
445
452
|
"group-details": "جزئیات گروه",
|
|
446
453
|
"selected-count": "گفتگوی جدید ({{ count }} انتخاب شده)",
|
|
447
454
|
"no-users-search": "کاربری با جستجوی شما یافت نشد.",
|
|
@@ -582,9 +589,12 @@
|
|
|
582
589
|
}
|
|
583
590
|
},
|
|
584
591
|
"voice-recorder": {
|
|
585
|
-
"title": "پیام صوتی",
|
|
592
|
+
"title": "ضبط پیام صوتی",
|
|
586
593
|
"tap-to-start": "برای شروع ضبط لمس کنید",
|
|
587
|
-
"recording": "در حال ضبط"
|
|
594
|
+
"recording": "در حال ضبط",
|
|
595
|
+
"stop-recording": "توقف ضبط",
|
|
596
|
+
"continue-recording": "ادامه ضبط",
|
|
597
|
+
"transcribe": "رونویسی"
|
|
588
598
|
},
|
|
589
599
|
"renderer-state": {
|
|
590
600
|
"message-status": "وضعیت پیام",
|
|
@@ -736,6 +746,7 @@
|
|
|
736
746
|
"play-voice": "پخش پیام صوتی",
|
|
737
747
|
"pause-voice": "توقف",
|
|
738
748
|
"download-audio": "دانلود صوت",
|
|
749
|
+
"download-file": "دانلود فایل",
|
|
739
750
|
"playback-speed": "سرعت پخش {{ speed }}x",
|
|
740
751
|
"seek": "جابجایی {{ title }}",
|
|
741
752
|
"images": "تصویر",
|
package/package.json
CHANGED
|
@@ -236,6 +236,7 @@ declare class AXFileTypeRendererOutletComponent {
|
|
|
236
236
|
readonly resolvedComponent: i0.WritableSignal<Type<unknown>>;
|
|
237
237
|
readonly loading: i0.WritableSignal<boolean>;
|
|
238
238
|
readonly mergedInputs: i0.WritableSignal<Record<string, unknown>>;
|
|
239
|
+
private loadId;
|
|
239
240
|
constructor();
|
|
240
241
|
static ɵfac: i0.ɵɵFactoryDeclaration<AXFileTypeRendererOutletComponent, never>;
|
|
241
242
|
static ɵcmp: i0.ɵɵComponentDeclaration<AXFileTypeRendererOutletComponent, "ax-file-type-renderer", never, { "fileType": { "alias": "fileType"; "required": true; "isSignal": true; }; "payload": { "alias": "payload"; "required": true; "isSignal": true; }; "extensionHint": { "alias": "extensionHint"; "required": false; "isSignal": true; }; "inputs": { "alias": "inputs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
@@ -1,53 +1,97 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Fullscreen implementation mode.
|
|
5
|
+
* - `overlay`: CSS fixed container that covers the viewport.
|
|
6
|
+
* - `browser`: Native Fullscreen API via `element.requestFullscreen()`.
|
|
7
|
+
*/
|
|
8
|
+
type AXFullScreenMode = 'overlay' | 'browser';
|
|
3
9
|
declare class AXFullScreenService {
|
|
4
10
|
private readonly zIndexService;
|
|
11
|
+
private readonly document;
|
|
12
|
+
private readonly platformId;
|
|
13
|
+
private readonly destroyRef;
|
|
5
14
|
/**
|
|
6
|
-
* Current fullscreen state
|
|
15
|
+
* Current fullscreen state.
|
|
7
16
|
*/
|
|
8
17
|
private readonly isFullscreenState;
|
|
9
18
|
/**
|
|
10
|
-
*
|
|
19
|
+
* Active fullscreen element.
|
|
20
|
+
*/
|
|
21
|
+
private readonly activeElementState;
|
|
22
|
+
/**
|
|
23
|
+
* Active fullscreen mode.
|
|
24
|
+
*/
|
|
25
|
+
private currentMode;
|
|
26
|
+
/**
|
|
27
|
+
* Original element styles to restore (overlay mode).
|
|
11
28
|
*/
|
|
12
29
|
private originalStyles;
|
|
13
30
|
/**
|
|
14
|
-
* Original parent element reference
|
|
31
|
+
* Original parent element reference (overlay mode).
|
|
15
32
|
*/
|
|
16
33
|
private originalParent;
|
|
17
34
|
/**
|
|
18
|
-
* Fullscreen container element
|
|
35
|
+
* Fullscreen container element (overlay mode).
|
|
19
36
|
*/
|
|
20
37
|
private fullscreenContainer;
|
|
21
38
|
/**
|
|
22
|
-
* Z-index token for
|
|
39
|
+
* Z-index token for overlay fullscreen.
|
|
23
40
|
*/
|
|
24
41
|
private zToken;
|
|
42
|
+
private readonly fullscreenChangeHandler;
|
|
43
|
+
constructor();
|
|
25
44
|
/**
|
|
26
|
-
* Toggle fullscreen state
|
|
45
|
+
* Toggle fullscreen state.
|
|
27
46
|
*/
|
|
28
|
-
toggle(element: HTMLElement): void;
|
|
47
|
+
toggle(element: HTMLElement, mode?: AXFullScreenMode): void;
|
|
29
48
|
/**
|
|
30
|
-
* Enter fullscreen mode
|
|
49
|
+
* Enter fullscreen mode.
|
|
31
50
|
*/
|
|
32
|
-
enter(element: HTMLElement): void;
|
|
51
|
+
enter(element: HTMLElement, mode?: AXFullScreenMode): void;
|
|
33
52
|
/**
|
|
34
|
-
* Exit fullscreen mode
|
|
53
|
+
* Exit fullscreen mode.
|
|
35
54
|
*/
|
|
36
|
-
exit(element
|
|
55
|
+
exit(element?: HTMLElement): void;
|
|
37
56
|
/**
|
|
38
|
-
* Check fullscreen
|
|
57
|
+
* Check whether any element is in fullscreen mode.
|
|
39
58
|
*/
|
|
40
59
|
isFullscreen(): boolean;
|
|
41
60
|
/**
|
|
42
|
-
*
|
|
61
|
+
* Read-only signal of the active fullscreen element.
|
|
43
62
|
*/
|
|
44
|
-
|
|
63
|
+
readonly activeElement: _angular_core.Signal<HTMLElement>;
|
|
64
|
+
/**
|
|
65
|
+
* Read-only signal of the fullscreen state.
|
|
66
|
+
*/
|
|
67
|
+
readonly fullscreen: _angular_core.Signal<boolean>;
|
|
68
|
+
/**
|
|
69
|
+
* Check whether the given element is the active fullscreen element.
|
|
70
|
+
*/
|
|
71
|
+
isActive(element: HTMLElement): boolean;
|
|
45
72
|
/**
|
|
46
|
-
*
|
|
73
|
+
* Returns the currently active fullscreen element, if any.
|
|
47
74
|
*/
|
|
75
|
+
getActiveElement(): HTMLElement | null;
|
|
76
|
+
/**
|
|
77
|
+
* Returns the active fullscreen mode, if any.
|
|
78
|
+
*/
|
|
79
|
+
getActiveMode(): AXFullScreenMode | null;
|
|
80
|
+
private enterOverlay;
|
|
81
|
+
private exitOverlay;
|
|
82
|
+
private enterBrowser;
|
|
83
|
+
private exitBrowser;
|
|
84
|
+
private clearBrowserState;
|
|
85
|
+
private clearActiveState;
|
|
86
|
+
private cleanupOverlayResources;
|
|
87
|
+
private getFullscreenElement;
|
|
88
|
+
private getRequestFullscreen;
|
|
89
|
+
private getExitFullscreen;
|
|
90
|
+
private storeOriginalStyles;
|
|
48
91
|
private restoreOriginalStyles;
|
|
49
|
-
static ɵfac:
|
|
50
|
-
static ɵprov:
|
|
92
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFullScreenService, never>;
|
|
93
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFullScreenService>;
|
|
51
94
|
}
|
|
52
95
|
|
|
53
96
|
export { AXFullScreenService };
|
|
97
|
+
export type { AXFullScreenMode };
|