@muxima-ui/core 1.4.1 → 1.5.0
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/README.md +11 -0
- package/fesm2022/muxima-ui-core-alert.mjs +5 -3
- package/fesm2022/muxima-ui-core-alert.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-breadcrumb.mjs +5 -3
- package/fesm2022/muxima-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-carousel.mjs +19 -17
- package/fesm2022/muxima-ui-core-carousel.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-chips.mjs +19 -14
- package/fesm2022/muxima-ui-core-chips.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-clipboard.mjs +10 -6
- package/fesm2022/muxima-ui-core-clipboard.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-color-picker.mjs +53 -50
- package/fesm2022/muxima-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-combobox.mjs +15 -12
- package/fesm2022/muxima-ui-core-combobox.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-command.mjs +21 -16
- package/fesm2022/muxima-ui-core-command.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-data-grid.mjs +50 -52
- package/fesm2022/muxima-ui-core-data-grid.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-date-picker.mjs +97 -69
- package/fesm2022/muxima-ui-core-date-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-editor.mjs +25 -19
- package/fesm2022/muxima-ui-core-editor.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-file-upload.mjs +30 -25
- package/fesm2022/muxima-ui-core-file-upload.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-i18n.mjs +550 -0
- package/fesm2022/muxima-ui-core-i18n.mjs.map +1 -0
- package/fesm2022/muxima-ui-core-image-cropper.mjs +27 -24
- package/fesm2022/muxima-ui-core-image-cropper.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-kanban.mjs +22 -19
- package/fesm2022/muxima-ui-core-kanban.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-notification-center.mjs +41 -36
- package/fesm2022/muxima-ui-core-notification-center.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-pagination.mjs +29 -26
- package/fesm2022/muxima-ui-core-pagination.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-progress.mjs +5 -3
- package/fesm2022/muxima-ui-core-progress.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-rating.mjs +12 -8
- package/fesm2022/muxima-ui-core-rating.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-select.mjs +14 -11
- package/fesm2022/muxima-ui-core-select.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-sidebar.mjs +10 -7
- package/fesm2022/muxima-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-slider.mjs +8 -6
- package/fesm2022/muxima-ui-core-slider.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-stepper.mjs +5 -3
- package/fesm2022/muxima-ui-core-stepper.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-table.mjs +4 -4
- package/fesm2022/muxima-ui-core-table.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-time-picker.mjs +7 -5
- package/fesm2022/muxima-ui-core-time-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-toast.mjs +8 -5
- package/fesm2022/muxima-ui-core-toast.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-tour.mjs +10 -11
- package/fesm2022/muxima-ui-core-tour.mjs.map +1 -1
- package/fesm2022/muxima-ui-core.mjs +1 -1
- package/fesm2022/muxima-ui-core.mjs.map +1 -1
- package/package.json +5 -1
- package/types/muxima-ui-core-alert.d.ts +3 -1
- package/types/muxima-ui-core-breadcrumb.d.ts +6 -4
- package/types/muxima-ui-core-carousel.d.ts +4 -2
- package/types/muxima-ui-core-chips.d.ts +23 -3
- package/types/muxima-ui-core-clipboard.d.ts +6 -3
- package/types/muxima-ui-core-color-picker.d.ts +40 -7
- package/types/muxima-ui-core-combobox.d.ts +6 -3
- package/types/muxima-ui-core-command.d.ts +7 -3
- package/types/muxima-ui-core-data-grid.d.ts +31 -11
- package/types/muxima-ui-core-date-picker.d.ts +59 -14
- package/types/muxima-ui-core-editor.d.ts +13 -2
- package/types/muxima-ui-core-file-upload.d.ts +22 -6
- package/types/muxima-ui-core-i18n.d.ts +322 -0
- package/types/muxima-ui-core-image-cropper.d.ts +19 -6
- package/types/muxima-ui-core-kanban.d.ts +16 -3
- package/types/muxima-ui-core-notification-center.d.ts +30 -8
- package/types/muxima-ui-core-pagination.d.ts +16 -1
- package/types/muxima-ui-core-progress.d.ts +10 -8
- package/types/muxima-ui-core-rating.d.ts +6 -2
- package/types/muxima-ui-core-select.d.ts +6 -3
- package/types/muxima-ui-core-sidebar.d.ts +6 -3
- package/types/muxima-ui-core-slider.d.ts +4 -2
- package/types/muxima-ui-core-stepper.d.ts +10 -8
- package/types/muxima-ui-core-table.d.ts +3 -3
- package/types/muxima-ui-core-time-picker.d.ts +3 -1
- package/types/muxima-ui-core-toast.d.ts +3 -0
- package/types/muxima-ui-core-tour.d.ts +6 -1
- package/types/muxima-ui-core.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxima-ui-core-select.mjs","sources":["../../../projects/core/select/select.ts","../../../projects/core/select/muxima-ui-core-select.ts"],"sourcesContent":["import { ActiveDescendantKeyManager, Highlightable } from '@angular/cdk/a11y';\nimport { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n Injector,\n computed,\n contentChildren,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport {\n MX_FORM_FIELD_CONTROL,\n MxFormField,\n MxFormFieldControl,\n mxUniqueId,\n} from '@muxima-ui/core/form-field';\n\n/** Opção de um `<mx-select>`. */\n@Component({\n selector: 'mx-option',\n template: `<ng-content />`,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mx-option',\n role: 'option',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled ? \"true\" : null',\n '[attr.data-active]': 'active() ? \"\" : null',\n '(click)': 'select()',\n '(mousedown)': '$event.preventDefault()',\n },\n})\nexport class MxOption<T = unknown> implements Highlightable {\n readonly value = input.required<T>();\n readonly optionDisabled = input(false, { alias: 'disabled', transform: booleanAttribute });\n\n /** Lido pelo gestor de teclado do CDK. */\n get disabled(): boolean {\n return this.optionDisabled();\n }\n\n readonly id = mxUniqueId('mx-option');\n readonly active = signal(false);\n\n private readonly parent = inject<MxSelect<T>>(MxSelect);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n readonly selected = computed(() => this.parent.isSelected(this.value()));\n\n /** Texto usado no gatilho e na pesquisa por letra. */\n getLabel(): string {\n return (this.element.textContent ?? '').trim();\n }\n\n setActiveStyles(): void {\n this.active.set(true);\n this.element.scrollIntoView?.({ block: 'nearest' });\n }\n\n setInactiveStyles(): void {\n this.active.set(false);\n }\n\n protected select(): void {\n if (!this.disabled) this.parent.choose(this);\n }\n}\n\nconst POSITIONS: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n];\n\n/**\n * Lista de escolha única, acessível e controlável por teclado\n * (padrão WAI-ARIA \"select-only combobox\").\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Província</label>\n * <mx-select placeholder=\"Escolhe uma\" [formControl]=\"provincia\">\n * <mx-option value=\"luanda\">Luanda</mx-option>\n * <mx-option value=\"benguela\">Benguela</mx-option>\n * </mx-select>\n * </mx-form-field>\n * ```\n */\n@Component({\n selector: 'mx-select',\n exportAs: 'mxSelect',\n imports: [CdkOverlayOrigin, CdkConnectedOverlay],\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxSelect }],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mx-select', '[attr.aria-label]': 'null', '[attr.data-size]': 'size() === \"md\" ? null : size()' },\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"mx-select-trigger\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"controlId()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-activedescendant]=\"isOpen() ? activeId() : null\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\n [attr.aria-describedby]=\"field?.describedBy() ?? null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"mx-select-value\" [class.mx-select-placeholder]=\"!selectedLabel()\">\n {{ selectedLabel() || placeholder() }}\n </span>\n @if (loading()) {\n <span class=\"mx-spinner mx-select-spinner\" aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"mx-select-chevron\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"panelWidth()\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\"\n >\n <div\n class=\"mx-select-panel\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? 'true' : null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"field?.labelId() ?? null\"\n [attr.aria-label]=\"field?.labelId() ? null : (ariaLabel() ?? placeholder())\"\n >\n <ng-content />\n @if (loading()) {\n <div class=\"mx-select-empty mx-select-loading\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\"><span class=\"mx-spinner mx-select-spinner\" aria-hidden=\"true\"></span>{{ loadingText() }}</div>\n } @else if (optionCount() === 0) {\n <div class=\"mx-select-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">{{ emptyText() }}</div>\n }\n </div>\n </ng-template>\n `,\n})\nexport class MxSelect<T = unknown> implements ControlValueAccessor, MxFormFieldControl, AfterContentInit {\n /** Valor seleccionado. Também funciona com ngModel e Reactive Forms. */\n readonly value = model<T | T[] | null>(null);\n /** Escolha múltipla: o valor passa a ser uma lista e o painel não fecha ao escolher. */\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly placeholder = input('Seleccionar');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n /** Força o estado de erro (sem formulário). Com Reactive Forms o erro vem do controlo. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Altura: sm 32 px, md 36 px, lg 40 px. */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Texto mostrado quando não há opções. */\n readonly emptyText = input('Sem opções');\n /** Opções a carregar (ex.: de um servidor): mostra um indicador no botão e no painel. */\n readonly loading = input(false, { transform: booleanAttribute });\n readonly loadingText = input('A carregar...');\n readonly id = input<string | undefined>(undefined);\n /** Nome acessível quando não existe um `label[mxLabel]` no campo. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n /** Compara opções com o valor (útil para objectos). */\n readonly compareWith = input<(a: T | null, b: T | null) => boolean>((a, b) => Object.is(a, b));\n\n readonly opened = output<void>();\n readonly closed = output<void>();\n\n private readonly options = contentChildren<MxOption<T>>(MxOption, { descendants: true });\n private readonly injector = inject(Injector);\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly positions = POSITIONS;\n protected readonly panelId = mxUniqueId('mx-select-panel');\n private readonly generatedId = mxUniqueId('mx-select');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n\n protected readonly isOpen = signal(false);\n protected readonly panelWidth = signal<number>(0);\n protected readonly activeId = signal<string | null>(null);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n protected readonly optionCount = computed(() => {\n return this.options().length;\n });\n\n protected readonly selectedLabel = computed(() => {\n const options = this.options();\n if (this.multiple()) {\n const labels = options.filter((o) => this.isSelected(o.value())).map((o) => o.getLabel());\n if (labels.length > 2) return `${labels.length} seleccionados`;\n return labels.join(', ');\n }\n const v = this.value() as T | null;\n return options.find((o) => this.compareWith()(o.value(), v))?.getLabel() ?? '';\n });\n\n private keyManager?: ActiveDescendantKeyManager<MxOption<T>>;\n private onChange: (value: T | T[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngAfterContentInit(): void {\n this.keyManager = new ActiveDescendantKeyManager(this.options, this.injector)\n .withWrap(false)\n .withVerticalOrientation()\n .withHomeAndEnd()\n .withTypeAhead(250)\n .skipPredicate((o) => o.disabled);\n const sub = this.keyManager.change.subscribe(() => this.activeId.set(this.keyManager?.activeItem?.id ?? null));\n this.destroyRef.onDestroy(() => {\n sub.unsubscribe();\n this.keyManager?.destroy();\n });\n }\n\n isSelected(value: T): boolean {\n const current = this.value();\n if (this.multiple()) return Array.isArray(current) && current.some((c) => this.compareWith()(value, c));\n return this.compareWith()(value, current as T | null);\n }\n\n open(): void {\n if (this.isDisabled() || this.isOpen()) return;\n this.panelWidth.set(this.host.getBoundingClientRect().width);\n this.isOpen.set(true);\n this.opened.emit();\n queueMicrotask(() => {\n const index = this.options().findIndex((o) => this.isSelected(o.value()));\n if (index >= 0) this.keyManager?.setActiveItem(index);\n else this.keyManager?.setFirstItemActive();\n });\n }\n\n close(): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.keyManager?.setActiveItem(-1);\n this.activeId.set(null);\n this.onTouched();\n this.closed.emit();\n }\n\n toggle(): void {\n if (this.isOpen()) this.close();\n else this.open();\n }\n\n /** Chamado por uma opção quando é escolhida. */\n choose(option: MxOption<T>): void {\n const v = option.value();\n if (this.multiple()) {\n const current = Array.isArray(this.value()) ? (this.value() as T[]) : [];\n const next = this.isSelected(v) ? current.filter((c) => !this.compareWith()(v, c)) : [...current, v];\n this.value.set(next);\n this.onChange(next);\n // o painel fica aberto; a opção activa passa a ser a escolhida\n const index = this.options().indexOf(option);\n if (index >= 0) this.keyManager?.setActiveItem(index);\n return;\n }\n this.value.set(v);\n this.onChange(v);\n this.close();\n this.focus();\n }\n\n focus(): void {\n this.host.querySelector<HTMLButtonElement>('.mx-select-trigger')?.focus();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const km = this.keyManager;\n if (!km) return;\n const key = event.key;\n\n if (!this.isOpen()) {\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.open();\n } else if (key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n this.open();\n queueMicrotask(() => km.onKeydown(event));\n }\n return;\n }\n\n if (key === 'Escape' || (key === 'ArrowUp' && event.altKey)) {\n event.preventDefault();\n this.close();\n } else if (key === 'Enter' || key === ' ') {\n event.preventDefault();\n const active = km.activeItem;\n if (active && !active.disabled) this.choose(active);\n } else if (key === 'Tab') {\n this.close();\n } else if (key === 'ArrowDown') {\n event.preventDefault();\n km.setNextItemActive();\n } else if (key === 'ArrowUp') {\n event.preventDefault();\n km.setPreviousItemActive();\n } else if (key === 'Home' || key === 'PageUp') {\n event.preventDefault();\n km.setFirstItemActive();\n } else if (key === 'End' || key === 'PageDown') {\n event.preventDefault();\n km.setLastItemActive();\n } else {\n // pesquisa por letra\n km.onKeydown(event);\n }\n }\n\n protected onTriggerBlur(): void {\n if (!this.isOpen()) this.onTouched();\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const c = this.ngControl;\n return !!c && !!c.invalid && !!(c.touched || c.dirty);\n }\n\n isRequired(): boolean {\n return this.required() || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n // ---- ControlValueAccessor ----\n writeValue(value: T | T[] | null): void {\n this.value.set(this.multiple() ? (Array.isArray(value) ? value : []) : (value ?? null));\n }\n registerOnChange(fn: (value: T | T[] | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\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":"muxima-ui-core-select.mjs","sources":["../../../projects/core/select/select.ts","../../../projects/core/select/muxima-ui-core-select.ts"],"sourcesContent":["import { ActiveDescendantKeyManager, Highlightable } from '@angular/cdk/a11y';\nimport { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n Injector,\n computed,\n contentChildren,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport {\n MX_FORM_FIELD_CONTROL,\n MxFormField,\n MxFormFieldControl,\n mxUniqueId,\n} from '@muxima-ui/core/form-field';\n\n/** Opção de um `<mx-select>`. */\n@Component({\n selector: 'mx-option',\n template: `<ng-content />`,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mx-option',\n role: 'option',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled ? \"true\" : null',\n '[attr.data-active]': 'active() ? \"\" : null',\n '(click)': 'select()',\n '(mousedown)': '$event.preventDefault()',\n },\n})\nexport class MxOption<T = unknown> implements Highlightable {\n readonly value = input.required<T>();\n readonly optionDisabled = input(false, { alias: 'disabled', transform: booleanAttribute });\n\n /** Lido pelo gestor de teclado do CDK. */\n get disabled(): boolean {\n return this.optionDisabled();\n }\n\n readonly id = mxUniqueId('mx-option');\n readonly active = signal(false);\n\n private readonly parent = inject<MxSelect<T>>(MxSelect);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n readonly selected = computed(() => this.parent.isSelected(this.value()));\n\n /** Texto usado no gatilho e na pesquisa por letra. */\n getLabel(): string {\n return (this.element.textContent ?? '').trim();\n }\n\n setActiveStyles(): void {\n this.active.set(true);\n this.element.scrollIntoView?.({ block: 'nearest' });\n }\n\n setInactiveStyles(): void {\n this.active.set(false);\n }\n\n protected select(): void {\n if (!this.disabled) this.parent.choose(this);\n }\n}\n\nconst POSITIONS: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n];\n\n/**\n * Lista de escolha única, acessível e controlável por teclado\n * (padrão WAI-ARIA \"select-only combobox\").\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Província</label>\n * <mx-select placeholder=\"Escolhe uma\" [formControl]=\"provincia\">\n * <mx-option value=\"luanda\">Luanda</mx-option>\n * <mx-option value=\"benguela\">Benguela</mx-option>\n * </mx-select>\n * </mx-form-field>\n * ```\n */\n@Component({\n selector: 'mx-select',\n exportAs: 'mxSelect',\n imports: [CdkOverlayOrigin, CdkConnectedOverlay],\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxSelect }],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mx-select', '[attr.aria-label]': 'null', '[attr.data-size]': 'size() === \"md\" ? null : size()' },\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"mx-select-trigger\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"controlId()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-activedescendant]=\"isOpen() ? activeId() : null\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\n [attr.aria-describedby]=\"field?.describedBy() ?? null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"mx-select-value\" [class.mx-select-placeholder]=\"!selectedLabel()\">\n {{ selectedLabel() || placeholderText() }}\n </span>\n @if (loading()) {\n <span class=\"mx-spinner mx-select-spinner\" aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"mx-select-chevron\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayWidth]=\"panelWidth()\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\"\n >\n <div\n class=\"mx-select-panel\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"multiple() ? 'true' : null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"field?.labelId() ?? null\"\n [attr.aria-label]=\"field?.labelId() ? null : (ariaLabel() ?? placeholderText())\"\n >\n <ng-content />\n @if (loading()) {\n <div class=\"mx-select-empty mx-select-loading\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\"><span class=\"mx-spinner mx-select-spinner\" aria-hidden=\"true\"></span>{{ loadingText() ?? i18n().select.loading }}</div>\n } @else if (optionCount() === 0) {\n <div class=\"mx-select-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">{{ emptyText() ?? i18n().select.empty }}</div>\n }\n </div>\n </ng-template>\n `,\n})\nexport class MxSelect<T = unknown> implements ControlValueAccessor, MxFormFieldControl, AfterContentInit {\n /** Valor seleccionado. Também funciona com ngModel e Reactive Forms. */\n readonly value = model<T | T[] | null>(null);\n /** Escolha múltipla: o valor passa a ser uma lista e o painel não fecha ao escolher. */\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly placeholder = input<string>();\n protected readonly i18n = injectMxMessages();\n protected readonly placeholderText = computed(() => this.placeholder() ?? this.i18n().select.placeholder);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n /** Força o estado de erro (sem formulário). Com Reactive Forms o erro vem do controlo. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Altura: sm 32 px, md 36 px, lg 40 px. */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Texto mostrado quando não há opções. */\n readonly emptyText = input<string>();\n /** Opções a carregar (ex.: de um servidor): mostra um indicador no botão e no painel. */\n readonly loading = input(false, { transform: booleanAttribute });\n readonly loadingText = input<string>();\n readonly id = input<string | undefined>(undefined);\n /** Nome acessível quando não existe um `label[mxLabel]` no campo. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n /** Compara opções com o valor (útil para objectos). */\n readonly compareWith = input<(a: T | null, b: T | null) => boolean>((a, b) => Object.is(a, b));\n\n readonly opened = output<void>();\n readonly closed = output<void>();\n\n private readonly options = contentChildren<MxOption<T>>(MxOption, { descendants: true });\n private readonly injector = inject(Injector);\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly positions = POSITIONS;\n protected readonly panelId = mxUniqueId('mx-select-panel');\n private readonly generatedId = mxUniqueId('mx-select');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n\n protected readonly isOpen = signal(false);\n protected readonly panelWidth = signal<number>(0);\n protected readonly activeId = signal<string | null>(null);\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n protected readonly optionCount = computed(() => {\n return this.options().length;\n });\n\n protected readonly selectedLabel = computed(() => {\n const options = this.options();\n if (this.multiple()) {\n const labels = options.filter((o) => this.isSelected(o.value())).map((o) => o.getLabel());\n if (labels.length > 2) return `${labels.length} seleccionados`;\n return labels.join(', ');\n }\n const v = this.value() as T | null;\n return options.find((o) => this.compareWith()(o.value(), v))?.getLabel() ?? '';\n });\n\n private keyManager?: ActiveDescendantKeyManager<MxOption<T>>;\n private onChange: (value: T | T[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngAfterContentInit(): void {\n this.keyManager = new ActiveDescendantKeyManager(this.options, this.injector)\n .withWrap(false)\n .withVerticalOrientation()\n .withHomeAndEnd()\n .withTypeAhead(250)\n .skipPredicate((o) => o.disabled);\n const sub = this.keyManager.change.subscribe(() => this.activeId.set(this.keyManager?.activeItem?.id ?? null));\n this.destroyRef.onDestroy(() => {\n sub.unsubscribe();\n this.keyManager?.destroy();\n });\n }\n\n isSelected(value: T): boolean {\n const current = this.value();\n if (this.multiple()) return Array.isArray(current) && current.some((c) => this.compareWith()(value, c));\n return this.compareWith()(value, current as T | null);\n }\n\n open(): void {\n if (this.isDisabled() || this.isOpen()) return;\n this.panelWidth.set(this.host.getBoundingClientRect().width);\n this.isOpen.set(true);\n this.opened.emit();\n queueMicrotask(() => {\n const index = this.options().findIndex((o) => this.isSelected(o.value()));\n if (index >= 0) this.keyManager?.setActiveItem(index);\n else this.keyManager?.setFirstItemActive();\n });\n }\n\n close(): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.keyManager?.setActiveItem(-1);\n this.activeId.set(null);\n this.onTouched();\n this.closed.emit();\n }\n\n toggle(): void {\n if (this.isOpen()) this.close();\n else this.open();\n }\n\n /** Chamado por uma opção quando é escolhida. */\n choose(option: MxOption<T>): void {\n const v = option.value();\n if (this.multiple()) {\n const current = Array.isArray(this.value()) ? (this.value() as T[]) : [];\n const next = this.isSelected(v) ? current.filter((c) => !this.compareWith()(v, c)) : [...current, v];\n this.value.set(next);\n this.onChange(next);\n // o painel fica aberto; a opção activa passa a ser a escolhida\n const index = this.options().indexOf(option);\n if (index >= 0) this.keyManager?.setActiveItem(index);\n return;\n }\n this.value.set(v);\n this.onChange(v);\n this.close();\n this.focus();\n }\n\n focus(): void {\n this.host.querySelector<HTMLButtonElement>('.mx-select-trigger')?.focus();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const km = this.keyManager;\n if (!km) return;\n const key = event.key;\n\n if (!this.isOpen()) {\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.open();\n } else if (key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n this.open();\n queueMicrotask(() => km.onKeydown(event));\n }\n return;\n }\n\n if (key === 'Escape' || (key === 'ArrowUp' && event.altKey)) {\n event.preventDefault();\n this.close();\n } else if (key === 'Enter' || key === ' ') {\n event.preventDefault();\n const active = km.activeItem;\n if (active && !active.disabled) this.choose(active);\n } else if (key === 'Tab') {\n this.close();\n } else if (key === 'ArrowDown') {\n event.preventDefault();\n km.setNextItemActive();\n } else if (key === 'ArrowUp') {\n event.preventDefault();\n km.setPreviousItemActive();\n } else if (key === 'Home' || key === 'PageUp') {\n event.preventDefault();\n km.setFirstItemActive();\n } else if (key === 'End' || key === 'PageDown') {\n event.preventDefault();\n km.setLastItemActive();\n } else {\n // pesquisa por letra\n km.onKeydown(event);\n }\n }\n\n protected onTriggerBlur(): void {\n if (!this.isOpen()) this.onTouched();\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const c = this.ngControl;\n return !!c && !!c.invalid && !!(c.touched || c.dirty);\n }\n\n isRequired(): boolean {\n return this.required() || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n // ---- ControlValueAccessor ----\n writeValue(value: T | T[] | null): void {\n this.value.set(this.multiple() ? (Array.isArray(value) ? value : []) : (value ?? null));\n }\n registerOnChange(fn: (value: T | T[] | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { model, input, inject, DOCUMENT, DestroyRef, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, Directive, booleanAttribute, computed } from '@angular/core';
|
|
3
|
+
import { injectMxMessages } from '@muxima-ui/core/i18n';
|
|
3
4
|
import { mxUniqueId } from '@muxima-ui/core/form-field';
|
|
4
5
|
|
|
5
6
|
/**
|
|
@@ -25,7 +26,8 @@ import { mxUniqueId } from '@muxima-ui/core/form-field';
|
|
|
25
26
|
*/
|
|
26
27
|
class MxSidebar {
|
|
27
28
|
collapsed = model(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
|
|
28
|
-
ariaLabel = input(
|
|
29
|
+
ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
30
|
+
i18n = injectMxMessages();
|
|
29
31
|
/** `default` com fundo de superfície; `subtle` com o fundo do papel. */
|
|
30
32
|
variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
31
33
|
id = input(mxUniqueId('mx-sidebar'), ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
@@ -66,7 +68,7 @@ class MxSidebar {
|
|
|
66
68
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
67
69
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.25", type: MxSidebar, isStandalone: true, selector: "mx-sidebar", inputs: { collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, host: { properties: { "id": "id()", "attr.data-collapsed": "collapsed() ? \"\" : null", "attr.data-variant": "variant() === \"default\" ? null : variant()", "attr.aria-label": "null" }, classAttribute: "mx-sidebar" }, exportAs: ["mxSidebar"], ngImport: i0, template: `
|
|
68
70
|
<ng-content select="[mxSidebarHeader]" />
|
|
69
|
-
<nav class="mx-sidebar-nav" [attr.aria-label]="ariaLabel()">
|
|
71
|
+
<nav class="mx-sidebar-nav" [attr.aria-label]="ariaLabel() ?? i18n().sidebar.label">
|
|
70
72
|
<ng-content />
|
|
71
73
|
</nav>
|
|
72
74
|
<ng-content select="[mxSidebarFooter]" />
|
|
@@ -88,7 +90,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
88
90
|
},
|
|
89
91
|
template: `
|
|
90
92
|
<ng-content select="[mxSidebarHeader]" />
|
|
91
|
-
<nav class="mx-sidebar-nav" [attr.aria-label]="ariaLabel()">
|
|
93
|
+
<nav class="mx-sidebar-nav" [attr.aria-label]="ariaLabel() ?? i18n().sidebar.label">
|
|
92
94
|
<ng-content />
|
|
93
95
|
</nav>
|
|
94
96
|
<ng-content select="[mxSidebarFooter]" />
|
|
@@ -292,10 +294,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
292
294
|
*/
|
|
293
295
|
class MxSidebarToggle {
|
|
294
296
|
sidebar = input.required(...(ngDevMode ? [{ debugName: "sidebar" }] : /* istanbul ignore next */ []));
|
|
295
|
-
collapseLabel = input(
|
|
296
|
-
expandLabel = input(
|
|
297
|
+
collapseLabel = input(...(ngDevMode ? [undefined, { debugName: "collapseLabel" }] : /* istanbul ignore next */ []));
|
|
298
|
+
expandLabel = input(...(ngDevMode ? [undefined, { debugName: "expandLabel" }] : /* istanbul ignore next */ []));
|
|
299
|
+
i18n = injectMxMessages();
|
|
297
300
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxSidebarToggle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
298
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.25", type: MxSidebarToggle, isStandalone: true, selector: "button[mxSidebarToggle]", inputs: { sidebar: { classPropertyName: "sidebar", publicName: "sidebar", isSignal: true, isRequired: true, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null }, expandLabel: { classPropertyName: "expandLabel", publicName: "expandLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "sidebar().toggle()" }, properties: { "attr.aria-expanded": "!sidebar().collapsed()", "attr.aria-controls": "sidebar().id()", "attr.aria-label": "sidebar().collapsed() ? expandLabel() : collapseLabel()" }, classAttribute: "mx-sidebar-toggle" }, exportAs: ["mxSidebarToggle"], ngImport: i0 });
|
|
301
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.25", type: MxSidebarToggle, isStandalone: true, selector: "button[mxSidebarToggle]", inputs: { sidebar: { classPropertyName: "sidebar", publicName: "sidebar", isSignal: true, isRequired: true, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null }, expandLabel: { classPropertyName: "expandLabel", publicName: "expandLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "sidebar().toggle()" }, properties: { "attr.aria-expanded": "!sidebar().collapsed()", "attr.aria-controls": "sidebar().id()", "attr.aria-label": "sidebar().collapsed() ? (expandLabel() ?? i18n().sidebar.expand) : (collapseLabel() ?? i18n().sidebar.collapse)" }, classAttribute: "mx-sidebar-toggle" }, exportAs: ["mxSidebarToggle"], ngImport: i0 });
|
|
299
302
|
}
|
|
300
303
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxSidebarToggle, decorators: [{
|
|
301
304
|
type: Directive,
|
|
@@ -307,7 +310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
307
310
|
type: 'button',
|
|
308
311
|
'[attr.aria-expanded]': '!sidebar().collapsed()',
|
|
309
312
|
'[attr.aria-controls]': 'sidebar().id()',
|
|
310
|
-
'[attr.aria-label]': 'sidebar().collapsed() ? expandLabel() : collapseLabel()',
|
|
313
|
+
'[attr.aria-label]': 'sidebar().collapsed() ? (expandLabel() ?? i18n().sidebar.expand) : (collapseLabel() ?? i18n().sidebar.collapse)',
|
|
311
314
|
'(click)': 'sidebar().toggle()',
|
|
312
315
|
},
|
|
313
316
|
}]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxima-ui-core-sidebar.mjs","sources":["../../../projects/core/sidebar/sidebar.ts","../../../projects/core/sidebar/muxima-ui-core-sidebar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n DestroyRef,\n Directive,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { mxUniqueId } from '@muxima-ui/core/form-field';\n\n/**\n * Navegação lateral que recolhe para só ícones. O conteúdo fica dentro de um `<nav>`;\n * recolhida, os nomes continuam lá para o leitor de ecrã e aparecem numa dica ao passar\n * o rato ou com o foco.\n *\n * ```html\n * <mx-sidebar [(collapsed)]=\"recolhida\" aria-label=\"Principal\">\n * <div mxSidebarHeader>Kianda</div>\n * <mx-sidebar-group label=\"Gestão\">\n * <li><a mxSidebarItem routerLink=\"/facturas\" routerLinkActive ariaCurrentWhenActive=\"page\">\n * <svg mxSidebarIcon>...</svg><span mxSidebarLabel>Facturas</span>\n * </a></li>\n * </mx-sidebar-group>\n * <div mxSidebarFooter>...</div>\n * </mx-sidebar>\n * <button mxSidebarToggle [sidebar]=\"menu\">...</button>\n * ```\n *\n * O item da página actual leva aria-current=\"page\" (o routerLinkActive faz isso com\n * ariaCurrentWhenActive).\n */\n@Component({\n selector: 'mx-sidebar',\n exportAs: 'mxSidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-sidebar',\n '[id]': 'id()',\n '[attr.data-collapsed]': 'collapsed() ? \"\" : null',\n '[attr.data-variant]': 'variant() === \"default\" ? null : variant()',\n '[attr.aria-label]': 'null',\n },\n template: `\n <ng-content select=\"[mxSidebarHeader]\" />\n <nav class=\"mx-sidebar-nav\" [attr.aria-label]=\"ariaLabel()\">\n <ng-content />\n </nav>\n <ng-content select=\"[mxSidebarFooter]\" />\n `,\n})\nexport class MxSidebar {\n readonly collapsed = model(false);\n readonly ariaLabel = input('Principal', { alias: 'aria-label' });\n /** `default` com fundo de superfície; `subtle` com o fundo do papel. */\n readonly variant = input<'default' | 'subtle'>('default');\n readonly id = input(mxUniqueId('mx-sidebar'));\n\n private readonly doc = inject(DOCUMENT);\n /** A dica vive no body, para não ser cortada nem deslocada por contentores da página. */\n private tipEl?: HTMLElement;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.tipEl?.remove());\n }\n\n toggle(): void {\n this.collapsed.update((c) => !c);\n this.hideTip();\n }\n\n /** Mostra a dica de um item (só com a barra recolhida). */\n showTip(el: HTMLElement): void {\n if (!this.collapsed()) return;\n const text =\n el.querySelector('.mx-sidebar-label')?.textContent?.trim() ||\n el.getAttribute('aria-label') ||\n '';\n if (!text) return;\n const r = el.getBoundingClientRect();\n if (!this.tipEl) {\n this.tipEl = this.doc.createElement('div');\n this.tipEl.className = 'mx-tooltip mx-sidebar-tip';\n this.tipEl.setAttribute('aria-hidden', 'true');\n }\n this.tipEl.textContent = text;\n this.tipEl.style.top = `${r.top + r.height / 2}px`;\n this.tipEl.style.left = `${r.right + 8}px`;\n if (!this.tipEl.isConnected) this.doc.body.appendChild(this.tipEl);\n }\n hideTip(): void {\n this.tipEl?.remove();\n }\n}\n\n/** Link ou botão da barra. Põe o texto em `mxSidebarLabel` e o ícone em `mxSidebarIcon`. */\n@Directive({\n selector: 'a[mxSidebarItem], button[mxSidebarItem]',\n exportAs: 'mxSidebarItem',\n host: {\n class: 'mx-sidebar-item',\n '(mouseenter)': 'sidebar?.showTip(el)',\n '(focus)': 'sidebar?.showTip(el)',\n '(mouseleave)': 'sidebar?.hideTip()',\n '(blur)': 'sidebar?.hideTip()',\n },\n})\nexport class MxSidebarItem {\n protected readonly sidebar = inject(MxSidebar, { optional: true });\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n}\n\n@Directive({ selector: '[mxSidebarLabel]', host: { class: 'mx-sidebar-label' } })\nexport class MxSidebarLabel {}\n\n@Directive({\n selector: '[mxSidebarIcon]',\n host: { class: 'mx-sidebar-icon', 'aria-hidden': 'true' },\n})\nexport class MxSidebarIcon {}\n\n/** Contagem ou estado à direita do item; recolhida, passa a ponto. */\n@Directive({ selector: '[mxSidebarBadge]', host: { class: 'mx-sidebar-badge' } })\nexport class MxSidebarBadge {}\n\n@Directive({ selector: '[mxSidebarHeader]', host: { class: 'mx-sidebar-header' } })\nexport class MxSidebarHeader {}\n\n@Directive({ selector: '[mxSidebarFooter]', host: { class: 'mx-sidebar-footer' } })\nexport class MxSidebarFooter {}\n\n/**\n * Grupo de itens com título. O título dá nome à lista (aria-labelledby); recolhida,\n * o título fica escondido só visualmente. Os itens vão em `<li>`.\n */\n@Component({\n selector: 'mx-sidebar-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-sidebar-group' },\n template: `\n @if (label()) {\n <p class=\"mx-sidebar-group-label\" [id]=\"labelId\">{{ label() }}</p>\n }\n <ul class=\"mx-sidebar-list\" [attr.aria-labelledby]=\"label() ? labelId : null\">\n <ng-content />\n </ul>\n `,\n})\nexport class MxSidebarGroup {\n readonly label = input('');\n protected readonly labelId = mxUniqueId('mx-sidebar-group');\n}\n\n/**\n * Secção que abre e fecha (botão com aria-expanded). Com a barra recolhida, carregar na\n * secção expande a barra e abre a secção.\n *\n * ```html\n * <li><mx-sidebar-section label=\"Relatórios\" [(open)]=\"aberta\">\n * <svg mxSidebarIcon>...</svg>\n * <li><a mxSidebarItem routerLink=\"/vendas\"><span mxSidebarLabel>Vendas</span></a></li>\n * </mx-sidebar-section></li>\n * ```\n */\n@Component({\n selector: 'mx-sidebar-section',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-sidebar-section', '[attr.data-open]': 'isOpen() ? \"\" : null' },\n template: `\n <button\n type=\"button\"\n mxSidebarItem\n class=\"mx-sidebar-item mx-sidebar-section-trigger\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"listId\"\n (click)=\"toggle()\"\n >\n <ng-content select=\"[mxSidebarIcon]\" />\n <span class=\"mx-sidebar-label\">{{ label() }}</span>\n <svg class=\"mx-sidebar-chevron\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M6 4l4 4-4 4\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <ul class=\"mx-sidebar-list mx-sidebar-sublist\" [id]=\"listId\" [hidden]=\"!isOpen()\">\n <ng-content />\n </ul>\n `,\n imports: [MxSidebarItem],\n})\nexport class MxSidebarSection {\n readonly label = input.required<string>();\n readonly open = model(false);\n readonly disabled = input(false, { transform: booleanAttribute });\n private readonly sidebar = inject(MxSidebar, { optional: true });\n protected readonly listId = mxUniqueId('mx-sidebar-section');\n /** Recolhida, a secção não mostra os filhos. */\n protected readonly isOpen = computed(() => this.open() && !this.sidebar?.collapsed());\n\n protected toggle(): void {\n if (this.sidebar?.collapsed()) {\n this.sidebar.collapsed.set(false);\n this.sidebar.hideTip();\n this.open.set(true);\n return;\n }\n this.open.update((o) => !o);\n }\n}\n\n/**\n * Botão que recolhe e expande a barra. Tem aria-expanded e aria-controls; o nome muda\n * entre \"Recolher menu\" e \"Expandir menu\" (ou os textos que passares).\n */\n@Directive({\n selector: 'button[mxSidebarToggle]',\n exportAs: 'mxSidebarToggle',\n host: {\n class: 'mx-sidebar-toggle',\n type: 'button',\n '[attr.aria-expanded]': '!sidebar().collapsed()',\n '[attr.aria-controls]': 'sidebar().id()',\n '[attr.aria-label]': 'sidebar().collapsed() ? expandLabel() : collapseLabel()',\n '(click)': 'sidebar().toggle()',\n },\n})\nexport class MxSidebarToggle {\n readonly sidebar = input.required<MxSidebar>();\n readonly collapseLabel = input('Recolher menu');\n readonly expandLabel = input('Expandir menu');\n}\n\nexport const MX_SIDEBAR = [\n MxSidebar,\n MxSidebarItem,\n MxSidebarLabel,\n MxSidebarIcon,\n MxSidebarBadge,\n MxSidebarHeader,\n MxSidebarFooter,\n MxSidebarGroup,\n MxSidebarSection,\n MxSidebarToggle,\n] 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":"muxima-ui-core-sidebar.mjs","sources":["../../../projects/core/sidebar/sidebar.ts","../../../projects/core/sidebar/muxima-ui-core-sidebar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n DestroyRef,\n Directive,\n ElementRef,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\nimport { mxUniqueId } from '@muxima-ui/core/form-field';\n\n/**\n * Navegação lateral que recolhe para só ícones. O conteúdo fica dentro de um `<nav>`;\n * recolhida, os nomes continuam lá para o leitor de ecrã e aparecem numa dica ao passar\n * o rato ou com o foco.\n *\n * ```html\n * <mx-sidebar [(collapsed)]=\"recolhida\" aria-label=\"Principal\">\n * <div mxSidebarHeader>Kianda</div>\n * <mx-sidebar-group label=\"Gestão\">\n * <li><a mxSidebarItem routerLink=\"/facturas\" routerLinkActive ariaCurrentWhenActive=\"page\">\n * <svg mxSidebarIcon>...</svg><span mxSidebarLabel>Facturas</span>\n * </a></li>\n * </mx-sidebar-group>\n * <div mxSidebarFooter>...</div>\n * </mx-sidebar>\n * <button mxSidebarToggle [sidebar]=\"menu\">...</button>\n * ```\n *\n * O item da página actual leva aria-current=\"page\" (o routerLinkActive faz isso com\n * ariaCurrentWhenActive).\n */\n@Component({\n selector: 'mx-sidebar',\n exportAs: 'mxSidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-sidebar',\n '[id]': 'id()',\n '[attr.data-collapsed]': 'collapsed() ? \"\" : null',\n '[attr.data-variant]': 'variant() === \"default\" ? null : variant()',\n '[attr.aria-label]': 'null',\n },\n template: `\n <ng-content select=\"[mxSidebarHeader]\" />\n <nav class=\"mx-sidebar-nav\" [attr.aria-label]=\"ariaLabel() ?? i18n().sidebar.label\">\n <ng-content />\n </nav>\n <ng-content select=\"[mxSidebarFooter]\" />\n `,\n})\nexport class MxSidebar {\n readonly collapsed = model(false);\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n protected readonly i18n = injectMxMessages();\n /** `default` com fundo de superfície; `subtle` com o fundo do papel. */\n readonly variant = input<'default' | 'subtle'>('default');\n readonly id = input(mxUniqueId('mx-sidebar'));\n\n private readonly doc = inject(DOCUMENT);\n /** A dica vive no body, para não ser cortada nem deslocada por contentores da página. */\n private tipEl?: HTMLElement;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.tipEl?.remove());\n }\n\n toggle(): void {\n this.collapsed.update((c) => !c);\n this.hideTip();\n }\n\n /** Mostra a dica de um item (só com a barra recolhida). */\n showTip(el: HTMLElement): void {\n if (!this.collapsed()) return;\n const text =\n el.querySelector('.mx-sidebar-label')?.textContent?.trim() ||\n el.getAttribute('aria-label') ||\n '';\n if (!text) return;\n const r = el.getBoundingClientRect();\n if (!this.tipEl) {\n this.tipEl = this.doc.createElement('div');\n this.tipEl.className = 'mx-tooltip mx-sidebar-tip';\n this.tipEl.setAttribute('aria-hidden', 'true');\n }\n this.tipEl.textContent = text;\n this.tipEl.style.top = `${r.top + r.height / 2}px`;\n this.tipEl.style.left = `${r.right + 8}px`;\n if (!this.tipEl.isConnected) this.doc.body.appendChild(this.tipEl);\n }\n hideTip(): void {\n this.tipEl?.remove();\n }\n}\n\n/** Link ou botão da barra. Põe o texto em `mxSidebarLabel` e o ícone em `mxSidebarIcon`. */\n@Directive({\n selector: 'a[mxSidebarItem], button[mxSidebarItem]',\n exportAs: 'mxSidebarItem',\n host: {\n class: 'mx-sidebar-item',\n '(mouseenter)': 'sidebar?.showTip(el)',\n '(focus)': 'sidebar?.showTip(el)',\n '(mouseleave)': 'sidebar?.hideTip()',\n '(blur)': 'sidebar?.hideTip()',\n },\n})\nexport class MxSidebarItem {\n protected readonly sidebar = inject(MxSidebar, { optional: true });\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n}\n\n@Directive({ selector: '[mxSidebarLabel]', host: { class: 'mx-sidebar-label' } })\nexport class MxSidebarLabel {}\n\n@Directive({\n selector: '[mxSidebarIcon]',\n host: { class: 'mx-sidebar-icon', 'aria-hidden': 'true' },\n})\nexport class MxSidebarIcon {}\n\n/** Contagem ou estado à direita do item; recolhida, passa a ponto. */\n@Directive({ selector: '[mxSidebarBadge]', host: { class: 'mx-sidebar-badge' } })\nexport class MxSidebarBadge {}\n\n@Directive({ selector: '[mxSidebarHeader]', host: { class: 'mx-sidebar-header' } })\nexport class MxSidebarHeader {}\n\n@Directive({ selector: '[mxSidebarFooter]', host: { class: 'mx-sidebar-footer' } })\nexport class MxSidebarFooter {}\n\n/**\n * Grupo de itens com título. O título dá nome à lista (aria-labelledby); recolhida,\n * o título fica escondido só visualmente. Os itens vão em `<li>`.\n */\n@Component({\n selector: 'mx-sidebar-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-sidebar-group' },\n template: `\n @if (label()) {\n <p class=\"mx-sidebar-group-label\" [id]=\"labelId\">{{ label() }}</p>\n }\n <ul class=\"mx-sidebar-list\" [attr.aria-labelledby]=\"label() ? labelId : null\">\n <ng-content />\n </ul>\n `,\n})\nexport class MxSidebarGroup {\n readonly label = input('');\n protected readonly labelId = mxUniqueId('mx-sidebar-group');\n}\n\n/**\n * Secção que abre e fecha (botão com aria-expanded). Com a barra recolhida, carregar na\n * secção expande a barra e abre a secção.\n *\n * ```html\n * <li><mx-sidebar-section label=\"Relatórios\" [(open)]=\"aberta\">\n * <svg mxSidebarIcon>...</svg>\n * <li><a mxSidebarItem routerLink=\"/vendas\"><span mxSidebarLabel>Vendas</span></a></li>\n * </mx-sidebar-section></li>\n * ```\n */\n@Component({\n selector: 'mx-sidebar-section',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-sidebar-section', '[attr.data-open]': 'isOpen() ? \"\" : null' },\n template: `\n <button\n type=\"button\"\n mxSidebarItem\n class=\"mx-sidebar-item mx-sidebar-section-trigger\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"listId\"\n (click)=\"toggle()\"\n >\n <ng-content select=\"[mxSidebarIcon]\" />\n <span class=\"mx-sidebar-label\">{{ label() }}</span>\n <svg class=\"mx-sidebar-chevron\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path\n d=\"M6 4l4 4-4 4\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <ul class=\"mx-sidebar-list mx-sidebar-sublist\" [id]=\"listId\" [hidden]=\"!isOpen()\">\n <ng-content />\n </ul>\n `,\n imports: [MxSidebarItem],\n})\nexport class MxSidebarSection {\n readonly label = input.required<string>();\n readonly open = model(false);\n readonly disabled = input(false, { transform: booleanAttribute });\n private readonly sidebar = inject(MxSidebar, { optional: true });\n protected readonly listId = mxUniqueId('mx-sidebar-section');\n /** Recolhida, a secção não mostra os filhos. */\n protected readonly isOpen = computed(() => this.open() && !this.sidebar?.collapsed());\n\n protected toggle(): void {\n if (this.sidebar?.collapsed()) {\n this.sidebar.collapsed.set(false);\n this.sidebar.hideTip();\n this.open.set(true);\n return;\n }\n this.open.update((o) => !o);\n }\n}\n\n/**\n * Botão que recolhe e expande a barra. Tem aria-expanded e aria-controls; o nome muda\n * entre \"Recolher menu\" e \"Expandir menu\" (ou os textos que passares).\n */\n@Directive({\n selector: 'button[mxSidebarToggle]',\n exportAs: 'mxSidebarToggle',\n host: {\n class: 'mx-sidebar-toggle',\n type: 'button',\n '[attr.aria-expanded]': '!sidebar().collapsed()',\n '[attr.aria-controls]': 'sidebar().id()',\n '[attr.aria-label]': 'sidebar().collapsed() ? (expandLabel() ?? i18n().sidebar.expand) : (collapseLabel() ?? i18n().sidebar.collapse)',\n '(click)': 'sidebar().toggle()',\n },\n})\nexport class MxSidebarToggle {\n readonly sidebar = input.required<MxSidebar>();\n readonly collapseLabel = input<string>();\n readonly expandLabel = input<string>();\n protected readonly i18n = injectMxMessages();\n}\n\nexport const MX_SIDEBAR = [\n MxSidebar,\n MxSidebarItem,\n MxSidebarLabel,\n MxSidebarIcon,\n MxSidebarBadge,\n MxSidebarHeader,\n MxSidebarFooter,\n MxSidebarGroup,\n MxSidebarSection,\n MxSidebarToggle,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, afterEveryRender, inject, DestroyRef, Directive, model, numberAttribute, booleanAttribute, computed, signal, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { MxNativeControl, MX_FORM_FIELD_CONTROL, MxFormField, mxUniqueId } from '@muxima-ui/core/form-field';
|
|
4
|
+
import { injectMxMessages } from '@muxima-ui/core/i18n';
|
|
4
5
|
import { NgControl, Validators } from '@angular/forms';
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -77,8 +78,9 @@ class MxRangeSlider {
|
|
|
77
78
|
format = input((v) => String(v), ...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
|
|
78
79
|
/** Mostra os dois valores por baixo da barra. */
|
|
79
80
|
showValues = input(false, { ...(ngDevMode ? { debugName: "showValues" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
80
|
-
lowLabel = input(
|
|
81
|
-
highLabel = input(
|
|
81
|
+
lowLabel = input(...(ngDevMode ? [undefined, { debugName: "lowLabel" }] : /* istanbul ignore next */ []));
|
|
82
|
+
highLabel = input(...(ngDevMode ? [undefined, { debugName: "highLabel" }] : /* istanbul ignore next */ []));
|
|
83
|
+
i18n = injectMxMessages();
|
|
82
84
|
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
83
85
|
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
84
86
|
required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
@@ -182,8 +184,8 @@ class MxRangeSlider {
|
|
|
182
184
|
(input)="onInput(1, $event)"
|
|
183
185
|
(blur)="onTouched()"
|
|
184
186
|
/>
|
|
185
|
-
<span class="mx-visually-hidden" [id]="lowId">{{ lowLabel() }}</span>
|
|
186
|
-
<span class="mx-visually-hidden" [id]="highId">{{ highLabel() }}</span>
|
|
187
|
+
<span class="mx-visually-hidden" [id]="lowId">{{ lowLabel() ?? i18n().rangeSlider.low }}</span>
|
|
188
|
+
<span class="mx-visually-hidden" [id]="highId">{{ highLabel() ?? i18n().rangeSlider.high }}</span>
|
|
187
189
|
@if (!field?.labelId()) {
|
|
188
190
|
<span class="mx-visually-hidden" [id]="nameId">{{ ariaLabel() }}</span>
|
|
189
191
|
}
|
|
@@ -245,8 +247,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
245
247
|
(input)="onInput(1, $event)"
|
|
246
248
|
(blur)="onTouched()"
|
|
247
249
|
/>
|
|
248
|
-
<span class="mx-visually-hidden" [id]="lowId">{{ lowLabel() }}</span>
|
|
249
|
-
<span class="mx-visually-hidden" [id]="highId">{{ highLabel() }}</span>
|
|
250
|
+
<span class="mx-visually-hidden" [id]="lowId">{{ lowLabel() ?? i18n().rangeSlider.low }}</span>
|
|
251
|
+
<span class="mx-visually-hidden" [id]="highId">{{ highLabel() ?? i18n().rangeSlider.high }}</span>
|
|
250
252
|
@if (!field?.labelId()) {
|
|
251
253
|
<span class="mx-visually-hidden" [id]="nameId">{{ ariaLabel() }}</span>
|
|
252
254
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxima-ui-core-slider.mjs","sources":["../../../projects/core/slider/slider.ts","../../../projects/core/slider/range-slider.ts","../../../projects/core/slider/muxima-ui-core-slider.ts"],"sourcesContent":["import { DestroyRef, Directive, OnInit, afterEveryRender, inject, input } from '@angular/core';\nimport { MX_FORM_FIELD_CONTROL, MxNativeControl } from '@muxima-ui/core/form-field';\n\n/**\n * Cursor de intervalo sobre o `<input type=\"range\">` nativo: setas, Page Up/Down,\n * Home e End funcionam como no navegador, e o valor é anunciado pelo leitor de ecrã.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Orçamento (mil Kz)</label>\n * <input type=\"range\" mxSlider min=\"0\" max=\"500\" step=\"10\" formControlName=\"orcamento\" />\n * </mx-form-field>\n * ```\n */\n@Directive({\n selector: 'input[type=range][mxSlider]',\n exportAs: 'mxSlider',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxSlider }],\n host: {\n class: 'mx-slider',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '(input)': 'paint()',\n },\n})\nexport class MxSlider extends MxNativeControl implements OnInit {\n /** Espessura da barra: sm 4 px, md 6 px, lg 8 px. */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n\n constructor() {\n super();\n // O valor pode mudar por formulário ou atributo sem evento \"input\": repinta após cada render.\n afterEveryRender({ write: () => this.paint() });\n }\n\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n // setValue/patchValue escrevem no input sem evento nem render: repinta quando o valor muda.\n const sub = this.ngControl?.valueChanges?.subscribe(() => this.paint());\n if (sub) this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n protected paint(): void {\n const el = this.element as HTMLInputElement;\n const min = Number(el.min || 0);\n const max = Number(el.max || 100);\n const pct = max > min ? ((Number(el.value) - min) / (max - min)) * 100 : 0;\n el.style.setProperty('--mx-slider-fill', `${pct}%`);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport { MX_FORM_FIELD_CONTROL, MxFormField, MxFormFieldControl, mxUniqueId } from '@muxima-ui/core/form-field';\n\n/**\n * Intervalo com dois cursores (mínimo e máximo), feito com dois `<input type=\"range\">`\n * nativos: cada cursor tem o seu teclado e é anunciado como \"Preço, mínimo, 20 000 Kz\".\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Preço</label>\n * <mx-range-slider formControlName=\"preco\" [min]=\"0\" [max]=\"100000\" [step]=\"1000\" [format]=\"kz\" />\n * </mx-form-field>\n * ```\n *\n * O valor é `[mínimo, máximo]`. Os cursores não se cruzam: ficam a pelo menos `minGap` um do outro.\n */\n@Component({\n selector: 'mx-range-slider',\n exportAs: 'mxRangeSlider',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxRangeSlider }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-range-slider',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.aria-label]': 'null',\n '[style.--mx-range-from]': 'fromPct() + \"%\"',\n '[style.--mx-range-to]': 'toPct() + \"%\"',\n },\n template: `\n <div class=\"mx-range-slider-track\" aria-hidden=\"true\"><div class=\"mx-range-slider-fill\"></div></div>\n <input\n type=\"range\"\n class=\"mx-range-slider-input\"\n [id]=\"controlId()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"low()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-labelledby]=\"labelledBy(lowId)\"\n [attr.aria-valuetext]=\"format()(low())\"\n [attr.aria-describedby]=\"field?.describedBy() ?? null\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n (input)=\"onInput(0, $event)\"\n (blur)=\"onTouched()\"\n />\n <input\n type=\"range\"\n class=\"mx-range-slider-input\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"high()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-labelledby]=\"labelledBy(highId)\"\n [attr.aria-valuetext]=\"format()(high())\"\n [attr.aria-describedby]=\"field?.describedBy() ?? null\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n (input)=\"onInput(1, $event)\"\n (blur)=\"onTouched()\"\n />\n <span class=\"mx-visually-hidden\" [id]=\"lowId\">{{ lowLabel() }}</span>\n <span class=\"mx-visually-hidden\" [id]=\"highId\">{{ highLabel() }}</span>\n @if (!field?.labelId()) {\n <span class=\"mx-visually-hidden\" [id]=\"nameId\">{{ ariaLabel() }}</span>\n }\n @if (showValues()) {\n <div class=\"mx-range-slider-values\" aria-hidden=\"true\">\n <span>{{ format()(low()) }}</span>\n <span>{{ format()(high()) }}</span>\n </div>\n }\n `,\n})\nexport class MxRangeSlider implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<[number, number] | null>(null);\n readonly min = input(0, { transform: numberAttribute });\n readonly max = input(100, { transform: numberAttribute });\n readonly step = input(1, { transform: numberAttribute });\n /** Distância mínima entre os dois cursores. */\n readonly minGap = input(0, { transform: numberAttribute });\n /** Texto de cada valor, para o leitor de ecrã e as etiquetas. */\n readonly format = input<(v: number) => string>((v) => String(v));\n /** Mostra os dois valores por baixo da barra. */\n readonly showValues = input(false, { transform: booleanAttribute });\n readonly lowLabel = input('mínimo');\n readonly highLabel = input('máximo');\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly id = input<string | undefined>(undefined);\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly generatedId = mxUniqueId('mx-range');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n protected readonly lowId = mxUniqueId('mx-range-low');\n protected readonly highId = mxUniqueId('mx-range-high');\n protected readonly nameId = mxUniqueId('mx-range-name');\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n protected readonly low = computed(() => this.value()?.[0] ?? this.min());\n protected readonly high = computed(() => this.value()?.[1] ?? this.max());\n private pct(v: number): number {\n const span = this.max() - this.min();\n return span > 0 ? ((v - this.min()) / span) * 100 : 0;\n }\n protected readonly fromPct = computed(() => this.pct(this.low()));\n protected readonly toPct = computed(() => this.pct(this.high()));\n\n private onChange: (value: [number, number] | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n protected labelledBy(partId: string): string {\n return `${this.field?.labelId() ?? this.nameId} ${partId}`;\n }\n\n protected onInput(which: 0 | 1, event: Event): void {\n const el = event.target as HTMLInputElement;\n let v = Number(el.value);\n const gap = this.minGap();\n if (which === 0) v = Math.min(v, this.high() - gap);\n else v = Math.max(v, this.low() + gap);\n // o input nativo pode ter passado o outro cursor: repõe a posição\n el.value = String(v);\n const next: [number, number] = which === 0 ? [v, this.high()] : [this.low(), v];\n this.value.set(next);\n this.onChange(next);\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const c = this.ngControl;\n return !!c && !!c.invalid && !!(c.touched || c.dirty);\n }\n isRequired(): boolean {\n return this.required() || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n // ---- ControlValueAccessor ----\n writeValue(value: [number, number] | null): void {\n this.value.set(value ? [value[0], value[1]] : null);\n }\n registerOnChange(fn: (value: [number, number] | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\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":"muxima-ui-core-slider.mjs","sources":["../../../projects/core/slider/slider.ts","../../../projects/core/slider/range-slider.ts","../../../projects/core/slider/muxima-ui-core-slider.ts"],"sourcesContent":["import { DestroyRef, Directive, OnInit, afterEveryRender, inject, input } from '@angular/core';\nimport { MX_FORM_FIELD_CONTROL, MxNativeControl } from '@muxima-ui/core/form-field';\n\n/**\n * Cursor de intervalo sobre o `<input type=\"range\">` nativo: setas, Page Up/Down,\n * Home e End funcionam como no navegador, e o valor é anunciado pelo leitor de ecrã.\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Orçamento (mil Kz)</label>\n * <input type=\"range\" mxSlider min=\"0\" max=\"500\" step=\"10\" formControlName=\"orcamento\" />\n * </mx-form-field>\n * ```\n */\n@Directive({\n selector: 'input[type=range][mxSlider]',\n exportAs: 'mxSlider',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxSlider }],\n host: {\n class: 'mx-slider',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '(input)': 'paint()',\n },\n})\nexport class MxSlider extends MxNativeControl implements OnInit {\n /** Espessura da barra: sm 4 px, md 6 px, lg 8 px. */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n\n constructor() {\n super();\n // O valor pode mudar por formulário ou atributo sem evento \"input\": repinta após cada render.\n afterEveryRender({ write: () => this.paint() });\n }\n\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n // setValue/patchValue escrevem no input sem evento nem render: repinta quando o valor muda.\n const sub = this.ngControl?.valueChanges?.subscribe(() => this.paint());\n if (sub) this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n protected paint(): void {\n const el = this.element as HTMLInputElement;\n const min = Number(el.min || 0);\n const max = Number(el.max || 100);\n const pct = max > min ? ((Number(el.value) - min) / (max - min)) * 100 : 0;\n el.style.setProperty('--mx-slider-fill', `${pct}%`);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport { MX_FORM_FIELD_CONTROL, MxFormField, MxFormFieldControl, mxUniqueId } from '@muxima-ui/core/form-field';\n\n/**\n * Intervalo com dois cursores (mínimo e máximo), feito com dois `<input type=\"range\">`\n * nativos: cada cursor tem o seu teclado e é anunciado como \"Preço, mínimo, 20 000 Kz\".\n *\n * ```html\n * <mx-form-field>\n * <label mxLabel>Preço</label>\n * <mx-range-slider formControlName=\"preco\" [min]=\"0\" [max]=\"100000\" [step]=\"1000\" [format]=\"kz\" />\n * </mx-form-field>\n * ```\n *\n * O valor é `[mínimo, máximo]`. Os cursores não se cruzam: ficam a pelo menos `minGap` um do outro.\n */\n@Component({\n selector: 'mx-range-slider',\n exportAs: 'mxRangeSlider',\n providers: [{ provide: MX_FORM_FIELD_CONTROL, useExisting: MxRangeSlider }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-range-slider',\n '[attr.data-size]': 'size() === \"md\" ? null : size()',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-invalid]': 'errorState() ? \"\" : null',\n '[attr.aria-label]': 'null',\n '[style.--mx-range-from]': 'fromPct() + \"%\"',\n '[style.--mx-range-to]': 'toPct() + \"%\"',\n },\n template: `\n <div class=\"mx-range-slider-track\" aria-hidden=\"true\"><div class=\"mx-range-slider-fill\"></div></div>\n <input\n type=\"range\"\n class=\"mx-range-slider-input\"\n [id]=\"controlId()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"low()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-labelledby]=\"labelledBy(lowId)\"\n [attr.aria-valuetext]=\"format()(low())\"\n [attr.aria-describedby]=\"field?.describedBy() ?? null\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n (input)=\"onInput(0, $event)\"\n (blur)=\"onTouched()\"\n />\n <input\n type=\"range\"\n class=\"mx-range-slider-input\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"high()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-labelledby]=\"labelledBy(highId)\"\n [attr.aria-valuetext]=\"format()(high())\"\n [attr.aria-describedby]=\"field?.describedBy() ?? null\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n (input)=\"onInput(1, $event)\"\n (blur)=\"onTouched()\"\n />\n <span class=\"mx-visually-hidden\" [id]=\"lowId\">{{ lowLabel() ?? i18n().rangeSlider.low }}</span>\n <span class=\"mx-visually-hidden\" [id]=\"highId\">{{ highLabel() ?? i18n().rangeSlider.high }}</span>\n @if (!field?.labelId()) {\n <span class=\"mx-visually-hidden\" [id]=\"nameId\">{{ ariaLabel() }}</span>\n }\n @if (showValues()) {\n <div class=\"mx-range-slider-values\" aria-hidden=\"true\">\n <span>{{ format()(low()) }}</span>\n <span>{{ format()(high()) }}</span>\n </div>\n }\n `,\n})\nexport class MxRangeSlider implements ControlValueAccessor, MxFormFieldControl {\n readonly value = model<[number, number] | null>(null);\n readonly min = input(0, { transform: numberAttribute });\n readonly max = input(100, { transform: numberAttribute });\n readonly step = input(1, { transform: numberAttribute });\n /** Distância mínima entre os dois cursores. */\n readonly minGap = input(0, { transform: numberAttribute });\n /** Texto de cada valor, para o leitor de ecrã e as etiquetas. */\n readonly format = input<(v: number) => string>((v) => String(v));\n /** Mostra os dois valores por baixo da barra. */\n readonly showValues = input(false, { transform: booleanAttribute });\n readonly lowLabel = input<string>();\n readonly highLabel = input<string>();\n protected readonly i18n = injectMxMessages();\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly id = input<string | undefined>(undefined);\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n protected readonly field = inject(MxFormField, { optional: true });\n private readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly generatedId = mxUniqueId('mx-range');\n readonly controlId = computed(() => this.id() ?? this.generatedId);\n protected readonly lowId = mxUniqueId('mx-range-low');\n protected readonly highId = mxUniqueId('mx-range-high');\n protected readonly nameId = mxUniqueId('mx-range-name');\n private readonly formDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n protected readonly low = computed(() => this.value()?.[0] ?? this.min());\n protected readonly high = computed(() => this.value()?.[1] ?? this.max());\n private pct(v: number): number {\n const span = this.max() - this.min();\n return span > 0 ? ((v - this.min()) / span) * 100 : 0;\n }\n protected readonly fromPct = computed(() => this.pct(this.low()));\n protected readonly toPct = computed(() => this.pct(this.high()));\n\n private onChange: (value: [number, number] | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n protected labelledBy(partId: string): string {\n return `${this.field?.labelId() ?? this.nameId} ${partId}`;\n }\n\n protected onInput(which: 0 | 1, event: Event): void {\n const el = event.target as HTMLInputElement;\n let v = Number(el.value);\n const gap = this.minGap();\n if (which === 0) v = Math.min(v, this.high() - gap);\n else v = Math.max(v, this.low() + gap);\n // o input nativo pode ter passado o outro cursor: repõe a posição\n el.value = String(v);\n const next: [number, number] = which === 0 ? [v, this.high()] : [this.low(), v];\n this.value.set(next);\n this.onChange(next);\n }\n\n // ---- MxFormFieldControl ----\n errorState(): boolean {\n if (this.invalid()) return true;\n const c = this.ngControl;\n return !!c && !!c.invalid && !!(c.touched || c.dirty);\n }\n isRequired(): boolean {\n return this.required() || !!this.ngControl?.control?.hasValidator?.(Validators.required);\n }\n\n // ---- ControlValueAccessor ----\n writeValue(value: [number, number] | null): void {\n this.value.set(value ? [value[0], value[1]] : null);\n }\n registerOnChange(fn: (value: [number, number] | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { injectMxMessages } from '@muxima-ui/core/i18n';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Indicador de etapas de um fluxo (ex.: Dados, Pagamento, Confirmação).
|
|
@@ -31,14 +32,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
31
32
|
class MxStep {
|
|
32
33
|
state = input('upcoming', ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
|
|
33
34
|
/** Texto lido nas etapas concluídas. */
|
|
34
|
-
completeText = input(
|
|
35
|
+
completeText = input(...(ngDevMode ? [undefined, { debugName: "completeText" }] : /* istanbul ignore next */ []));
|
|
36
|
+
i18n = injectMxMessages();
|
|
35
37
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxStep, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
36
38
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: MxStep, isStandalone: true, selector: "li[mxStep]", inputs: { state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, completeText: { classPropertyName: "completeText", publicName: "completeText", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-state": "state()", "attr.aria-current": "state() === \"current\" ? \"step\" : null" }, classAttribute: "mx-step" }, ngImport: i0, template: `
|
|
37
39
|
<span class="mx-step-marker" aria-hidden="true"></span>
|
|
38
40
|
<span class="mx-step-label">
|
|
39
41
|
<ng-content />
|
|
40
42
|
@if (state() === 'complete') {
|
|
41
|
-
<span class="mx-visually-hidden"> ({{ completeText() }})</span>
|
|
43
|
+
<span class="mx-visually-hidden"> ({{ completeText() ?? i18n().stepper.complete }})</span>
|
|
42
44
|
}
|
|
43
45
|
</span>
|
|
44
46
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
@@ -59,7 +61,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
59
61
|
<span class="mx-step-label">
|
|
60
62
|
<ng-content />
|
|
61
63
|
@if (state() === 'complete') {
|
|
62
|
-
<span class="mx-visually-hidden"> ({{ completeText() }})</span>
|
|
64
|
+
<span class="mx-visually-hidden"> ({{ completeText() ?? i18n().stepper.complete }})</span>
|
|
63
65
|
}
|
|
64
66
|
</span>
|
|
65
67
|
`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxima-ui-core-stepper.mjs","sources":["../../../projects/core/stepper/stepper.ts","../../../projects/core/stepper/muxima-ui-core-stepper.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Directive, ViewEncapsulation, input } from '@angular/core';\n\nexport type MxStepState = 'complete' | 'current' | 'upcoming';\n\n/**\n * Indicador de etapas de um fluxo (ex.: Dados, Pagamento, Confirmação).\n * Mostra o progresso; a navegação entre etapas fica a cargo da tua aplicação.\n *\n * ```html\n * <ol mxStepper aria-label=\"Progresso da encomenda\">\n * <li mxStep state=\"complete\">Dados</li>\n * <li mxStep state=\"current\">Pagamento</li>\n * <li mxStep>Confirmação</li>\n * </ol>\n * ```\n *\n * A etapa actual recebe aria-current=\"step\" e as concluídas são anunciadas como tal.\n */\n@Directive({\n selector: 'ol[mxStepper]',\n host: { class: 'mx-stepper', '[attr.data-orientation]': 'orientation()' },\n})\nexport class MxStepper {\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\n}\n\n/** Uma etapa da lista. */\n@Component({\n selector: 'li[mxStep]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-step',\n '[attr.data-state]': 'state()',\n '[attr.aria-current]': 'state() === \"current\" ? \"step\" : null',\n },\n template: `\n <span class=\"mx-step-marker\" aria-hidden=\"true\"></span>\n <span class=\"mx-step-label\">\n <ng-content />\n @if (state() === 'complete') {\n <span class=\"mx-visually-hidden\"> ({{ completeText() }})</span>\n }\n </span>\n `,\n})\nexport class MxStep {\n readonly state = input<MxStepState>('upcoming');\n /** Texto lido nas etapas concluídas. */\n readonly completeText = input(
|
|
1
|
+
{"version":3,"file":"muxima-ui-core-stepper.mjs","sources":["../../../projects/core/stepper/stepper.ts","../../../projects/core/stepper/muxima-ui-core-stepper.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Directive, ViewEncapsulation, input } from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\n\nexport type MxStepState = 'complete' | 'current' | 'upcoming';\n\n/**\n * Indicador de etapas de um fluxo (ex.: Dados, Pagamento, Confirmação).\n * Mostra o progresso; a navegação entre etapas fica a cargo da tua aplicação.\n *\n * ```html\n * <ol mxStepper aria-label=\"Progresso da encomenda\">\n * <li mxStep state=\"complete\">Dados</li>\n * <li mxStep state=\"current\">Pagamento</li>\n * <li mxStep>Confirmação</li>\n * </ol>\n * ```\n *\n * A etapa actual recebe aria-current=\"step\" e as concluídas são anunciadas como tal.\n */\n@Directive({\n selector: 'ol[mxStepper]',\n host: { class: 'mx-stepper', '[attr.data-orientation]': 'orientation()' },\n})\nexport class MxStepper {\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\n}\n\n/** Uma etapa da lista. */\n@Component({\n selector: 'li[mxStep]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'mx-step',\n '[attr.data-state]': 'state()',\n '[attr.aria-current]': 'state() === \"current\" ? \"step\" : null',\n },\n template: `\n <span class=\"mx-step-marker\" aria-hidden=\"true\"></span>\n <span class=\"mx-step-label\">\n <ng-content />\n @if (state() === 'complete') {\n <span class=\"mx-visually-hidden\"> ({{ completeText() ?? i18n().stepper.complete }})</span>\n }\n </span>\n `,\n})\nexport class MxStep {\n readonly state = input<MxStepState>('upcoming');\n /** Texto lido nas etapas concluídas. */\n readonly completeText = input<string>();\n protected readonly i18n = injectMxMessages();\n}\n\nexport const MX_STEPPER = [MxStepper, MxStep] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAKA;;;;;;;;;;;;;AAaG;MAKU,SAAS,CAAA;AACX,IAAA,WAAW,GAAG,KAAK,CAA4B,YAAY,kFAAC;wGAD1D,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,EAAA,cAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAJrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,eAAe,EAAE;AAC1E,iBAAA;;AAKD;MAoBa,MAAM,CAAA;AACR,IAAA,KAAK,GAAG,KAAK,CAAc,UAAU,4EAAC;;IAEtC,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACpB,IAAI,GAAG,gBAAgB,EAAE;wGAJjC,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,2CAAA,EAAA,EAAA,cAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAVP;;;;;;;;AAQT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAEU,MAAM,EAAA,UAAA,EAAA,CAAA;kBAnBlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;oBACtB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,mBAAmB,EAAE,SAAS;AAC9B,wBAAA,qBAAqB,EAAE,uCAAuC;AAC/D,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;AAQT,EAAA,CAAA;AACF,iBAAA;;MAQY,UAAU,GAAG,CAAC,SAAS,EAAE,MAAM;;ACtD5C;;AAEG;;"}
|
|
@@ -115,15 +115,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
115
115
|
}]
|
|
116
116
|
}], propDecorators: { key: [{ type: i0.Input, args: [{ isSignal: true, alias: "mxSortHeader", required: true }] }] } });
|
|
117
117
|
/**
|
|
118
|
-
* Ordena uma lista segundo o estado de `MxTable`. Texto é comparado
|
|
119
|
-
* (acentos e maiúsculas), números numericamente.
|
|
118
|
+
* Ordena uma lista segundo o estado de `MxTable`. Texto é comparado segundo `locale`
|
|
119
|
+
* (português por omissão; acentos e maiúsculas contam como a mesma letra), números numericamente.
|
|
120
120
|
*/
|
|
121
|
-
function mxSortData(rows, sort, accessor) {
|
|
121
|
+
function mxSortData(rows, sort, accessor, locale = 'pt') {
|
|
122
122
|
if (!sort.active)
|
|
123
123
|
return [...rows];
|
|
124
124
|
const key = sort.active;
|
|
125
125
|
const get = accessor ?? ((row, k) => row[k]);
|
|
126
|
-
const collator = new Intl.Collator(
|
|
126
|
+
const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });
|
|
127
127
|
const dir = sort.direction === 'asc' ? 1 : -1;
|
|
128
128
|
return [...rows].sort((a, b) => {
|
|
129
129
|
const x = get(a, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxima-ui-core-table.mjs","sources":["../../../projects/core/table/table.ts","../../../projects/core/table/muxima-ui-core-table.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n} from '@angular/core';\n\nexport type MxSortDirection = 'asc' | 'desc';\n\nexport interface MxSortState {\n /** Coluna ordenada, ou null sem ordenação. */\n active: string | null;\n direction: MxSortDirection;\n}\n\n/**\n * Estilo de tabela sobre o `<table>` nativo, com ordenação opcional.\n *\n * ```html\n * <div class=\"mx-table-container\">\n * <table mxTable [(sort)]=\"ordem\">\n * <thead><tr>\n * <th mxSortHeader=\"nome\">Nome</th>\n * <th mxSortHeader=\"valor\" data-align=\"end\">Valor</th>\n * </tr></thead>\n * <tbody>...</tbody>\n * </table>\n * </div>\n * ```\n *\n * A tabela continua a ser HTML: os leitores de ecrã anunciam linhas,\n * colunas e cabeçalhos sem configuração.\n */\n@Directive({\n selector: 'table[mxTable]',\n exportAs: 'mxTable',\n host: {\n class: 'mx-table',\n '[attr.data-density]': 'density() === \"comfortable\" ? null : density()',\n '[attr.data-variant]': 'variant() === \"default\" ? null : variant()',\n '[attr.data-sticky-header]': 'stickyHeader() ? \"\" : null',\n },\n})\nexport class MxTable {\n /** Estado da ordenação. Aceita two-way binding: `[(sort)]`. */\n readonly sort = model<MxSortState>({ active: null, direction: 'asc' });\n readonly density = input<'comfortable' | 'compact'>('comfortable');\n /** default; striped: linhas alternadas; bordered: linhas entre colunas. */\n readonly variant = input<'default' | 'striped' | 'bordered'>('default');\n /** Mantém o cabeçalho visível ao fazer scroll (dá uma altura máxima ao contentor). */\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n\n /** Alterna: ascendente, descendente, sem ordenação. */\n toggleSort(key: string): void {\n const s = this.sort();\n if (s.active !== key) this.sort.set({ active: key, direction: 'asc' });\n else if (s.direction === 'asc') this.sort.set({ active: key, direction: 'desc' });\n else this.sort.set({ active: null, direction: 'asc' });\n }\n}\n\n/**\n * Cabeçalho ordenável. Coloca um botão dentro do `<th>` e mantém `aria-sort` actualizado.\n */\n@Component({\n selector: 'th[mxSortHeader]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[attr.aria-sort]': 'ariaSort()',\n },\n template: `\n <button type=\"button\" class=\"mx-sort-button\" (click)=\"table.toggleSort(key())\">\n <ng-content />\n <svg class=\"mx-sort-icon\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n @switch (ariaSort()) {\n @case ('ascending') {\n <path d=\"M8 12V4M4.5 7.5L8 4l3.5 3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n }\n @case ('descending') {\n <path d=\"M8 4v8M4.5 8.5L8 12l3.5-3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n }\n @default {\n <path d=\"M5 6.5L8 3.5l3 3M5 9.5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n }\n }\n </svg>\n </button>\n `,\n})\nexport class MxSortHeader {\n readonly key = input.required<string>({ alias: 'mxSortHeader' });\n protected readonly table = inject(MxTable);\n\n protected readonly ariaSort = computed(() => {\n const s = this.table.sort();\n if (s.active !== this.key()) return 'none';\n return s.direction === 'asc' ? 'ascending' : 'descending';\n });\n}\n\n/**\n * Ordena uma lista segundo o estado de `MxTable`. Texto é comparado
|
|
1
|
+
{"version":3,"file":"muxima-ui-core-table.mjs","sources":["../../../projects/core/table/table.ts","../../../projects/core/table/muxima-ui-core-table.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n} from '@angular/core';\n\nexport type MxSortDirection = 'asc' | 'desc';\n\nexport interface MxSortState {\n /** Coluna ordenada, ou null sem ordenação. */\n active: string | null;\n direction: MxSortDirection;\n}\n\n/**\n * Estilo de tabela sobre o `<table>` nativo, com ordenação opcional.\n *\n * ```html\n * <div class=\"mx-table-container\">\n * <table mxTable [(sort)]=\"ordem\">\n * <thead><tr>\n * <th mxSortHeader=\"nome\">Nome</th>\n * <th mxSortHeader=\"valor\" data-align=\"end\">Valor</th>\n * </tr></thead>\n * <tbody>...</tbody>\n * </table>\n * </div>\n * ```\n *\n * A tabela continua a ser HTML: os leitores de ecrã anunciam linhas,\n * colunas e cabeçalhos sem configuração.\n */\n@Directive({\n selector: 'table[mxTable]',\n exportAs: 'mxTable',\n host: {\n class: 'mx-table',\n '[attr.data-density]': 'density() === \"comfortable\" ? null : density()',\n '[attr.data-variant]': 'variant() === \"default\" ? null : variant()',\n '[attr.data-sticky-header]': 'stickyHeader() ? \"\" : null',\n },\n})\nexport class MxTable {\n /** Estado da ordenação. Aceita two-way binding: `[(sort)]`. */\n readonly sort = model<MxSortState>({ active: null, direction: 'asc' });\n readonly density = input<'comfortable' | 'compact'>('comfortable');\n /** default; striped: linhas alternadas; bordered: linhas entre colunas. */\n readonly variant = input<'default' | 'striped' | 'bordered'>('default');\n /** Mantém o cabeçalho visível ao fazer scroll (dá uma altura máxima ao contentor). */\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n\n /** Alterna: ascendente, descendente, sem ordenação. */\n toggleSort(key: string): void {\n const s = this.sort();\n if (s.active !== key) this.sort.set({ active: key, direction: 'asc' });\n else if (s.direction === 'asc') this.sort.set({ active: key, direction: 'desc' });\n else this.sort.set({ active: null, direction: 'asc' });\n }\n}\n\n/**\n * Cabeçalho ordenável. Coloca um botão dentro do `<th>` e mantém `aria-sort` actualizado.\n */\n@Component({\n selector: 'th[mxSortHeader]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[attr.aria-sort]': 'ariaSort()',\n },\n template: `\n <button type=\"button\" class=\"mx-sort-button\" (click)=\"table.toggleSort(key())\">\n <ng-content />\n <svg class=\"mx-sort-icon\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n @switch (ariaSort()) {\n @case ('ascending') {\n <path d=\"M8 12V4M4.5 7.5L8 4l3.5 3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n }\n @case ('descending') {\n <path d=\"M8 4v8M4.5 8.5L8 12l3.5-3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n }\n @default {\n <path d=\"M5 6.5L8 3.5l3 3M5 9.5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n }\n }\n </svg>\n </button>\n `,\n})\nexport class MxSortHeader {\n readonly key = input.required<string>({ alias: 'mxSortHeader' });\n protected readonly table = inject(MxTable);\n\n protected readonly ariaSort = computed(() => {\n const s = this.table.sort();\n if (s.active !== this.key()) return 'none';\n return s.direction === 'asc' ? 'ascending' : 'descending';\n });\n}\n\n/**\n * Ordena uma lista segundo o estado de `MxTable`. Texto é comparado segundo `locale`\n * (português por omissão; acentos e maiúsculas contam como a mesma letra), números numericamente.\n */\nexport function mxSortData<T>(\n rows: readonly T[],\n sort: MxSortState,\n accessor?: (row: T, key: string) => unknown,\n locale = 'pt',\n): T[] {\n if (!sort.active) return [...rows];\n const key = sort.active;\n const get = accessor ?? ((row: T, k: string) => (row as Record<string, unknown>)[k]);\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n const dir = sort.direction === 'asc' ? 1 : -1;\n return [...rows].sort((a, b) => {\n const x = get(a, key);\n const y = get(b, key);\n if (x == null && y == null) return 0;\n if (x == null) return 1;\n if (y == null) return -1;\n if (typeof x === 'number' && typeof y === 'number') return (x - y) * dir;\n return collator.compare(String(x), String(y)) * dir;\n });\n}\n\nexport const MX_TABLE = [MxTable, MxSortHeader] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|