@xui/file-input 2.0.0-alpha.20 → 2.0.0-alpha.22

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.
@@ -56,18 +56,28 @@ class XuiFileInput {
56
56
  /** The user-defined classes on the trigger. Merged last so they win. */
57
57
  class = input('', /* @ts-ignore */
58
58
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
59
+ /** Control height, from the shared control scale. */
59
60
  size = input(this.config.size, /* @ts-ignore */
60
61
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
62
+ /** Stretch to the available width instead of hugging its contents. */
61
63
  fill = input(this.config.fill, { ...(ngDevMode ? { debugName: "fill" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
62
64
  /** Placeholder shown before anything is chosen. */
63
65
  text = input('Choose a file…', /* @ts-ignore */
64
66
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
67
+ /** Label of the browse button. */
65
68
  buttonText = input('Browse', /* @ts-ignore */
66
69
  ...(ngDevMode ? [{ debugName: "buttonText" }] : /* istanbul ignore next */ []));
70
+ /**
71
+ * Passed to the native input's `accept` — a comma-separated list of extensions or MIME types. A filter for the file
72
+ * chooser, not validation: check the chosen files yourself.
73
+ */
67
74
  accept = input(null, /* @ts-ignore */
68
75
  ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
76
+ /** Allow more than one file to be chosen. */
69
77
  multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
78
+ /** Accessible name for the control. Falls back to the displayed text, which is the file name once one is chosen. */
70
79
  ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
80
+ /** Block interaction and dim the control. */
71
81
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
72
82
  cva = createXValueAccessor({
73
83
  // The browser forbids programmatically setting a file input's value, so the
@@ -1 +1 @@
1
- {"version":3,"file":"xui-file-input.mjs","sources":["../../../../../../libs/ui/file-input/xui/src/lib/file-input.token.ts","../../../../../../libs/ui/file-input/xui/src/lib/file-input.ts","../../../../../../libs/ui/file-input/xui/src/index.ts","../../../../../../libs/ui/file-input/xui/src/xui-file-input.ts"],"sourcesContent":["import { createXConfigToken } from '@xui/core';\nimport { XuiFileInputVariants } from './file-input';\n\nexport interface XuiFileInputConfig {\n size: XuiFileInputVariants['size'];\n fill: boolean;\n}\n\nexport const [injectXuiFileInputConfig, provideXuiFileInputConfig] = createXConfigToken<XuiFileInputConfig>(\n 'XuiFileInputConfig',\n {\n size: 'md',\n fill: false\n }\n);\n","import type { BooleanInput } from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n signal,\n viewChild,\n type Signal\n} from '@angular/core';\nimport { ControlValueAccessor, type NgControl } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { matUploadFileRound } from '@ng-icons/material-icons/round';\nimport { xui } from '@xui/core';\nimport { uniqueId } from '@xui/core/a11y';\nimport { XFormFieldControl } from '@xui/core/form-field';\nimport { createXErrorState, createXValueAccessor, provideXValueAccessor } from '@xui/core/forms';\nimport { XuiIcon } from '@xui/icon';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { ClassValue } from 'clsx';\nimport { injectXuiFileInputConfig } from './file-input.token';\n\nexport const fileInputVariants = cva(\n 'border-border bg-surface-inset text-foreground-muted focus-within:border-focus flex cursor-pointer items-center gap-2 rounded-lg border pe-1 transition-colors has-disabled:cursor-not-allowed has-disabled:opacity-50',\n {\n variants: {\n size: {\n md: 'h-(--control-height-md) ps-(--control-padding-md) text-sm',\n sm: 'h-(--control-height-sm) ps-(--control-padding-sm) text-xs'\n },\n fill: {\n true: 'w-full',\n false: 'w-auto'\n }\n },\n defaultVariants: { size: 'md', fill: false }\n }\n);\n\nexport type XuiFileInputVariants = VariantProps<typeof fileInputVariants>;\n\n/**\n * A styled file picker.\n *\n * ```html\n * <xui-file-input [(ngModel)]=\"files\" accept=\"image/*\" multiple />\n * ```\n *\n * Wraps a real hidden `<input type=\"file\">`, so the native picker, `accept` and\n * `multiple` all work — this only dresses the trigger and shows the selection.\n * Its value is the `FileList` (or `null`), and it is a `ControlValueAccessor`.\n * A file input is write-only in the DOM for security, so `writeValue` can only\n * clear it, never pre-fill a selection.\n */\n@Component({\n selector: 'xui-file-input',\n imports: [NgIcon, XuiIcon],\n viewProviders: [provideIcons({ matUploadFileRound })],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n provideXValueAccessor(() => XuiFileInput),\n {\n provide: XFormFieldControl,\n useExisting: forwardRef(() => XuiFileInput)\n }\n ],\n template: `\n <label [class]=\"computedClass()\">\n <ng-icon xui size=\"sm\" name=\"matUploadFileRound\" class=\"shrink-0\" />\n <span class=\"min-w-0 flex-1 truncate\" [class.text-foreground]=\"hasSelection()\">{{ label() }}</span>\n <span\n class=\"bg-surface-raised border-border text-foreground my-0.5 me-0.5 flex shrink-0 items-center rounded-md border px-(--control-padding-sm) text-xs font-medium\"\n >\n {{ buttonText() }}\n </span>\n <input\n #field\n [id]=\"fieldId\"\n type=\"file\"\n class=\"sr-only\"\n [attr.accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel() ?? text()\"\n (change)=\"onSelect(field.files)\"\n (blur)=\"cva.markTouched()\"\n />\n </label>\n `,\n host: {\n class: 'block'\n }\n})\nexport class XuiFileInput implements ControlValueAccessor, XFormFieldControl {\n private readonly config = injectXuiFileInputConfig();\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\n private readonly formState = createXErrorState();\n protected readonly fieldId = uniqueId('xui-file-input');\n\n /** Error state for `xui-form-field`, derived from the optional bound form control. */\n readonly errorState = this.formState.errorState;\n\n /** Points the form field's `<label for>` at the real file input, not the host. */\n readonly controlId: Signal<string | null> = signal(this.fieldId).asReadonly();\n\n get ngControl(): NgControl | null {\n return this.formState.ngControl();\n }\n\n /** The user-defined classes on the trigger. Merged last so they win. */\n readonly class = input<ClassValue>('');\n readonly size = input<XuiFileInputVariants['size']>(this.config.size);\n readonly fill = input<boolean, BooleanInput>(this.config.fill, { transform: booleanAttribute });\n\n /** Placeholder shown before anything is chosen. */\n readonly text = input('Choose a file…');\n readonly buttonText = input('Browse');\n readonly accept = input<string | null>(null);\n readonly multiple = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n protected readonly cva = createXValueAccessor<FileList | null>({\n // The browser forbids programmatically setting a file input's value, so the\n // only write we can honour is a reset to empty.\n onWrite: value => {\n if (!value) {\n this.selection.set(null);\n this.field().nativeElement.value = '';\n }\n },\n disabled: this.disabled\n });\n protected readonly isDisabled = this.cva.disabled;\n\n private readonly selection = signal<FileList | null>(null);\n protected readonly hasSelection = computed(() => (this.selection()?.length ?? 0) > 0);\n\n /** The current selection: the picker's filename(s), or the placeholder. */\n protected readonly label = computed(() => {\n const files = this.selection();\n\n if (!files || files.length === 0) {\n return this.text();\n }\n\n return files.length === 1 ? files[0].name : `${files.length} files`;\n });\n\n protected readonly computedClass = computed(() =>\n xui(fileInputVariants({ size: this.size(), fill: this.fill() }), this.class())\n );\n\n protected onSelect(files: FileList | null): void {\n const value = files && files.length ? files : null;\n this.selection.set(value);\n this.cva.notifyChange(value);\n this.cva.markTouched();\n }\n\n readonly writeValue = this.cva.writeValue;\n readonly registerOnChange = this.cva.registerOnChange;\n readonly registerOnTouched = this.cva.registerOnTouched;\n readonly setDisabledState = this.cva.setDisabledState;\n}\n","import { XuiFileInput } from './lib/file-input';\n\nexport * from './lib/file-input';\nexport * from './lib/file-input.token';\n\nexport const XuiFileInputImports = [XuiFileInput] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xui-file-input.mjs","sources":["../../../../../../libs/ui/file-input/xui/src/lib/file-input.token.ts","../../../../../../libs/ui/file-input/xui/src/lib/file-input.ts","../../../../../../libs/ui/file-input/xui/src/index.ts","../../../../../../libs/ui/file-input/xui/src/xui-file-input.ts"],"sourcesContent":["import { createXConfigToken } from '@xui/core';\nimport { XuiFileInputVariants } from './file-input';\n\nexport interface XuiFileInputConfig {\n size: XuiFileInputVariants['size'];\n fill: boolean;\n}\n\nexport const [injectXuiFileInputConfig, provideXuiFileInputConfig] = createXConfigToken<XuiFileInputConfig>(\n 'XuiFileInputConfig',\n {\n size: 'md',\n fill: false\n }\n);\n","import type { BooleanInput } from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n signal,\n viewChild,\n type Signal\n} from '@angular/core';\nimport { ControlValueAccessor, type NgControl } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { matUploadFileRound } from '@ng-icons/material-icons/round';\nimport { xui } from '@xui/core';\nimport { uniqueId } from '@xui/core/a11y';\nimport { XFormFieldControl } from '@xui/core/form-field';\nimport { createXErrorState, createXValueAccessor, provideXValueAccessor } from '@xui/core/forms';\nimport { XuiIcon } from '@xui/icon';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { ClassValue } from 'clsx';\nimport { injectXuiFileInputConfig } from './file-input.token';\n\nexport const fileInputVariants = cva(\n 'border-border bg-surface-inset text-foreground-muted focus-within:border-focus flex cursor-pointer items-center gap-2 rounded-lg border pe-1 transition-colors has-disabled:cursor-not-allowed has-disabled:opacity-50',\n {\n variants: {\n size: {\n md: 'h-(--control-height-md) ps-(--control-padding-md) text-sm',\n sm: 'h-(--control-height-sm) ps-(--control-padding-sm) text-xs'\n },\n fill: {\n true: 'w-full',\n false: 'w-auto'\n }\n },\n defaultVariants: { size: 'md', fill: false }\n }\n);\n\nexport type XuiFileInputVariants = VariantProps<typeof fileInputVariants>;\n\n/**\n * A styled file picker.\n *\n * ```html\n * <xui-file-input [(ngModel)]=\"files\" accept=\"image/*\" multiple />\n * ```\n *\n * Wraps a real hidden `<input type=\"file\">`, so the native picker, `accept` and\n * `multiple` all work — this only dresses the trigger and shows the selection.\n * Its value is the `FileList` (or `null`), and it is a `ControlValueAccessor`.\n * A file input is write-only in the DOM for security, so `writeValue` can only\n * clear it, never pre-fill a selection.\n */\n@Component({\n selector: 'xui-file-input',\n imports: [NgIcon, XuiIcon],\n viewProviders: [provideIcons({ matUploadFileRound })],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n provideXValueAccessor(() => XuiFileInput),\n {\n provide: XFormFieldControl,\n useExisting: forwardRef(() => XuiFileInput)\n }\n ],\n template: `\n <label [class]=\"computedClass()\">\n <ng-icon xui size=\"sm\" name=\"matUploadFileRound\" class=\"shrink-0\" />\n <span class=\"min-w-0 flex-1 truncate\" [class.text-foreground]=\"hasSelection()\">{{ label() }}</span>\n <span\n class=\"bg-surface-raised border-border text-foreground my-0.5 me-0.5 flex shrink-0 items-center rounded-md border px-(--control-padding-sm) text-xs font-medium\"\n >\n {{ buttonText() }}\n </span>\n <input\n #field\n [id]=\"fieldId\"\n type=\"file\"\n class=\"sr-only\"\n [attr.accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel() ?? text()\"\n (change)=\"onSelect(field.files)\"\n (blur)=\"cva.markTouched()\"\n />\n </label>\n `,\n host: {\n class: 'block'\n }\n})\nexport class XuiFileInput implements ControlValueAccessor, XFormFieldControl {\n private readonly config = injectXuiFileInputConfig();\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\n private readonly formState = createXErrorState();\n protected readonly fieldId = uniqueId('xui-file-input');\n\n /** Error state for `xui-form-field`, derived from the optional bound form control. */\n readonly errorState = this.formState.errorState;\n\n /** Points the form field's `<label for>` at the real file input, not the host. */\n readonly controlId: Signal<string | null> = signal(this.fieldId).asReadonly();\n\n get ngControl(): NgControl | null {\n return this.formState.ngControl();\n }\n\n /** The user-defined classes on the trigger. Merged last so they win. */\n readonly class = input<ClassValue>('');\n /** Control height, from the shared control scale. */\n readonly size = input<XuiFileInputVariants['size']>(this.config.size);\n /** Stretch to the available width instead of hugging its contents. */\n readonly fill = input<boolean, BooleanInput>(this.config.fill, { transform: booleanAttribute });\n\n /** Placeholder shown before anything is chosen. */\n readonly text = input('Choose a file…');\n /** Label of the browse button. */\n readonly buttonText = input('Browse');\n /**\n * Passed to the native input's `accept` — a comma-separated list of extensions or MIME types. A filter for the file\n * chooser, not validation: check the chosen files yourself.\n */\n readonly accept = input<string | null>(null);\n /** Allow more than one file to be chosen. */\n readonly multiple = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n /** Accessible name for the control. Falls back to the displayed text, which is the file name once one is chosen. */\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n\n /** Block interaction and dim the control. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n protected readonly cva = createXValueAccessor<FileList | null>({\n // The browser forbids programmatically setting a file input's value, so the\n // only write we can honour is a reset to empty.\n onWrite: value => {\n if (!value) {\n this.selection.set(null);\n this.field().nativeElement.value = '';\n }\n },\n disabled: this.disabled\n });\n protected readonly isDisabled = this.cva.disabled;\n\n private readonly selection = signal<FileList | null>(null);\n protected readonly hasSelection = computed(() => (this.selection()?.length ?? 0) > 0);\n\n /** The current selection: the picker's filename(s), or the placeholder. */\n protected readonly label = computed(() => {\n const files = this.selection();\n\n if (!files || files.length === 0) {\n return this.text();\n }\n\n return files.length === 1 ? files[0].name : `${files.length} files`;\n });\n\n protected readonly computedClass = computed(() =>\n xui(fileInputVariants({ size: this.size(), fill: this.fill() }), this.class())\n );\n\n protected onSelect(files: FileList | null): void {\n const value = files && files.length ? files : null;\n this.selection.set(value);\n this.cva.notifyChange(value);\n this.cva.markTouched();\n }\n\n readonly writeValue = this.cva.writeValue;\n readonly registerOnChange = this.cva.registerOnChange;\n readonly registerOnTouched = this.cva.registerOnTouched;\n readonly setDisabledState = this.cva.setDisabledState;\n}\n","import { XuiFileInput } from './lib/file-input';\n\nexport * from './lib/file-input';\nexport * from './lib/file-input.token';\n\nexport const XuiFileInputImports = [XuiFileInput] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xui/file-input",
3
- "version": "2.0.0-alpha.20",
3
+ "version": "2.0.0-alpha.22",
4
4
  "description": "Modern Angular 22 UI Library based on TailwindCSS",
5
5
  "keywords": [
6
6
  "angular",
@@ -41,8 +41,8 @@
41
41
  "@angular/forms": "22",
42
42
  "@ng-icons/core": "34",
43
43
  "@ng-icons/material-icons": "34",
44
- "@xui/core": "2.0.0-alpha.20",
45
- "@xui/icon": "2.0.0-alpha.20",
44
+ "@xui/core": "2.0.0-alpha.22",
45
+ "@xui/icon": "2.0.0-alpha.22",
46
46
  "class-variance-authority": "^0.7.1",
47
47
  "clsx": "^2.1.1"
48
48
  },
@@ -38,14 +38,24 @@ declare class XuiFileInput implements ControlValueAccessor, XFormFieldControl {
38
38
  get ngControl(): NgControl | null;
39
39
  /** The user-defined classes on the trigger. Merged last so they win. */
40
40
  readonly class: _angular_core.InputSignal<ClassValue>;
41
+ /** Control height, from the shared control scale. */
41
42
  readonly size: _angular_core.InputSignal<"md" | "sm" | null | undefined>;
43
+ /** Stretch to the available width instead of hugging its contents. */
42
44
  readonly fill: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
43
45
  /** Placeholder shown before anything is chosen. */
44
46
  readonly text: _angular_core.InputSignal<string>;
47
+ /** Label of the browse button. */
45
48
  readonly buttonText: _angular_core.InputSignal<string>;
49
+ /**
50
+ * Passed to the native input's `accept` — a comma-separated list of extensions or MIME types. A filter for the file
51
+ * chooser, not validation: check the chosen files yourself.
52
+ */
46
53
  readonly accept: _angular_core.InputSignal<string | null>;
54
+ /** Allow more than one file to be chosen. */
47
55
  readonly multiple: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
56
+ /** Accessible name for the control. Falls back to the displayed text, which is the file name once one is chosen. */
48
57
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
58
+ /** Block interaction and dim the control. */
49
59
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
50
60
  protected readonly cva: _xui_core_forms.XValueAccessor<FileList | null>;
51
61
  protected readonly isDisabled: Signal<boolean>;