@seniorsistemas/angular-components 18.0.0 → 18.0.2

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 (63) hide show
  1. package/badge/lib/badge/badge.component.d.ts +2 -1
  2. package/badge/lib/badge/badge.module.d.ts +3 -1
  3. package/esm2022/badge/lib/badge/badge.component.mjs +6 -4
  4. package/esm2022/badge/lib/badge/badge.module.mjs +6 -4
  5. package/esm2022/button/lib/button/button.component.mjs +2 -2
  6. package/esm2022/custom-fields/lib/custom-fields/custom-fields.component.mjs +10 -15
  7. package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/lookup.component.mjs +2 -2
  8. package/esm2022/file-upload/lib/file-upload/file-upload.component.mjs +23 -6
  9. package/esm2022/file-upload/lib/file-upload/file-upload.module.mjs +7 -3
  10. package/esm2022/ia-insight/lib/ia-insight/components/ia-insight-card/ia-insight-card.component.mjs +1 -1
  11. package/esm2022/kanban/lib/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +1 -1
  12. package/esm2022/label-value/lib/label-value/label-value.component.mjs +1 -1
  13. package/esm2022/locale/lib/locale/locale.service.mjs +43 -20
  14. package/esm2022/locale/lib/locale/options/index.mjs +7 -6
  15. package/esm2022/locale/lib/locale/pipes/localized-date.pipe.mjs +1 -1
  16. package/esm2022/locale/lib/locale/pipes/localized-time.pipe.mjs +7 -7
  17. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +579 -0
  18. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.module.mjs +16 -0
  19. package/esm2022/numeric-mask/public-api.mjs +3 -0
  20. package/esm2022/numeric-mask/seniorsistemas-angular-components-numeric-mask.mjs +5 -0
  21. package/esm2022/object-card/lib/object-card/elements/field/object-card-field.component.mjs +7 -4
  22. package/esm2022/object-card/lib/object-card/object-card.module.mjs +5 -4
  23. package/esm2022/table/lib/table/table-column/table-columns.component.mjs +1 -1
  24. package/esm2022/tooltip/lib/tooltip/tooltip.directive.mjs +26 -20
  25. package/fesm2022/seniorsistemas-angular-components-badge.mjs +10 -6
  26. package/fesm2022/seniorsistemas-angular-components-badge.mjs.map +1 -1
  27. package/fesm2022/seniorsistemas-angular-components-button.mjs +1 -1
  28. package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
  29. package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs +9 -14
  30. package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  32. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  33. package/fesm2022/seniorsistemas-angular-components-file-upload.mjs +27 -6
  34. package/fesm2022/seniorsistemas-angular-components-file-upload.mjs.map +1 -1
  35. package/fesm2022/seniorsistemas-angular-components-ia-insight.mjs +1 -1
  36. package/fesm2022/seniorsistemas-angular-components-ia-insight.mjs.map +1 -1
  37. package/fesm2022/seniorsistemas-angular-components-kanban.mjs +1 -1
  38. package/fesm2022/seniorsistemas-angular-components-kanban.mjs.map +1 -1
  39. package/fesm2022/seniorsistemas-angular-components-label-value.mjs +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-label-value.mjs.map +1 -1
  41. package/fesm2022/seniorsistemas-angular-components-locale.mjs +41 -17
  42. package/fesm2022/seniorsistemas-angular-components-locale.mjs.map +1 -1
  43. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +599 -0
  44. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -0
  45. package/fesm2022/seniorsistemas-angular-components-object-card.mjs +10 -6
  46. package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
  47. package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
  48. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  49. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs +23 -17
  50. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs.map +1 -1
  51. package/file-upload/lib/file-upload/file-upload.component.d.ts +1 -0
  52. package/file-upload/lib/file-upload/file-upload.module.d.ts +2 -1
  53. package/locale/lib/locale/locale.service.d.ts +14 -4
  54. package/locale/lib/locale/options/index.d.ts +6 -5
  55. package/locale/lib/locale/pipes/localized-time.pipe.d.ts +2 -2
  56. package/numeric-mask/README.md +367 -0
  57. package/numeric-mask/index.d.ts +5 -0
  58. package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +195 -0
  59. package/numeric-mask/lib/numeric-mask/numeric-mask.module.d.ts +7 -0
  60. package/numeric-mask/public-api.d.ts +2 -0
  61. package/object-card/lib/object-card/elements/field/object-card-field.component.d.ts +4 -1
  62. package/object-card/lib/object-card/object-card.module.d.ts +2 -1
  63. package/package.json +7 -1
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-tooltip.mjs","sources":["../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.html","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.directive.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.module.ts","../../projects/angular-components/tooltip/src/seniorsistemas-angular-components-tooltip.ts"],"sourcesContent":["import { Component, signal } from '@angular/core';\n\nimport { TooltipPositions } from './models/tooltip-position';\n\n@Component({\n templateUrl: './tooltip.component.html',\n styleUrls: ['./tooltip.component.scss'],\n})\nexport class TooltipComponent {\n public tooltip = '';\n public position: TooltipPositions = 'top';\n public left = 0;\n public top = 0;\n public visible = false;\n public escape = false;\n}\n","<div\n id=\"tooltip\"\n class=\"tooltip\"\n [ngClass]=\"['tooltip--' + position]\"\n [class.tooltip--visible]=\"visible\"\n [ngStyle]=\"{\n left: left + 'px',\n top: top + 'px',\n }\"\n>\n @if (escape) {\n <span class=\"tooltip__content\">\n {{ tooltip }}\n </span>\n } @else {\n <span\n class=\"tooltip__content\"\n [innerHTML]=\"tooltip\"\n >\n </span>\n }\n</div>\n","import {\n ApplicationRef,\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n input,\n Input,\n OnDestroy,\n OnInit,\n Renderer2,\n ViewContainerRef\n} from '@angular/core';\nimport { DebounceUtils } from '@seniorsistemas/angular-components/common';\nimport { getElementLeftoverContentAvailable, getElementPositionInfo, isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\nimport { MobileBehavior } from './models/mobile-behavior';\nimport { TooltipEvent } from './models/tooltip-event';\nimport { TooltipPositions } from './models/tooltip-position';\nimport { TooltipComponent } from './tooltip.component';\n\n@Directive({\n selector: '[sTooltip]',\n standalone: true,\n})\nexport class TooltipDirective implements OnInit, OnDestroy {\n @Input('sTooltip')\n public tooltip?: string;\n\n @Input()\n public tooltipPosition: TooltipPositions = 'top';\n\n @Input()\n public showDelay = 500;\n\n @Input()\n public displayTime?: number;\n\n @Input()\n public tooltipEvent: TooltipEvent = 'hover';\n\n @Input()\n public escape = false;\n\n @Input()\n public visible = true;\n\n @Input()\n public mobileBehavior: MobileBehavior = 'pressing';\n\n @Input()\n public focusedInputRef: HTMLInputElement | null = null;\n\n checkTruncatedText = input(false);\n\n private componentRef: ComponentRef<TooltipComponent> | null = null;\n private showTimeout?: number;\n private touchTimeout?: number;\n private tooltipDivElement: HTMLElement | null = null;\n private readonly debounceCreateTooltipFunction: () => void;\n private tooltipCreatedByFocus = false;\n\n constructor(\n private readonly elementRef: ElementRef,\n private readonly appRef: ApplicationRef,\n private readonly debounceUtils: DebounceUtils,\n private readonly renderer: Renderer2,\n private readonly viewContainerRef: ViewContainerRef,\n ) {\n this.debounceCreateTooltipFunction = this.debounceUtils.debounceLeading(() => this._createTooltip(true, true));\n }\n\n public ngOnInit(): void {\n this.validatePosition();\n this.updateTooltipVisibilityWhenFocusOnInput();\n }\n\n public ngOnDestroy(): void {\n this.destroy();\n }\n\n /**\n * Manipula a visibilidade do tooltip quando houver uma referência de input.\n */\n private updateTooltipVisibilityWhenFocusOnInput() {\n if (this.focusedInputRef) {\n const inputFocus = this.focusedInputRef;\n const icon = this.getIconFromFocusedInput();\n this.renderer.listen(inputFocus, 'focus', () => {\n if (icon) {\n this._createTooltip(false, false)\n this.tooltipCreatedByFocus = true;\n }\n });\n this.renderer.listen(inputFocus, 'blur', () => {\n if (icon) {\n this.removeTooltip(icon);\n this.destroy();\n this.tooltipCreatedByFocus = false;\n }\n });\n }\n }\n\n /**\n * Obtém o elemento do ícone associado ao label do input em focus.\n * @returns O ícone do input em focus.\n */\n private getIconFromFocusedInput(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n /**\n * Remove o tooltip associado ao ícone do input em focus.\n * @param icon O ícone do input em focus.\n */\n private removeTooltip(icon: HTMLElement): void {\n const tooltip = icon.querySelector('.tooltip') as HTMLElement;\n if (tooltip) {\n tooltip.remove();\n }\n }\n\n // whenever the component with the tooltip is clicked I destroy the tooltip.\n // whenever a key is pressed on the component with the tooltip I destroy the tooltip.\n @HostListener('click')\n @HostListener('keydown')\n public onClick(): void {\n if (this.tooltipEvent === 'hover' && !navigator.userAgent.match(/Android/i) && !navigator.userAgent.match(/iPhone/i)) {\n this.destroy();\n }\n }\n\n @HostListener('focus')\n public onFocus(): void {\n if (this.tooltipEvent === 'focus') {\n this._createTooltip(true, true);\n }\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this.tooltipEvent === 'focus') {\n this.destroy();\n }\n }\n\n @HostListener(\"mouseenter\")\n public onMouseEnter(): void {\n if (this.tooltipEvent === 'hover' || this.focusedInputRef) {\n this.debounceCreateTooltipFunction();\n }\n }\n\n @HostListener(\"mouseleave\")\n @HostListener(\"wheel\")\n public onMouseLeave(): void {\n if ((this.tooltipEvent === 'hover' || this.focusedInputRef) && !this.tooltipCreatedByFocus) {\n this.destroy();\n }\n }\n\n @HostListener('touchstart')\n public onTouchStart(): void {\n if (this.tooltipEvent === 'hover') {\n window.clearTimeout(this.touchTimeout);\n const _delay = this.mobileBehavior === 'pressing' ? this.showDelay : 0\n this.touchTimeout = window.setTimeout(() => {\n this._createTooltip(true, true);\n }, _delay);\n }\n }\n\n @HostListener('touchend')\n public onTouchEnd(): void {\n if (this.tooltipEvent === 'hover') {\n if (this.mobileBehavior === 'pressing') {\n window.clearTimeout(this.touchTimeout);\n this.destroy();\n }\n }\n }\n\n private validatePosition() {\n const containsPosition = ['top', 'right', 'bottom', 'left'].includes(this.tooltipPosition);\n\n if (!containsPosition) {\n this.tooltipPosition = 'top';\n throw new Error(`Tooltip ${this.tooltipPosition} position is unexpected`);\n }\n }\n\n private getDomElement(): HTMLElement {\n this.componentRef = this.viewContainerRef.createComponent(TooltipComponent);\n return this.componentRef.location.nativeElement;\n }\n\n private _createTooltip(useShowDelay = false, autoDestroy = true) {\n const hasText = (this.tooltip || '').length > 0;\n const hasComponentRef = this.componentRef !== null;\n if (!hasText || hasComponentRef) {\n return;\n }\n const blockIfIsNotTruncatedContent = this.checkTruncatedText() ? !this.contentIsTruncated : false;\n if (blockIfIsNotTruncatedContent) {\n return;\n }\n const domElement = this.getDomElement();\n document.body.appendChild(domElement);\n this.tooltipDivElement = domElement.querySelector(\".tooltip\");\n this.setTooltipComponentProperties();\n const _showDelay = useShowDelay ? this.showDelay : 0;\n setTimeout(() => {\n this.showTooltip()\n }, _showDelay)\n\n\n\n this.renderer.listen(window, \"scroll\", () => {\n this.setTooltipPositionProperty();\n });\n\n if (autoDestroy && this.displayTime) {\n setTimeout(() => {\n this.destroy();\n }, this.displayTime)\n }\n\n }\n\n private showTooltip() {\n if (this.componentRef) {\n this.componentRef.instance.visible = this.visible;\n\n this.setTooltipPositionProperty();\n }\n }\n\n private setTooltipPositionProperty() {\n if (!this.componentRef) {\n return\n }\n const anchorSize = 5;\n const { left, right } = this.elementRef.nativeElement.getBoundingClientRect();\n\n const tooltipElementPosition = getElementPositionInfo(this.tooltipDivElement!);\n const elementLeftover = getElementLeftoverContentAvailable(this.elementRef.nativeElement);\n const elementTriggerPosition = getElementPositionInfo(this.elementRef.nativeElement);\n const horizontalPositions: TooltipPositions[] = ['left', 'right'];\n const isPositionHorizontal = horizontalPositions.includes(this.tooltipPosition);\n const distanceToBorders = isPositionHorizontal ? tooltipElementPosition.elementWidth : tooltipElementPosition.elementHorizontalCenter;\n const canSetAtTop = elementLeftover.freeDistanceToTop > tooltipElementPosition.elementHeight;\n const canSetAtLeft = elementLeftover.freeDistanceToLeft > distanceToBorders;\n const canSetAtRight = elementLeftover.freeDistanceToRight > distanceToBorders;\n const canSetAtBottom = elementLeftover.freeDistanceToBottom > tooltipElementPosition.elementHeight;\n const topVertical = elementTriggerPosition.top + elementTriggerPosition.elementVerticalCenter;\n const checkTopPosition = () => {\n return canSetAtTop && canSetAtLeft && canSetAtRight;\n }\n const checkBottomPosition = () => {\n return canSetAtBottom && canSetAtLeft && canSetAtRight;\n }\n const checkLeftPosition = () => {\n return canSetAtLeft && canSetAtTop && canSetAtBottom;\n }\n\n const checkRightPosition = () => {\n return canSetAtRight && canSetAtTop && canSetAtBottom;\n }\n\n const setTopPosition = (): { left: number, top: number } => {\n return {\n left: left + (right - left) / 2,\n top: elementTriggerPosition.top - anchorSize\n }\n }\n\n const setBottomPosition = (): { left: number, top: number } => {\n return {\n left: left + (right - left) / 2,\n top: elementTriggerPosition.top + elementTriggerPosition.elementHeight\n };\n }\n\n const setLeftPosition = (): { left: number, top: number } => {\n return {\n left: left,\n top: topVertical\n };\n }\n\n const setRightPosition = (): { left: number, top: number } => {\n return {\n left: right,\n top: topVertical\n };\n }\n\n type Position = {\n pos: TooltipPositions,\n check: () => boolean,\n set: () => { left: number, top: number }\n }\n\n const positions: Position[] = [\n {\n pos: 'top',\n check: checkTopPosition,\n set: setTopPosition\n },\n {\n pos: 'bottom',\n check: checkBottomPosition,\n set: setBottomPosition\n },\n {\n pos: 'left',\n check: checkLeftPosition,\n set: setLeftPosition\n },\n {\n pos: 'right',\n check: checkRightPosition,\n set: setRightPosition\n\n }\n ];\n\n const positionDefined = positions.find((position) => position.pos === this.tooltipPosition);\n let validPosition: Position | undefined = positionDefined;\n const canUseDefinedPosition = positionDefined?.check();\n if (canUseDefinedPosition) {\n validPosition = positionDefined;\n } else if (!canUseDefinedPosition) {\n const validAlternativePosition = positions.find((position) => position.check());\n if (validAlternativePosition) {\n validPosition = validAlternativePosition;\n }\n }\n const _position = validPosition!.set();\n const positionLeft = _position.left;\n const positionTop = _position.top;\n this.componentRef.instance.left = Math.round(positionLeft);\n this.componentRef.instance.top = Math.round(positionTop);\n this.componentRef.instance.position = validPosition!.pos;\n }\n\n private setTooltipComponentProperties() {\n if (!this.componentRef) return;\n\n this.componentRef.instance.tooltip = this.tooltip as string;\n this.componentRef.instance.escape = this.escape;\n }\n\n private destroy(): void {\n if (!isNullOrUndefined(this.componentRef)) {\n window.clearTimeout(this.showTimeout);\n this.appRef.detachView(this.componentRef.hostView);\n this.componentRef.destroy();\n this.componentRef = null;\n this.tooltipDivElement = null;\n }\n }\n\n private get contentIsTruncated() {\n const element = this.elementRef.nativeElement as HTMLElement;\n return element.scrollWidth > element.clientWidth;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { TooltipComponent } from './tooltip.component';\nimport { TooltipDirective } from './tooltip.directive';\n\n@NgModule({\n imports: [CommonModule, TooltipDirective],\n declarations: [TooltipComponent],\n exports: [TooltipDirective],\n})\nexport class TooltipModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-tooltip.mjs","sources":["../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.component.html","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.directive.ts","../../projects/angular-components/tooltip/src/lib/tooltip/tooltip.module.ts","../../projects/angular-components/tooltip/src/seniorsistemas-angular-components-tooltip.ts"],"sourcesContent":["import { Component, signal } from '@angular/core';\n\nimport { TooltipPositions } from './models/tooltip-position';\n\n@Component({\n templateUrl: './tooltip.component.html',\n styleUrls: ['./tooltip.component.scss'],\n})\nexport class TooltipComponent {\n public tooltip = '';\n public position: TooltipPositions = 'top';\n public left = 0;\n public top = 0;\n public visible = false;\n public escape = false;\n}\n","<div\n id=\"tooltip\"\n class=\"tooltip\"\n [ngClass]=\"['tooltip--' + position]\"\n [class.tooltip--visible]=\"visible\"\n [ngStyle]=\"{\n left: left + 'px',\n top: top + 'px',\n }\"\n>\n @if (escape) {\n <span class=\"tooltip__content\">\n {{ tooltip }}\n </span>\n } @else {\n <span\n class=\"tooltip__content\"\n [innerHTML]=\"tooltip\"\n >\n </span>\n }\n</div>\n","import {\n ApplicationRef,\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n input,\n Input,\n OnDestroy,\n OnInit,\n Renderer2,\n ViewContainerRef,\n} from '@angular/core';\nimport { DebounceUtils } from '@seniorsistemas/angular-components/common';\nimport {\n getElementLeftoverContentAvailable,\n getElementPositionInfo,\n isNullOrUndefined,\n} from '@seniorsistemas/angular-components/utils';\nimport { MobileBehavior } from './models/mobile-behavior';\nimport { TooltipEvent } from './models/tooltip-event';\nimport { TooltipPositions } from './models/tooltip-position';\nimport { TooltipComponent } from './tooltip.component';\n\n@Directive({\n selector: '[sTooltip]',\n standalone: true,\n})\nexport class TooltipDirective implements OnInit, OnDestroy {\n @Input('sTooltip')\n public tooltip?: string;\n\n @Input()\n public tooltipPosition: TooltipPositions = 'top';\n\n @Input()\n public showDelay = 500;\n\n @Input()\n public displayTime?: number;\n\n @Input()\n public tooltipEvent: TooltipEvent = 'hover';\n\n @Input()\n public escape = false;\n\n @Input()\n public visible = true;\n\n @Input()\n public mobileBehavior: MobileBehavior = 'pressing';\n\n @Input()\n public focusedInputRef: HTMLInputElement | null = null;\n\n checkTruncatedText = input(false);\n\n private componentRef: ComponentRef<TooltipComponent> | null = null;\n private showTimeout?: number;\n private touchTimeout?: number;\n private tooltipDivElement: HTMLElement | null = null;\n private readonly debounceCreateTooltipFunction: () => void;\n private tooltipCreatedByFocus = false;\n\n constructor(\n private readonly elementRef: ElementRef,\n private readonly appRef: ApplicationRef,\n private readonly debounceUtils: DebounceUtils,\n private readonly renderer: Renderer2,\n private readonly viewContainerRef: ViewContainerRef,\n ) {\n this.debounceCreateTooltipFunction = this.debounceUtils.debounceLeading(() => this._createTooltip(true, true));\n }\n\n public ngOnInit(): void {\n this.validatePosition();\n this.updateTooltipVisibilityWhenFocusOnInput();\n }\n\n public ngOnDestroy(): void {\n this.destroy();\n }\n\n /**\n * Manipula a visibilidade do tooltip quando houver uma referência de input.\n */\n private updateTooltipVisibilityWhenFocusOnInput() {\n if (this.focusedInputRef) {\n const inputFocus = this.focusedInputRef;\n const icon = this.getIconFromFocusedInput();\n this.renderer.listen(inputFocus, 'focus', () => {\n if (icon) {\n this._createTooltip(false, false);\n this.tooltipCreatedByFocus = true;\n }\n });\n this.renderer.listen(inputFocus, 'blur', () => {\n if (icon) {\n this.removeTooltip(icon);\n this.destroy();\n this.tooltipCreatedByFocus = false;\n }\n });\n }\n }\n\n /**\n * Obtém o elemento do ícone associado ao label do input em focus.\n * @returns O ícone do input em focus.\n */\n private getIconFromFocusedInput(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n /**\n * Remove o tooltip associado ao ícone do input em focus.\n * @param icon O ícone do input em focus.\n */\n private removeTooltip(icon: HTMLElement): void {\n const tooltip = icon.querySelector('.tooltip') as HTMLElement;\n if (tooltip) {\n tooltip.remove();\n }\n }\n\n // whenever the component with the tooltip is clicked I destroy the tooltip.\n // whenever a key is pressed on the component with the tooltip I destroy the tooltip.\n @HostListener('click')\n @HostListener('keydown')\n public onClick(): void {\n if (\n this.tooltipEvent === 'hover' &&\n !navigator.userAgent.match(/Android/i) &&\n !navigator.userAgent.match(/iPhone/i)\n ) {\n this.destroy();\n }\n }\n\n @HostListener('focus')\n public onFocus(): void {\n if (this.tooltipEvent === 'focus') {\n this._createTooltip(true, true);\n }\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this.tooltipEvent === 'focus') {\n this.destroy();\n }\n }\n\n @HostListener('mouseenter')\n public onMouseEnter(): void {\n if (this.tooltipEvent === 'hover' || this.focusedInputRef) {\n this.debounceCreateTooltipFunction();\n }\n }\n\n @HostListener('mouseleave')\n @HostListener('wheel')\n public onMouseLeave(): void {\n if ((this.tooltipEvent === 'hover' || this.focusedInputRef) && !this.tooltipCreatedByFocus) {\n this.destroy();\n }\n }\n\n @HostListener('touchstart')\n public onTouchStart(): void {\n if (this.tooltipEvent === 'hover') {\n window.clearTimeout(this.touchTimeout);\n const _delay = this.mobileBehavior === 'pressing' ? this.showDelay : 0;\n this.touchTimeout = window.setTimeout(() => {\n this._createTooltip(true, true);\n }, _delay);\n }\n }\n\n @HostListener('touchend')\n public onTouchEnd(): void {\n if (this.tooltipEvent === 'hover') {\n if (this.mobileBehavior === 'pressing') {\n window.clearTimeout(this.touchTimeout);\n this.destroy();\n }\n }\n }\n\n private validatePosition() {\n const containsPosition = ['top', 'right', 'bottom', 'left'].includes(this.tooltipPosition);\n\n if (!containsPosition) {\n this.tooltipPosition = 'top';\n throw new Error(`Tooltip ${this.tooltipPosition} position is unexpected`);\n }\n }\n\n private getDomElement(): HTMLElement {\n this.componentRef = this.viewContainerRef.createComponent(TooltipComponent);\n return this.componentRef.location.nativeElement;\n }\n\n private _createTooltip(useShowDelay = false, autoDestroy = true) {\n const hasText = (this.tooltip || '').length > 0;\n const hasComponentRef = this.componentRef !== null;\n if (!hasText || hasComponentRef) {\n return;\n }\n const blockIfIsNotTruncatedContent = this.checkTruncatedText() ? !this.contentIsTruncated : false;\n if (blockIfIsNotTruncatedContent) {\n return;\n }\n const domElement = this.getDomElement();\n document.body.appendChild(domElement);\n this.tooltipDivElement = domElement.querySelector('.tooltip');\n this.setTooltipComponentProperties();\n const _showDelay = useShowDelay ? this.showDelay : 0;\n setTimeout(() => {\n this.showTooltip();\n }, _showDelay);\n\n this.renderer.listen(window, 'scroll', () => {\n this.setTooltipPositionProperty();\n });\n\n if (autoDestroy && this.displayTime) {\n setTimeout(() => {\n this.destroy();\n }, this.displayTime);\n }\n }\n\n private showTooltip() {\n if (this.componentRef) {\n this.componentRef.instance.visible = this.visible;\n\n this.setTooltipPositionProperty();\n }\n }\n\n private setTooltipPositionProperty() {\n if (!this.componentRef) {\n return;\n }\n const anchorSize = 5;\n const { left, right } = this.elementRef.nativeElement.getBoundingClientRect();\n\n const tooltipElementPosition = getElementPositionInfo(this.tooltipDivElement!);\n const elementLeftover = getElementLeftoverContentAvailable(this.elementRef.nativeElement);\n const elementTriggerPosition = getElementPositionInfo(this.elementRef.nativeElement);\n const horizontalPositions: TooltipPositions[] = ['left', 'right'];\n const isPositionHorizontal = horizontalPositions.includes(this.tooltipPosition);\n const distanceToBorders = isPositionHorizontal\n ? tooltipElementPosition.elementWidth\n : tooltipElementPosition.elementHorizontalCenter;\n const canSetAtTop = elementLeftover.freeDistanceToTop > tooltipElementPosition.elementHeight;\n const canSetAtLeft = elementLeftover.freeDistanceToLeft > distanceToBorders;\n const canSetAtRight = elementLeftover.freeDistanceToRight > distanceToBorders;\n const canSetAtBottom = elementLeftover.freeDistanceToBottom > tooltipElementPosition.elementHeight;\n const topVertical = elementTriggerPosition.top + elementTriggerPosition.elementVerticalCenter;\n const checkTopPosition = () => {\n return canSetAtTop && canSetAtLeft && canSetAtRight;\n };\n const checkBottomPosition = () => {\n return canSetAtBottom && canSetAtLeft && canSetAtRight;\n };\n const checkLeftPosition = () => {\n return canSetAtLeft && canSetAtTop && canSetAtBottom;\n };\n\n const checkRightPosition = () => {\n return canSetAtRight && canSetAtTop && canSetAtBottom;\n };\n\n const setTopPosition = (): { left: number; top: number } => {\n return {\n left: left + (right - left) / 2,\n top: elementTriggerPosition.top - anchorSize,\n };\n };\n\n const setBottomPosition = (): { left: number; top: number } => {\n return {\n left: left + (right - left) / 2,\n top: elementTriggerPosition.top + elementTriggerPosition.elementHeight,\n };\n };\n\n const setLeftPosition = (): { left: number; top: number } => {\n return {\n left: left,\n top: topVertical,\n };\n };\n\n const setRightPosition = (): { left: number; top: number } => {\n return {\n left: right,\n top: topVertical,\n };\n };\n\n type Position = {\n pos: TooltipPositions;\n check: () => boolean;\n set: () => { left: number; top: number };\n };\n\n const positions: Position[] = [\n {\n pos: 'top',\n check: checkTopPosition,\n set: setTopPosition,\n },\n {\n pos: 'bottom',\n check: checkBottomPosition,\n set: setBottomPosition,\n },\n {\n pos: 'left',\n check: checkLeftPosition,\n set: setLeftPosition,\n },\n {\n pos: 'right',\n check: checkRightPosition,\n set: setRightPosition,\n },\n ];\n\n const positionDefined = positions.find((position) => position.pos === this.tooltipPosition);\n let validPosition: Position | undefined = positionDefined;\n const canUseDefinedPosition = positionDefined?.check();\n if (canUseDefinedPosition) {\n validPosition = positionDefined;\n } else if (!canUseDefinedPosition) {\n const validAlternativePosition = positions.find((position) => position.check());\n if (validAlternativePosition) {\n validPosition = validAlternativePosition;\n }\n }\n const _position = validPosition!.set();\n const positionLeft = _position.left;\n const positionTop = _position.top;\n this.componentRef.instance.left = Math.round(positionLeft);\n this.componentRef.instance.top = Math.round(positionTop);\n this.componentRef.instance.position = validPosition!.pos;\n }\n\n private setTooltipComponentProperties() {\n if (!this.componentRef) return;\n\n this.componentRef.instance.tooltip = this.tooltip as string;\n this.componentRef.instance.escape = this.escape;\n }\n\n private destroy(): void {\n if (!isNullOrUndefined(this.componentRef)) {\n window.clearTimeout(this.showTimeout);\n this.appRef.detachView(this.componentRef.hostView);\n this.componentRef.destroy();\n this.componentRef = null;\n this.tooltipDivElement = null;\n }\n }\n\n private get contentIsTruncated() {\n const element = this.elementRef.nativeElement as HTMLElement;\n const truncatedByVertical = element.scrollHeight > element.clientHeight;\n const truncatedByHorizontal = element.scrollWidth > element.clientWidth;\n return truncatedByHorizontal || truncatedByVertical;\n }\n}\n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { TooltipComponent } from './tooltip.component';\nimport { TooltipDirective } from './tooltip.directive';\n\n@NgModule({\n imports: [CommonModule, TooltipDirective],\n declarations: [TooltipComponent],\n exports: [TooltipDirective],\n})\nexport class TooltipModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
@@ -66,6 +66,7 @@ export declare class FileUploadComponent implements OnInit, OnDestroy, AfterCont
66
66
  onCancelUpload(index: number): void;
67
67
  onDowloadFile(index: number): void;
68
68
  get files(): FileDto[];
69
+ formatFileSize(size: number): string;
69
70
  private update;
70
71
  private isFileLimitExceeded;
71
72
  private isFileCombinedSizeExceeded;
@@ -5,8 +5,9 @@ import * as i3 from "@seniorsistemas/angular-components/button";
5
5
  import * as i4 from "primeng/tooltip";
6
6
  import * as i5 from "primeng/progressbar";
7
7
  import * as i6 from "@ngx-translate/core";
8
+ import * as i7 from "@seniorsistemas/angular-components/locale";
8
9
  export declare class FileUploadModule {
9
10
  static ɵfac: i0.ɵɵFactoryDeclaration<FileUploadModule, never>;
10
- static ɵmod: i0.ɵɵNgModuleDeclaration<FileUploadModule, [typeof i1.FileUploadComponent], [typeof i2.CommonModule, typeof i3.ButtonModule, typeof i4.TooltipModule, typeof i5.ProgressBarModule, typeof i6.TranslateModule], [typeof i1.FileUploadComponent]>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<FileUploadModule, [typeof i1.FileUploadComponent], [typeof i2.CommonModule, typeof i3.ButtonModule, typeof i4.TooltipModule, typeof i5.ProgressBarModule, typeof i6.TranslateModule, typeof i7.LocaleModule], [typeof i1.FileUploadComponent]>;
11
12
  static ɵinj: i0.ɵɵInjectorDeclaration<FileUploadModule>;
12
13
  }
@@ -1,7 +1,9 @@
1
- import { HttpClient } from "@angular/common/http";
2
- import { Observable } from "rxjs";
3
- import { CookieService } from "ngx-cookie-service";
4
- import { LocaleOptions } from "./options/index";
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { Observable } from 'rxjs';
3
+ import { CookieService } from 'ngx-cookie-service';
4
+ import { LocaleOptions } from './options/index';
5
+ import 'moment/locale/es';
6
+ import 'moment/locale/pt-br';
5
7
  import * as i0 from "@angular/core";
6
8
  export declare class LocaleService {
7
9
  private readonly http;
@@ -10,6 +12,7 @@ export declare class LocaleService {
10
12
  private localeOptions?;
11
13
  private readonly localeOptionsAddress;
12
14
  private readonly localeOptionsVersion;
15
+ private readonly VALID_MOMENT_LANGUAGES;
13
16
  constructor(http: HttpClient, cookieService: CookieService);
14
17
  get(): Observable<LocaleOptions>;
15
18
  getLocale(): Observable<string>;
@@ -19,6 +22,13 @@ export declare class LocaleService {
19
22
  */
20
23
  getLocaleOptions(): LocaleOptions | undefined;
21
24
  private getUserData;
25
+ /**
26
+ * Set valid locale for moment js locale based on user current locale.
27
+ * Sometimes the locale from user not exists in locale of moment, for example, is valid user with language 'es-CO' but for the momentjs the locale 'es-CO' not exist, so with this function will be applied the 'es' locale.
28
+ * @param userLocale
29
+ * @returns valid locale based in user locale.
30
+ */
31
+ private parseUserLocaleToMoment;
22
32
  private getLocaleConfig;
23
33
  getGroupingSeparator(): string | undefined;
24
34
  getDecimalSeparator(): string | undefined;
@@ -1,14 +1,15 @@
1
- import { CalendarLocaleOptions } from "./calendar";
2
- import { NumberLocaleOptions } from "./number";
1
+ import { CalendarLocaleOptions } from './calendar';
2
+ import { NumberLocaleOptions } from './number';
3
3
  export interface ILocaleOptions {
4
+ locale?: string;
4
5
  calendar?: CalendarLocaleOptions;
5
6
  number?: NumberLocaleOptions;
6
7
  }
7
8
  export declare class LocaleOptions implements ILocaleOptions {
8
- locale?: string;
9
+ locale?: string | undefined;
9
10
  calendar: CalendarLocaleOptions;
10
11
  number: NumberLocaleOptions;
11
12
  constructor(config?: ILocaleOptions);
12
13
  }
13
- export * from "./calendar";
14
- export * from "./number";
14
+ export * from './calendar';
15
+ export * from './number';
@@ -1,5 +1,5 @@
1
- import { PipeTransform } from "@angular/core";
2
- import { LocaleService } from "../locale.service";
1
+ import { PipeTransform } from '@angular/core';
2
+ import { LocaleService } from '../locale.service';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class LocalizedTimePipe implements PipeTransform {
5
5
  private localeService;
@@ -0,0 +1,367 @@
1
+ # Numeric Mask Directive
2
+
3
+ Diretiva Angular para formatação de valores numéricos com suporte completo a internacionalização e validação. Funciona com moedas, números decimais, notação científica e muito mais.
4
+
5
+ ## Recursos
6
+
7
+ - ✅ Suporte completo a internacionalização (todos os locales)
8
+ - ✅ Formatação automática com separadores de milhar e decimal
9
+ - ✅ Validação integrada com Angular Forms
10
+ - ✅ Suporte a valores negativos
11
+ - ✅ Controle de casas decimais configurável (mínimas e máximas)
12
+ - ✅ Truncamento inteligente de decimais (nunca arredonda)
13
+ - ✅ Precisão arbitrária com BigNumber
14
+ - ✅ Suporte a notação científica com expoentes negativos
15
+ - ✅ Tratamento inteligente de colagem
16
+ - ✅ Teclado numérico em dispositivos móveis
17
+ - ✅ Acessibilidade (ARIA)
18
+ - ✅ Standalone component compatível
19
+
20
+ ## Instalação
21
+
22
+ ```bash
23
+ npm install @seniorsistemas/angular-components
24
+ ```
25
+
26
+ ## Uso Básico
27
+
28
+ ### Standalone Components (Recomendado)
29
+
30
+ ```typescript
31
+ import { Component } from '@angular/core';
32
+ import { FormsModule } from '@angular/forms';
33
+ import { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';
34
+
35
+ @Component({
36
+ selector: 'app-example',
37
+ standalone: true,
38
+ imports: [FormsModule, NumericMaskDirective],
39
+ template: `
40
+ <input
41
+ type="text"
42
+ sNumericMask
43
+ [locale]="'pt-BR'"
44
+ [minDecimalPlaces]="2"
45
+ [maxDecimalPlaces]="2"
46
+ [(ngModel)]="value"
47
+ />
48
+ `
49
+ })
50
+ export class ExampleComponent {
51
+ value: string | null = null;
52
+ }
53
+ ```
54
+
55
+ ## API
56
+
57
+ ### Inputs
58
+
59
+ | Input | Tipo | Padrão | Descrição |
60
+ |-------|------|--------|-----------|
61
+ | `locale` | `string \| undefined` | `undefined` | Locale para formatação (ex: 'pt-BR', 'en-US', 'de-DE', 'fr-FR'). Se não fornecido, usa automaticamente o locale do `LocaleService` |
62
+ | `minDecimalPlaces` | `number` | `0` | Quantidade mínima de casas decimais a exibir. Na formatação (blur), ajusta o valor para ter no mínimo esse número de casas decimais |
63
+ | `maxDecimalPlaces` | `number` | `10` | Quantidade máxima de casas decimais permitidas. Na formatação (blur), limita a exibição a esse número de casas decimais |
64
+ | `allowNegative` | `boolean` | `false` | Permite valores negativos. Use `+` e `-` para alternar o sinal |
65
+ | `allowScientificNotation` | `boolean` | `true` | Habilita suporte a notação científica (ex: `1e-6`). Quando `false`, bloqueia digitação e colagem de valores com `e`/`E` |
66
+ | `textAlign` | `'left' \| 'right'` | `'right'` | Alinhamento do texto dentro do input |
67
+ | `min` | `number \| undefined` | `undefined` | Valor mínimo permitido. Quando definido, adiciona validação nativa |
68
+ | `max` | `number \| undefined` | `undefined` | Valor máximo permitido. Quando definido, adiciona validação nativa |
69
+
70
+ ## Comportamento
71
+
72
+ ### Truncamento de Decimais
73
+
74
+ Ao contrário de outras máscaras numéricas que **arredondam**, a `numeric-mask` **trunca** valores que excedem `maxDecimalPlaces`. Isso é crucial para precisão em valores financeiros e científicos.
75
+
76
+ Exemplo com `maxDecimalPlaces="2"`:
77
+ - Valor digitado: `1,999`
78
+ - Valor no modelo: `1.999` (sem truncamento)
79
+ - Valor exibido (blur): `1,99` (truncado, não arredondado para `2,00`)
80
+ - Valor ao receber foco: `1,999` (mostra completo)
81
+
82
+ ### Bloqueio de Caracteres Inválidos
83
+
84
+ A diretiva bloqueia automaticamente a digitação de caracteres que não sejam:
85
+ - Dígitos (0-9)
86
+ - Separador decimal (`,` ou `.` conforme o locale)
87
+ - Caracteres de controle (Tab, Backspace, Delete, etc.)
88
+ - Teclas de seta
89
+ - Ctrl/Cmd/Alt
90
+
91
+ Para **valores negativos**, você pode:
92
+ - Pressionar `-` no início do valor para ativar/desativar o sinal negativo
93
+ - Pressionar `+` para remover o sinal negativo
94
+
95
+ ### Focus
96
+
97
+ Quando o input recebe foco:
98
+ - Remove a formatação (separadores de milhar)
99
+ - Exibe o valor com o separador decimal do locale
100
+ - Auto-seleciona todo o valor para fácil substituição
101
+ - Mostra o valor **completo** do modelo (sem truncamento)
102
+
103
+ Exemplo:
104
+ - Valor formatado: `1.234,56`
105
+ - No focus: `1234,56` (apenas separador decimal, valor completo)
106
+
107
+ ### Modelo vs Formatação
108
+
109
+ A diretiva separa claramente o valor armazenado do valor exibido:
110
+
111
+ | Situação | Modelo | Display |
112
+ |----------|--------|---------|
113
+ | Digitando | `1.999` | `1,999` |
114
+ | Após blur | `1.999` | `1,99` (truncado) |
115
+ | Com foco | `1.999` | `1,999` (completo) |
116
+ | Notação científica | `0.000000000000000000001` | `0,00000000000000000000` (truncado) |
117
+
118
+ **Garantia:** O modelo **sempre** armazena o valor completo, sem truncamento. As propriedades `minDecimalPlaces` e `maxDecimalPlaces` afetam **apenas** a formatação visual.
119
+
120
+ ### Blur
121
+
122
+ Quando o input perde foco:
123
+ - Reaplica a formatação completa com separadores de milhar
124
+ - Valida o valor conforme as regras configuradas
125
+
126
+ ### Colagem (Paste)
127
+
128
+ - Processa automaticamente valores copiados
129
+ - Converte notação científica (ex: `1e-6`) em decimal
130
+ - Normaliza separadores para o locale configurado
131
+
132
+ ## Exemplos
133
+
134
+ ### Exemplo Básico
135
+
136
+ ```typescript
137
+ @Component({
138
+ selector: 'app-basic',
139
+ standalone: true,
140
+ imports: [FormsModule, NumericMaskDirective],
141
+ template: `
142
+ <input
143
+ sNumericMask
144
+ [locale]="'pt-BR'"
145
+ [minDecimalPlaces]="2"
146
+ [maxDecimalPlaces]="2"
147
+ [(ngModel)]="value"
148
+ />
149
+ <p>Valor: {{ value }}</p>
150
+ `
151
+ })
152
+ export class BasicComponent {
153
+ value: string | null = null;
154
+ }
155
+ ```
156
+
157
+ ### Exemplo com Valores Negativos
158
+
159
+ ```typescript
160
+ @Component({
161
+ selector: 'app-negative',
162
+ standalone: true,
163
+ imports: [FormsModule, NumericMaskDirective],
164
+ template: `
165
+ <input
166
+ sNumericMask
167
+ [allowNegative]="true"
168
+ [locale]="'pt-BR'"
169
+ [minDecimalPlaces]="2"
170
+ [maxDecimalPlaces]="2"
171
+ [(ngModel)]="value"
172
+ />
173
+ <p>Pressione - para alternar o sinal</p>
174
+ `
175
+ })
176
+ export class NegativeComponent {
177
+ value: string | null = null;
178
+ }
179
+ ```
180
+
181
+ ### Exemplo com Notação Científica
182
+
183
+ ```typescript
184
+ @Component({
185
+ selector: 'app-scientific',
186
+ standalone: true,
187
+ imports: [FormsModule, NumericMaskDirective],
188
+ template: `
189
+ <input
190
+ sNumericMask
191
+ [allowScientificNotation]="true"
192
+ [minDecimalPlaces]="0"
193
+ [maxDecimalPlaces]="15"
194
+ [(ngModel)]="value"
195
+ placeholder="Ex: 1e-6, 1.5e-10"
196
+ />
197
+ <p>Valor: {{ value }}</p>
198
+ `
199
+ })
200
+ export class ScientificComponent {
201
+ value: string | null = null;
202
+ }
203
+ ```
204
+
205
+ ### Exemplo sem Notação Científica
206
+
207
+ ```typescript
208
+ @Component({
209
+ selector: 'app-no-scientific',
210
+ standalone: true,
211
+ imports: [FormsModule, NumericMaskDirective],
212
+ template: `
213
+ <input
214
+ sNumericMask
215
+ [allowScientificNotation]="false"
216
+ [locale]="'pt-BR'"
217
+ [minDecimalPlaces]="2"
218
+ [maxDecimalPlaces]="2"
219
+ [(ngModel)]="value"
220
+ />
221
+ `
222
+ })
223
+ export class NoScientificComponent {
224
+ value: string | null = null;
225
+ }
226
+ ```
227
+
228
+ ### Exemplo com Validação Min/Max
229
+
230
+ ```typescript
231
+ @Component({
232
+ selector: 'app-min-max',
233
+ standalone: true,
234
+ imports: [FormsModule, NumericMaskDirective],
235
+ template: `
236
+ <input
237
+ sNumericMask
238
+ [minDecimalPlaces]="2"
239
+ [maxDecimalPlaces]="2"
240
+ [min]="0"
241
+ [max]="1000"
242
+ [(ngModel)]="price"
243
+ #priceInput="ngModel"
244
+ />
245
+
246
+ @if (priceInput.errors?.['min']) {
247
+ <span class="error">
248
+ Valor mínimo: {{ priceInput.errors?.['min'].min }}
249
+ </span>
250
+ }
251
+
252
+ @if (priceInput.errors?.['max']) {
253
+ <span class="error">
254
+ Valor máximo: {{ priceInput.errors?.['max'].max }}
255
+ </span>
256
+ }
257
+ `
258
+ })
259
+ export class MinMaxComponent {
260
+ price: string | null = null;
261
+ }
262
+ ```
263
+
264
+ ### Exemplo com Alta Precisão
265
+
266
+ ```typescript
267
+ @Component({
268
+ selector: 'app-high-precision',
269
+ standalone: true,
270
+ imports: [FormsModule, NumericMaskDirective],
271
+ template: `
272
+ <input
273
+ sNumericMask
274
+ [locale]="'pt-BR'"
275
+ [minDecimalPlaces]="0"
276
+ [maxDecimalPlaces]="8"
277
+ [(ngModel)]="cryptoValue"
278
+ />
279
+ <p>Valor da criptomoeda: {{ cryptoValue }}</p>
280
+ `
281
+ })
282
+ export class HighPrecisionComponent {
283
+ cryptoValue: string | null = null;
284
+ }
285
+ ```
286
+
287
+ ## Integração com LocaleService
288
+
289
+ A diretiva se integra automaticamente com o `LocaleService` do `@seniorsistemas/angular-components/locale`. Quando o input `locale` não é fornecido, a diretiva:
290
+
291
+ 1. Injeta opcionalmente o `LocaleService`
292
+ 2. Chama `localeService.get()` para carregar as configurações de locale
293
+ 3. Usa `getLocaleOptions()?.locale` para obter o locale do usuário
294
+ 4. Usa 'pt-BR' como fallback se o serviço não estiver disponível
295
+
296
+ ### Com LocaleService
297
+
298
+ ```typescript
299
+ import { Component } from '@angular/core';
300
+ import { FormsModule } from '@angular/forms';
301
+ import { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';
302
+ import { LocaleModule } from '@seniorsistemas/angular-components/locale';
303
+
304
+ @Component({
305
+ selector: 'app-with-locale-service',
306
+ standalone: true,
307
+ imports: [FormsModule, NumericMaskDirective, LocaleModule],
308
+ template: `
309
+ <!-- Locale automático do usuário -->
310
+ <input sNumericMask [minDecimalPlaces]="2"
311
+ [maxDecimalPlaces]="2" [(ngModel)]="value" />
312
+ `
313
+ })
314
+ export class WithLocaleServiceComponent {
315
+ value: string | null = null;
316
+ }
317
+ ```
318
+
319
+ ### Sem LocaleService (Locale Explícito)
320
+
321
+ ```typescript
322
+ @Component({
323
+ selector: 'app-explicit-locale',
324
+ standalone: true,
325
+ imports: [FormsModule, NumericMaskDirective],
326
+ template: `
327
+ <!-- Locale explícito, não usa LocaleService -->
328
+ <input sNumericMask [locale]="'en-US'" [minDecimalPlaces]="2"
329
+ [maxDecimalPlaces]="2" [(ngModel)]="value" />
330
+ `
331
+ })
332
+ export class ExplicitLocaleComponent {
333
+ value: string | null = null;
334
+ }
335
+ ```
336
+
337
+ ## Acessibilidade
338
+
339
+ A diretiva configura automaticamente:
340
+
341
+ - `inputmode="decimal"` - Teclado numérico em dispositivos móveis
342
+ - `autocomplete="off"` - Desabilita autocomplete
343
+
344
+ Para melhor acessibilidade, adicione manualmente:
345
+
346
+ ```html
347
+ <label for="price">Preço (até 2 casas decimais)</label>
348
+ <input
349
+ id="price"
350
+ type="text"
351
+ sNumericMask
352
+ [locale]="'pt-BR'"
353
+ [minDecimalPlaces]="2"
354
+ [maxDecimalPlaces]="2"
355
+ [(ngModel)]="price"
356
+ aria-label="Digite um número com até 2 casas decimais"
357
+ />
358
+ ```
359
+
360
+ ## Compatibilidade
361
+
362
+ - Angular 18+
363
+ - Todos os navegadores modernos com suporte a `Intl.NumberFormat`
364
+
365
+ ## Licença
366
+
367
+ MIT
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@seniorsistemas/angular-components/numeric-mask" />
5
+ export * from './public-api';