@muxima-ui/core 1.4.0 → 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.
Files changed (87) hide show
  1. package/README.md +11 -0
  2. package/fesm2022/muxima-ui-core-alert.mjs +5 -3
  3. package/fesm2022/muxima-ui-core-alert.mjs.map +1 -1
  4. package/fesm2022/muxima-ui-core-breadcrumb.mjs +5 -3
  5. package/fesm2022/muxima-ui-core-breadcrumb.mjs.map +1 -1
  6. package/fesm2022/muxima-ui-core-carousel.mjs +19 -17
  7. package/fesm2022/muxima-ui-core-carousel.mjs.map +1 -1
  8. package/fesm2022/muxima-ui-core-chips.mjs +19 -14
  9. package/fesm2022/muxima-ui-core-chips.mjs.map +1 -1
  10. package/fesm2022/muxima-ui-core-clipboard.mjs +10 -6
  11. package/fesm2022/muxima-ui-core-clipboard.mjs.map +1 -1
  12. package/fesm2022/muxima-ui-core-color-picker.mjs +53 -50
  13. package/fesm2022/muxima-ui-core-color-picker.mjs.map +1 -1
  14. package/fesm2022/muxima-ui-core-combobox.mjs +15 -12
  15. package/fesm2022/muxima-ui-core-combobox.mjs.map +1 -1
  16. package/fesm2022/muxima-ui-core-command.mjs +21 -16
  17. package/fesm2022/muxima-ui-core-command.mjs.map +1 -1
  18. package/fesm2022/muxima-ui-core-data-grid.mjs +50 -52
  19. package/fesm2022/muxima-ui-core-data-grid.mjs.map +1 -1
  20. package/fesm2022/muxima-ui-core-date-picker.mjs +97 -69
  21. package/fesm2022/muxima-ui-core-date-picker.mjs.map +1 -1
  22. package/fesm2022/muxima-ui-core-editor.mjs +25 -19
  23. package/fesm2022/muxima-ui-core-editor.mjs.map +1 -1
  24. package/fesm2022/muxima-ui-core-file-upload.mjs +30 -25
  25. package/fesm2022/muxima-ui-core-file-upload.mjs.map +1 -1
  26. package/fesm2022/muxima-ui-core-i18n.mjs +550 -0
  27. package/fesm2022/muxima-ui-core-i18n.mjs.map +1 -0
  28. package/fesm2022/muxima-ui-core-image-cropper.mjs +27 -24
  29. package/fesm2022/muxima-ui-core-image-cropper.mjs.map +1 -1
  30. package/fesm2022/muxima-ui-core-kanban.mjs +22 -19
  31. package/fesm2022/muxima-ui-core-kanban.mjs.map +1 -1
  32. package/fesm2022/muxima-ui-core-notification-center.mjs +41 -36
  33. package/fesm2022/muxima-ui-core-notification-center.mjs.map +1 -1
  34. package/fesm2022/muxima-ui-core-pagination.mjs +29 -26
  35. package/fesm2022/muxima-ui-core-pagination.mjs.map +1 -1
  36. package/fesm2022/muxima-ui-core-progress.mjs +5 -3
  37. package/fesm2022/muxima-ui-core-progress.mjs.map +1 -1
  38. package/fesm2022/muxima-ui-core-rating.mjs +12 -8
  39. package/fesm2022/muxima-ui-core-rating.mjs.map +1 -1
  40. package/fesm2022/muxima-ui-core-select.mjs +14 -11
  41. package/fesm2022/muxima-ui-core-select.mjs.map +1 -1
  42. package/fesm2022/muxima-ui-core-sidebar.mjs +10 -7
  43. package/fesm2022/muxima-ui-core-sidebar.mjs.map +1 -1
  44. package/fesm2022/muxima-ui-core-slider.mjs +8 -6
  45. package/fesm2022/muxima-ui-core-slider.mjs.map +1 -1
  46. package/fesm2022/muxima-ui-core-stepper.mjs +5 -3
  47. package/fesm2022/muxima-ui-core-stepper.mjs.map +1 -1
  48. package/fesm2022/muxima-ui-core-table.mjs +4 -4
  49. package/fesm2022/muxima-ui-core-table.mjs.map +1 -1
  50. package/fesm2022/muxima-ui-core-time-picker.mjs +7 -5
  51. package/fesm2022/muxima-ui-core-time-picker.mjs.map +1 -1
  52. package/fesm2022/muxima-ui-core-toast.mjs +8 -5
  53. package/fesm2022/muxima-ui-core-toast.mjs.map +1 -1
  54. package/fesm2022/muxima-ui-core-tour.mjs +10 -11
  55. package/fesm2022/muxima-ui-core-tour.mjs.map +1 -1
  56. package/fesm2022/muxima-ui-core.mjs +1 -1
  57. package/fesm2022/muxima-ui-core.mjs.map +1 -1
  58. package/package.json +6 -2
  59. package/styles/components/data-grid.css +1 -0
  60. package/types/muxima-ui-core-alert.d.ts +3 -1
  61. package/types/muxima-ui-core-breadcrumb.d.ts +6 -4
  62. package/types/muxima-ui-core-carousel.d.ts +4 -2
  63. package/types/muxima-ui-core-chips.d.ts +23 -3
  64. package/types/muxima-ui-core-clipboard.d.ts +6 -3
  65. package/types/muxima-ui-core-color-picker.d.ts +40 -7
  66. package/types/muxima-ui-core-combobox.d.ts +6 -3
  67. package/types/muxima-ui-core-command.d.ts +7 -3
  68. package/types/muxima-ui-core-data-grid.d.ts +31 -11
  69. package/types/muxima-ui-core-date-picker.d.ts +59 -14
  70. package/types/muxima-ui-core-editor.d.ts +13 -2
  71. package/types/muxima-ui-core-file-upload.d.ts +22 -6
  72. package/types/muxima-ui-core-i18n.d.ts +322 -0
  73. package/types/muxima-ui-core-image-cropper.d.ts +19 -6
  74. package/types/muxima-ui-core-kanban.d.ts +16 -3
  75. package/types/muxima-ui-core-notification-center.d.ts +30 -8
  76. package/types/muxima-ui-core-pagination.d.ts +16 -1
  77. package/types/muxima-ui-core-progress.d.ts +10 -8
  78. package/types/muxima-ui-core-rating.d.ts +6 -2
  79. package/types/muxima-ui-core-select.d.ts +6 -3
  80. package/types/muxima-ui-core-sidebar.d.ts +6 -3
  81. package/types/muxima-ui-core-slider.d.ts +4 -2
  82. package/types/muxima-ui-core-stepper.d.ts +10 -8
  83. package/types/muxima-ui-core-table.d.ts +3 -3
  84. package/types/muxima-ui-core-time-picker.d.ts +3 -1
  85. package/types/muxima-ui-core-toast.d.ts +3 -0
  86. package/types/muxima-ui-core-tour.d.ts +6 -1
  87. 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('Principal', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
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('Recolher menu', ...(ngDevMode ? [{ debugName: "collapseLabel" }] : /* istanbul ignore next */ []));
296
- expandLabel = input('Expandir menu', ...(ngDevMode ? [{ debugName: "expandLabel" }] : /* istanbul ignore next */ []));
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('mínimo', ...(ngDevMode ? [{ debugName: "lowLabel" }] : /* istanbul ignore next */ []));
81
- highLabel = input('máximo', ...(ngDevMode ? [{ debugName: "highLabel" }] : /* istanbul ignore next */ []));
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('concluído', ...(ngDevMode ? [{ debugName: "completeText" }] : /* istanbul ignore next */ []));
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('concluído');\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":";;;AAIA;;;;;;;;;;;;;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;;AAEtC,IAAA,YAAY,GAAG,KAAK,CAAC,WAAW,mFAAC;wGAH/B,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;;MAOY,UAAU,GAAG,CAAC,SAAS,EAAE,MAAM;;ACpD5C;;AAEG;;"}
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 em português
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('pt', { numeric: true, sensitivity: 'base' });
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 em português\n * (acentos e maiúsculas), números numericamente.\n */\nexport function mxSortData<T>(rows: readonly T[], sort: MxSortState, accessor?: (row: T, key: string) => unknown): 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('pt', { 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":";;;AAoBA;;;;;;;;;;;;;;;;;AAiBG;MAWU,OAAO,CAAA;;AAET,IAAA,IAAI,GAAG,KAAK,CAAc,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2EAAC;AAC7D,IAAA,OAAO,GAAG,KAAK,CAA4B,aAAa,8EAAC;;AAEzD,IAAA,OAAO,GAAG,KAAK,CAAqC,SAAS,8EAAC;;IAE9D,YAAY,GAAG,KAAK,CAAC,KAAK,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAGrE,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACjE,aAAA,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;;AAC5E,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxD;wGAfW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,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,OAAA,EAAA,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,mBAAA,EAAA,kDAAA,EAAA,mBAAA,EAAA,8CAAA,EAAA,yBAAA,EAAA,8BAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAP,OAAO,EAAA,UAAA,EAAA,CAAA;kBAVnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,qBAAqB,EAAE,gDAAgD;AACvE,wBAAA,qBAAqB,EAAE,4CAA4C;AACnE,wBAAA,2BAA2B,EAAE,4BAA4B;AAC1D,qBAAA;AACF,iBAAA;;AAmBD;;AAEG;MA2BU,YAAY,CAAA;IACd,GAAG,GAAG,KAAK,CAAC,QAAQ,0EAAW,KAAK,EAAE,cAAc,EAAA,CAAG;AAC7C,IAAA,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;AAEvB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AAC3B,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE;AAAE,YAAA,OAAO,MAAM;AAC1C,QAAA,OAAO,CAAC,CAAC,SAAS,KAAK,KAAK,GAAG,WAAW,GAAG,YAAY;AAC3D,IAAA,CAAC,+EAAC;wGARS,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnBb;;;;;;;;;;;;;;;;;AAiBT,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,YAAY,EAAA,UAAA,EAAA,CAAA;kBA1BxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;oBAC5B,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,kBAAkB,EAAE,YAAY;AACjC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA;AACF,iBAAA;;AAYD;;;AAGG;SACa,UAAU,CAAI,IAAkB,EAAE,IAAiB,EAAE,QAA2C,EAAA;IAC9G,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC;AAClC,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;AACvB,IAAA,MAAM,GAAG,GAAG,QAAQ,KAAK,CAAC,GAAM,EAAE,CAAS,KAAM,GAA+B,CAAC,CAAC,CAAC,CAAC;AACpF,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAChF,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7C,IAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;QACrB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;AACxE,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;AACrD,IAAA,CAAC,CAAC;AACJ;MAEa,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY;;AC/H9C;;AAEG;;"}
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":";;;AAoBA;;;;;;;;;;;;;;;;;AAiBG;MAWU,OAAO,CAAA;;AAET,IAAA,IAAI,GAAG,KAAK,CAAc,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2EAAC;AAC7D,IAAA,OAAO,GAAG,KAAK,CAA4B,aAAa,8EAAC;;AAEzD,IAAA,OAAO,GAAG,KAAK,CAAqC,SAAS,8EAAC;;IAE9D,YAAY,GAAG,KAAK,CAAC,KAAK,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAGrE,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACjE,aAAA,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;;AAC5E,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxD;wGAfW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,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,OAAA,EAAA,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,mBAAA,EAAA,kDAAA,EAAA,mBAAA,EAAA,8CAAA,EAAA,yBAAA,EAAA,8BAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAP,OAAO,EAAA,UAAA,EAAA,CAAA;kBAVnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,qBAAqB,EAAE,gDAAgD;AACvE,wBAAA,qBAAqB,EAAE,4CAA4C;AACnE,wBAAA,2BAA2B,EAAE,4BAA4B;AAC1D,qBAAA;AACF,iBAAA;;AAmBD;;AAEG;MA2BU,YAAY,CAAA;IACd,GAAG,GAAG,KAAK,CAAC,QAAQ,0EAAW,KAAK,EAAE,cAAc,EAAA,CAAG;AAC7C,IAAA,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;AAEvB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AAC3B,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE;AAAE,YAAA,OAAO,MAAM;AAC1C,QAAA,OAAO,CAAC,CAAC,SAAS,KAAK,KAAK,GAAG,WAAW,GAAG,YAAY;AAC3D,IAAA,CAAC,+EAAC;wGARS,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnBb;;;;;;;;;;;;;;;;;AAiBT,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,YAAY,EAAA,UAAA,EAAA,CAAA;kBA1BxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;oBAC5B,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,kBAAkB,EAAE,YAAY;AACjC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA;AACF,iBAAA;;AAYD;;;AAGG;AACG,SAAU,UAAU,CACxB,IAAkB,EAClB,IAAiB,EACjB,QAA2C,EAC3C,MAAM,GAAG,IAAI,EAAA;IAEb,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC;AAClC,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;AACvB,IAAA,MAAM,GAAG,GAAG,QAAQ,KAAK,CAAC,GAAM,EAAE,CAAS,KAAM,GAA+B,CAAC,CAAC,CAAC,CAAC;AACpF,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAClF,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7C,IAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;QACrB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;AACxE,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;AACrD,IAAA,CAAC,CAAC;AACJ;MAEa,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY;;ACpI9C;;AAEG;;"}