@star-ng/ui 0.0.0-stage → 0.1.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -2
  3. package/fesm2022/star-ng-ui-accordion.mjs +376 -0
  4. package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/star-ng-ui-autocomplete.mjs +782 -0
  6. package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
  7. package/fesm2022/star-ng-ui-avatar.mjs +154 -0
  8. package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
  9. package/fesm2022/star-ng-ui-badge.mjs +153 -0
  10. package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
  11. package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
  12. package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
  13. package/fesm2022/star-ng-ui-button.mjs +282 -0
  14. package/fesm2022/star-ng-ui-button.mjs.map +1 -0
  15. package/fesm2022/star-ng-ui-card.mjs +112 -0
  16. package/fesm2022/star-ng-ui-card.mjs.map +1 -0
  17. package/fesm2022/star-ng-ui-chart.mjs +1904 -0
  18. package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
  19. package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
  20. package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
  21. package/fesm2022/star-ng-ui-core.mjs +392 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1556 -0
  24. package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
  25. package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
  26. package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
  27. package/fesm2022/star-ng-ui-dialog.mjs +948 -0
  28. package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/star-ng-ui-drawer.mjs +158 -0
  30. package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
  31. package/fesm2022/star-ng-ui-editor.mjs +416 -0
  32. package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
  33. package/fesm2022/star-ng-ui-field.mjs +378 -0
  34. package/fesm2022/star-ng-ui-field.mjs.map +1 -0
  35. package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
  36. package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
  37. package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
  38. package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
  39. package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
  40. package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
  41. package/fesm2022/star-ng-ui-input-group.mjs +188 -0
  42. package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
  43. package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
  44. package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
  45. package/fesm2022/star-ng-ui-input-number.mjs +691 -0
  46. package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
  47. package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
  48. package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
  49. package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
  50. package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
  51. package/fesm2022/star-ng-ui-knob.mjs +514 -0
  52. package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
  53. package/fesm2022/star-ng-ui-layout.mjs +608 -0
  54. package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
  55. package/fesm2022/star-ng-ui-listbox.mjs +978 -0
  56. package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
  57. package/fesm2022/star-ng-ui-media.mjs +833 -0
  58. package/fesm2022/star-ng-ui-media.mjs.map +1 -0
  59. package/fesm2022/star-ng-ui-menu.mjs +1840 -0
  60. package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
  61. package/fesm2022/star-ng-ui-message.mjs +191 -0
  62. package/fesm2022/star-ng-ui-message.mjs.map +1 -0
  63. package/fesm2022/star-ng-ui-paginator.mjs +387 -0
  64. package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
  65. package/fesm2022/star-ng-ui-panel.mjs +324 -0
  66. package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
  67. package/fesm2022/star-ng-ui-password.mjs +517 -0
  68. package/fesm2022/star-ng-ui-password.mjs.map +1 -0
  69. package/fesm2022/star-ng-ui-popover.mjs +241 -0
  70. package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
  71. package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
  72. package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
  73. package/fesm2022/star-ng-ui-radio.mjs +411 -0
  74. package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
  75. package/fesm2022/star-ng-ui-rating.mjs +211 -0
  76. package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
  77. package/fesm2022/star-ng-ui-select-button.mjs +613 -0
  78. package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
  79. package/fesm2022/star-ng-ui-select.mjs +2523 -0
  80. package/fesm2022/star-ng-ui-select.mjs.map +1 -0
  81. package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
  82. package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
  83. package/fesm2022/star-ng-ui-slider.mjs +552 -0
  84. package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
  85. package/fesm2022/star-ng-ui-spinner.mjs +148 -0
  86. package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
  87. package/fesm2022/star-ng-ui-stepper.mjs +360 -0
  88. package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
  89. package/fesm2022/star-ng-ui-table.mjs +3477 -0
  90. package/fesm2022/star-ng-ui-table.mjs.map +1 -0
  91. package/fesm2022/star-ng-ui-tabs.mjs +464 -0
  92. package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
  93. package/fesm2022/star-ng-ui-tag.mjs +129 -0
  94. package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
  95. package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
  96. package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
  97. package/fesm2022/star-ng-ui-theme.mjs +98 -0
  98. package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
  99. package/fesm2022/star-ng-ui-toast.mjs +298 -0
  100. package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
  101. package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
  102. package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
  103. package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
  104. package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
  105. package/fesm2022/star-ng-ui-transloco.mjs +40 -0
  106. package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
  107. package/fesm2022/star-ng-ui-tree.mjs +1446 -0
  108. package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
  109. package/fesm2022/star-ng-ui-utility.mjs +2134 -0
  110. package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
  111. package/fesm2022/star-ng-ui.mjs +51 -0
  112. package/package.json +281 -3
  113. package/styles/_base.scss +70 -0
  114. package/styles/_shared.scss +2 -0
  115. package/styles/_tokens.scss +190 -0
  116. package/styles/controls/_accordion.scss +75 -0
  117. package/styles/controls/_autocomplete.scss +44 -0
  118. package/styles/controls/_avatar.scss +39 -0
  119. package/styles/controls/_breadcrumb.scss +45 -0
  120. package/styles/controls/_button.scss +137 -0
  121. package/styles/controls/_card.scss +38 -0
  122. package/styles/controls/_chart.scss +214 -0
  123. package/styles/controls/_chip.scss +51 -0
  124. package/styles/controls/_choice.scss +153 -0
  125. package/styles/controls/_data-display.scss +118 -0
  126. package/styles/controls/_date-picker.scss +300 -0
  127. package/styles/controls/_dialog.scss +123 -0
  128. package/styles/controls/_drawer.scss +118 -0
  129. package/styles/controls/_editor.scss +74 -0
  130. package/styles/controls/_field.scss +92 -0
  131. package/styles/controls/_file-upload.scss +136 -0
  132. package/styles/controls/_input-group.scss +104 -0
  133. package/styles/controls/_input-mask.scss +46 -0
  134. package/styles/controls/_input-number.scss +125 -0
  135. package/styles/controls/_knob.scss +76 -0
  136. package/styles/controls/_layout.scss +182 -0
  137. package/styles/controls/_listbox.scss +38 -0
  138. package/styles/controls/_media.scss +222 -0
  139. package/styles/controls/_menu.scss +254 -0
  140. package/styles/controls/_message.scss +48 -0
  141. package/styles/controls/_org-chart.scss +128 -0
  142. package/styles/controls/_paginator.scss +59 -0
  143. package/styles/controls/_panel.scss +83 -0
  144. package/styles/controls/_popover.scss +40 -0
  145. package/styles/controls/_progress-bar.scss +74 -0
  146. package/styles/controls/_select-button.scss +61 -0
  147. package/styles/controls/_select.scss +216 -0
  148. package/styles/controls/_skeleton.scss +43 -0
  149. package/styles/controls/_slider.scss +163 -0
  150. package/styles/controls/_spinner.scss +34 -0
  151. package/styles/controls/_stepper.scss +109 -0
  152. package/styles/controls/_table.scss +523 -0
  153. package/styles/controls/_tabs.scss +93 -0
  154. package/styles/controls/_tag.scss +84 -0
  155. package/styles/controls/_toast.scss +141 -0
  156. package/styles/controls/_tooltip.scss +14 -0
  157. package/styles/controls/_tree.scss +113 -0
  158. package/styles/controls/_utility.scss +654 -0
  159. package/styles/star-ng.css +5803 -0
  160. package/styles/star-ng.min.css +1 -0
  161. package/styles/star-ng.scss +50 -0
  162. package/theme/star-theme-first-paint.js +1 -0
  163. package/types/star-ng-ui-accordion.d.ts +82 -0
  164. package/types/star-ng-ui-autocomplete.d.ts +171 -0
  165. package/types/star-ng-ui-avatar.d.ts +43 -0
  166. package/types/star-ng-ui-badge.d.ts +46 -0
  167. package/types/star-ng-ui-breadcrumb.d.ts +39 -0
  168. package/types/star-ng-ui-button.d.ts +79 -0
  169. package/types/star-ng-ui-card.d.ts +29 -0
  170. package/types/star-ng-ui-chart.d.ts +337 -0
  171. package/types/star-ng-ui-checkbox.d.ts +92 -0
  172. package/types/star-ng-ui-core.d.ts +310 -0
  173. package/types/star-ng-ui-data-display.d.ts +339 -0
  174. package/types/star-ng-ui-date-picker.d.ts +701 -0
  175. package/types/star-ng-ui-dialog.d.ts +254 -0
  176. package/types/star-ng-ui-drawer.d.ts +29 -0
  177. package/types/star-ng-ui-editor.d.ts +96 -0
  178. package/types/star-ng-ui-field.d.ts +146 -0
  179. package/types/star-ng-ui-file-upload.d.ts +192 -0
  180. package/types/star-ng-ui-i18n-de.d.ts +7 -0
  181. package/types/star-ng-ui-i18n-es.d.ts +7 -0
  182. package/types/star-ng-ui-input-group.d.ts +58 -0
  183. package/types/star-ng-ui-input-mask.d.ts +126 -0
  184. package/types/star-ng-ui-input-number.d.ts +193 -0
  185. package/types/star-ng-ui-input-otp.d.ts +86 -0
  186. package/types/star-ng-ui-input-tags.d.ts +159 -0
  187. package/types/star-ng-ui-knob.d.ts +121 -0
  188. package/types/star-ng-ui-layout.d.ts +154 -0
  189. package/types/star-ng-ui-listbox.d.ts +197 -0
  190. package/types/star-ng-ui-media.d.ts +161 -0
  191. package/types/star-ng-ui-menu.d.ts +332 -0
  192. package/types/star-ng-ui-message.d.ts +52 -0
  193. package/types/star-ng-ui-paginator.d.ts +85 -0
  194. package/types/star-ng-ui-panel.d.ts +65 -0
  195. package/types/star-ng-ui-password.d.ts +129 -0
  196. package/types/star-ng-ui-popover.d.ts +57 -0
  197. package/types/star-ng-ui-progress-bar.d.ts +49 -0
  198. package/types/star-ng-ui-radio.d.ts +116 -0
  199. package/types/star-ng-ui-rating.d.ts +52 -0
  200. package/types/star-ng-ui-select-button.d.ts +169 -0
  201. package/types/star-ng-ui-select.d.ts +540 -0
  202. package/types/star-ng-ui-skeleton.d.ts +47 -0
  203. package/types/star-ng-ui-slider.d.ts +145 -0
  204. package/types/star-ng-ui-spinner.d.ts +29 -0
  205. package/types/star-ng-ui-stepper.d.ts +89 -0
  206. package/types/star-ng-ui-table.d.ts +829 -0
  207. package/types/star-ng-ui-tabs.d.ts +109 -0
  208. package/types/star-ng-ui-tag.d.ts +35 -0
  209. package/types/star-ng-ui-theme-switch.d.ts +36 -0
  210. package/types/star-ng-ui-theme.d.ts +95 -0
  211. package/types/star-ng-ui-toast.d.ts +84 -0
  212. package/types/star-ng-ui-toggle-switch.d.ts +81 -0
  213. package/types/star-ng-ui-tooltip.d.ts +66 -0
  214. package/types/star-ng-ui-transloco.d.ts +14 -0
  215. package/types/star-ng-ui-tree.d.ts +310 -0
  216. package/types/star-ng-ui-utility.d.ts +533 -0
  217. package/types/star-ng-ui.d.ts +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-input-number.mjs","names":[],"sources":["../../../projects/star-ng/input-number/input-number.ts"],"sourcesContent":["import { _IdGenerator } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\nimport { StarField } from '@star-ng/ui/field';\n\n/**\n * Number field (PrimeNG `p-inputnumber`): locale formatting with `Intl.NumberFormat`\n * (decimal, currency, percent, units), min / max clamping, step buttons, Arrow keys and\n * PageUp / PageDown, `role=\"spinbutton\"`. While focused the field shows plain editable digits;\n * on blur it shows the formatted number.\n *\n * `<star-input-number [formField]=\"form.quantity\" [min]=\"0\" [max]=\"500\" unit=\"kilogram\" showButtons />`\n */\n@Component({\n selector: 'star-input-number',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-number',\n '[class.star-number--disabled]': 'disabled()',\n '[class.star-number--invalid]': 'showInvalid()',\n '[class.star-number--buttons]': 'showButtons()',\n },\n template: `\n <div class=\"star-number__control\">\n @if (showButtons()) {\n <button\n type=\"button\"\n class=\"star-number__btn\"\n tabindex=\"-1\"\n [attr.aria-label]=\"uiText.decrease\"\n [disabled]=\"!canStep(-1)\"\n (click)=\"stepBy(-1)\"\n >\n <i class=\"ph-bold ph-minus\" aria-hidden=\"true\"></i>\n </button>\n }\n <input\n #input\n type=\"text\"\n class=\"star-number__input\"\n role=\"spinbutton\"\n autocomplete=\"off\"\n [attr.inputmode]=\"maxFractionDigits() === 0 ? 'numeric' : 'decimal'\"\n [id]=\"inputId()\"\n [attr.name]=\"name() || null\"\n [value]=\"text()\"\n [attr.placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuetext]=\"formatted()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-describedby]=\"field?.describedBy() ?? null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n (focus)=\"onFocus()\"\n (input)=\"text.set(input.value)\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n @if (showButtons()) {\n <button\n type=\"button\"\n class=\"star-number__btn\"\n tabindex=\"-1\"\n [attr.aria-label]=\"uiText.increase\"\n [disabled]=\"!canStep(1)\"\n (click)=\"stepBy(1)\"\n >\n <i class=\"ph-bold ph-plus\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n `,\n})\nexport class StarInputNumber implements FormValueControl<number | null> {\n protected readonly uiText = inject(STAR_UI_TEXT);\n protected readonly field = inject(StarField, { optional: true });\n /** Invalid after touch, or while the parent `star-field` shows an error. */\n protected readonly showInvalid = computed(\n () => (this.invalid() && this.touched()) || !!this.field?.errorText(),\n );\n\n constructor() {\n this.field?.linkControl(this.inputId);\n }\n\n readonly value = model<number | null>(null);\n readonly mode = input<'decimal' | 'currency' | 'percent' | 'unit'>('decimal');\n /** ISO 4217 code for `mode=\"currency\"`, for example `EUR`. */\n readonly currency = input('USD');\n /**\n * ECMA-402 sanctioned unit for `mode=\"unit\"`, for example `kilogram`, `milliliter`, `day`.\n * An unsupported unit (such as `milligram`) is shown as a plain suffix instead of failing.\n */\n readonly unit = input('');\n /** Text before the number, for example `~ `. */\n readonly prefix = input('');\n /** Text after the number, for example ` kg`. */\n readonly suffix = input('');\n readonly locale = input<string | undefined>(undefined);\n /** Default: the Intl default for the mode (0 for decimal, 2 for most currencies). */\n readonly minFractionDigits = input<number | undefined>(undefined);\n /** Default: the Intl default for the mode (3 for decimal, 2 for most currencies). */\n readonly maxFractionDigits = input<number | undefined>(undefined);\n readonly useGrouping = input(true, { transform: booleanAttribute });\n readonly step = input(1);\n readonly min = input<number | undefined>(undefined);\n readonly max = input<number | undefined>(undefined);\n readonly showButtons = input(false, { transform: booleanAttribute });\n readonly placeholder = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n readonly inputId = input(inject(_IdGenerator).getId('star-number-'));\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly name = input('');\n readonly touch = output<void>();\n\n private readonly input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly focused = signal(false);\n\n /** Unit text appended when Intl does not support `unit`. */\n private readonly fallbackUnit = signal('');\n\n private readonly formatter = computed(() => {\n const mode = this.mode();\n const options: Intl.NumberFormatOptions = {\n style: mode,\n currency: mode === 'currency' ? this.currency() : undefined,\n unit: mode === 'unit' ? this.unit() : undefined,\n minimumFractionDigits: this.minFractionDigits(),\n maximumFractionDigits: this.maxFractionDigits(),\n useGrouping: this.useGrouping(),\n };\n try {\n const format = new Intl.NumberFormat(this.locale(), options);\n untracked(() => this.fallbackUnit.set(''));\n return format;\n } catch (error) {\n if (mode !== 'unit') throw error;\n untracked(() => this.fallbackUnit.set(this.unit() ? ' ' + this.unit() : ''));\n return new Intl.NumberFormat(this.locale(), {\n ...options,\n style: 'decimal',\n unit: undefined,\n });\n }\n });\n\n /** Decimal separator of the locale (`.` or `,`). */\n private readonly decimal = computed(\n () =>\n new Intl.NumberFormat(this.locale())\n .formatToParts(1.1)\n .find((part) => part.type === 'decimal')?.value ?? '.',\n );\n\n protected readonly formatted = computed(() => {\n const value = this.value();\n if (value === null) return '';\n const number = this.formatter().format(this.mode() === 'percent' ? value / 100 : value);\n return this.prefix() + number + this.fallbackUnit() + this.suffix();\n });\n\n /** Plain digits while editing, formatted text otherwise. */\n protected readonly text = linkedSignal(() =>\n this.focused() ? this.plain(this.value()) : this.formatted(),\n );\n\n private plain(value: number | null): string {\n if (value === null) return '';\n return String(value).replace('.', this.decimal());\n }\n\n /** Reads typed text with either separator; ignores grouping, currency and unit symbols. */\n parse(text: string): number | null | undefined {\n const decimal = this.decimal();\n const cleaned = text\n .replace(new RegExp(`[^0-9${decimal === ',' ? ',' : '.'}-]`, 'g'), '')\n .replace(decimal, '.');\n if (!cleaned || cleaned === '-') return null;\n const number = Number(cleaned);\n return Number.isFinite(number) ? number : undefined;\n }\n\n private clamp(value: number): number {\n const min = this.min();\n const max = this.max();\n const digits = this.formatter().resolvedOptions().maximumFractionDigits ?? 2;\n // Percent mode stores 42 for 42 %, so keep the same digits as displayed.\n let result = Number(\n value.toFixed(this.mode() === 'percent' ? Math.max(0, digits - 2) : digits),\n );\n if (min !== undefined) result = Math.max(min, result);\n if (max !== undefined) result = Math.min(max, result);\n return result;\n }\n\n protected onFocus(): void {\n this.focused.set(true);\n }\n\n protected onBlur(): void {\n this.commit();\n this.focused.set(false);\n // The [value] binding may not change if the formatted text equals the last render.\n this.input().nativeElement.value = this.formatted();\n this.touch.emit();\n }\n\n private commit(): void {\n const parsed = this.parse(this.text());\n if (parsed === undefined) return;\n this.value.set(parsed === null ? null : this.clamp(parsed));\n }\n\n protected canStep(direction: 1 | -1): boolean {\n if (this.disabled() || this.readonly()) return false;\n const value = this.value();\n if (value === null) return true;\n const limit = direction === 1 ? this.max() : this.min();\n return limit === undefined || (direction === 1 ? value < limit : value > limit);\n }\n\n stepBy(direction: number): void {\n if (this.disabled() || this.readonly()) return;\n if (this.focused()) this.commit();\n const start = this.value() ?? this.min() ?? 0;\n const next = this.clamp(start + direction * this.step());\n this.value.set(next);\n this.input().nativeElement.value = this.focused() ? this.plain(next) : this.formatted();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const steps: Record<string, number> = { ArrowUp: 1, ArrowDown: -1, PageUp: 10, PageDown: -10 };\n if (event.key in steps) {\n event.preventDefault();\n this.stepBy(steps[event.key]);\n } else if (event.key === 'Home' && this.min() !== undefined) {\n event.preventDefault();\n this.value.set(this.min() ?? null);\n } else if (event.key === 'End' && this.max() !== undefined) {\n event.preventDefault();\n this.value.set(this.max() ?? null);\n } else if (event.key === 'Enter') {\n this.commit();\n }\n }\n\n focus(options?: FocusOptions): void {\n this.input().nativeElement.focus(options);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,343 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model, output, viewChildren } from "@angular/core";
3
+ import { STAR_UI_TEXT, starInlineKey } from "@star-ng/ui/core";
4
+ var StarInputOtp = class StarInputOtp {
5
+ text = inject(STAR_UI_TEXT);
6
+ value = model("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
7
+ length = input(6, ...ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []);
8
+ integerOnly = input(false, {
9
+ ...ngDevMode ? { debugName: "integerOnly" } : /* istanbul ignore next */ {},
10
+ transform: booleanAttribute
11
+ });
12
+ mask = input(false, {
13
+ ...ngDevMode ? { debugName: "mask" } : /* istanbul ignore next */ {},
14
+ transform: booleanAttribute
15
+ });
16
+ ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
17
+ disabled = input(false, {
18
+ ...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
19
+ transform: booleanAttribute
20
+ });
21
+ readonly = input(false, {
22
+ ...ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {},
23
+ transform: booleanAttribute
24
+ });
25
+ invalid = input(false, {
26
+ ...ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {},
27
+ transform: booleanAttribute
28
+ });
29
+ touched = input(false, {
30
+ ...ngDevMode ? { debugName: "touched" } : /* istanbul ignore next */ {},
31
+ transform: booleanAttribute
32
+ });
33
+ touch = output();
34
+ completed = output();
35
+ boxes = viewChildren("box", ...ngDevMode ? [{ debugName: "boxes" }] : /* istanbul ignore next */ []);
36
+ slots = computed(() => Array.from({ length: this.length() }, (_, i) => i), ...ngDevMode ? [{ debugName: "slots" }] : /* istanbul ignore next */ []);
37
+ chars = computed(() => [...this.value()], ...ngDevMode ? [{ debugName: "chars" }] : /* istanbul ignore next */ []);
38
+ allowed(char) {
39
+ return this.integerOnly() ? /\d/.test(char) : /[\p{L}\d]/u.test(char);
40
+ }
41
+ setChar(index, char) {
42
+ const chars = Array.from({ length: this.length() }, (_, i) => this.chars()[i] ?? "");
43
+ chars[index] = char;
44
+ const end = chars.indexOf("");
45
+ const value = (end < 0 ? chars : chars.slice(0, Math.max(end, index + (char ? 1 : 0)))).join("");
46
+ this.value.set(value);
47
+ if (value.length === this.length() && !value.includes(" ")) this.completed.emit(value);
48
+ }
49
+ focusBox(index) {
50
+ this.boxes()[Math.min(Math.max(index, 0), this.length() - 1)]?.nativeElement.focus();
51
+ }
52
+ onInput(event, index) {
53
+ const box = event.target;
54
+ const char = box.value.slice(-1);
55
+ if (char && !this.allowed(char)) {
56
+ box.value = this.chars()[index] ?? "";
57
+ return;
58
+ }
59
+ this.setChar(index, char);
60
+ if (char) this.focusBox(index + 1);
61
+ }
62
+ onKeydown(event, index) {
63
+ const box = event.target;
64
+ if (event.key === "Backspace" && !box.value) {
65
+ event.preventDefault();
66
+ this.setChar(index - 1, "");
67
+ this.focusBox(index - 1);
68
+ } else if (starInlineKey(event) === "ArrowLeft") {
69
+ event.preventDefault();
70
+ this.focusBox(index - 1);
71
+ } else if (starInlineKey(event) === "ArrowRight") {
72
+ event.preventDefault();
73
+ this.focusBox(index + 1);
74
+ }
75
+ }
76
+ onPaste(event, index) {
77
+ const chars = [...(event.clipboardData?.getData("text") ?? "").replace(/\s/g, "")].filter((c) => this.allowed(c));
78
+ if (!chars.length) return;
79
+ event.preventDefault();
80
+ const value = [...[...this.value()].slice(0, index), ...chars].slice(0, this.length()).join("");
81
+ this.value.set(value);
82
+ this.focusBox(value.length);
83
+ if (value.length === this.length()) this.completed.emit(value);
84
+ }
85
+ focus() {
86
+ this.focusBox(Math.min(this.value().length, this.length() - 1));
87
+ }
88
+ static ɵfac = i0.ɵɵngDeclareFactory({
89
+ minVersion: "12.0.0",
90
+ version: "22.2.6",
91
+ ngImport: i0,
92
+ type: StarInputOtp,
93
+ deps: [],
94
+ target: i0.ɵɵFactoryTarget.Component
95
+ });
96
+ static ɵcmp = i0.ɵɵngDeclareComponent({
97
+ minVersion: "17.0.0",
98
+ version: "22.2.6",
99
+ type: StarInputOtp,
100
+ isStandalone: true,
101
+ selector: "star-input-otp",
102
+ inputs: {
103
+ value: {
104
+ classPropertyName: "value",
105
+ publicName: "value",
106
+ isSignal: true,
107
+ isRequired: false,
108
+ transformFunction: null
109
+ },
110
+ length: {
111
+ classPropertyName: "length",
112
+ publicName: "length",
113
+ isSignal: true,
114
+ isRequired: false,
115
+ transformFunction: null
116
+ },
117
+ integerOnly: {
118
+ classPropertyName: "integerOnly",
119
+ publicName: "integerOnly",
120
+ isSignal: true,
121
+ isRequired: false,
122
+ transformFunction: null
123
+ },
124
+ mask: {
125
+ classPropertyName: "mask",
126
+ publicName: "mask",
127
+ isSignal: true,
128
+ isRequired: false,
129
+ transformFunction: null
130
+ },
131
+ ariaLabel: {
132
+ classPropertyName: "ariaLabel",
133
+ publicName: "ariaLabel",
134
+ isSignal: true,
135
+ isRequired: false,
136
+ transformFunction: null
137
+ },
138
+ disabled: {
139
+ classPropertyName: "disabled",
140
+ publicName: "disabled",
141
+ isSignal: true,
142
+ isRequired: false,
143
+ transformFunction: null
144
+ },
145
+ readonly: {
146
+ classPropertyName: "readonly",
147
+ publicName: "readonly",
148
+ isSignal: true,
149
+ isRequired: false,
150
+ transformFunction: null
151
+ },
152
+ invalid: {
153
+ classPropertyName: "invalid",
154
+ publicName: "invalid",
155
+ isSignal: true,
156
+ isRequired: false,
157
+ transformFunction: null
158
+ },
159
+ touched: {
160
+ classPropertyName: "touched",
161
+ publicName: "touched",
162
+ isSignal: true,
163
+ isRequired: false,
164
+ transformFunction: null
165
+ }
166
+ },
167
+ outputs: {
168
+ value: "valueChange",
169
+ touch: "touch",
170
+ completed: "completed"
171
+ },
172
+ host: {
173
+ attributes: { "role": "group" },
174
+ properties: {
175
+ "attr.aria-label": "ariaLabel() ?? text.otpLabel",
176
+ "class.star-otp--invalid": "invalid() && touched()"
177
+ },
178
+ classAttribute: "star-otp"
179
+ },
180
+ viewQueries: [{
181
+ propertyName: "boxes",
182
+ predicate: ["box"],
183
+ descendants: true,
184
+ isSignal: true
185
+ }],
186
+ ngImport: i0,
187
+ template: `
188
+ @for (slot of slots(); track slot) {
189
+ <input
190
+ #box
191
+ class="star-otp__box"
192
+ maxlength="1"
193
+ [type]="mask() ? 'password' : 'text'"
194
+ [attr.inputmode]="integerOnly() ? 'numeric' : 'text'"
195
+ [attr.autocomplete]="slot === 0 ? 'one-time-code' : 'off'"
196
+ [attr.aria-label]="text.otpCharacter(slot + 1, length())"
197
+ [value]="chars()[slot] ?? ''"
198
+ [disabled]="disabled()"
199
+ [readOnly]="readonly()"
200
+ (input)="onInput($event, slot)"
201
+ (keydown)="onKeydown($event, slot)"
202
+ (paste)="onPaste($event, slot)"
203
+ (focus)="box.select()"
204
+ (blur)="slot === length() - 1 && touch.emit()"
205
+ />
206
+ }
207
+ `,
208
+ isInline: true,
209
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
210
+ });
211
+ };
212
+ i0.ɵɵngDeclareClassMetadata({
213
+ minVersion: "12.0.0",
214
+ version: "22.2.6",
215
+ ngImport: i0,
216
+ type: StarInputOtp,
217
+ decorators: [{
218
+ type: Component,
219
+ args: [{
220
+ selector: "star-input-otp",
221
+ changeDetection: ChangeDetectionStrategy.OnPush,
222
+ host: {
223
+ class: "star-otp",
224
+ role: "group",
225
+ "[attr.aria-label]": "ariaLabel() ?? text.otpLabel",
226
+ "[class.star-otp--invalid]": "invalid() && touched()"
227
+ },
228
+ template: `
229
+ @for (slot of slots(); track slot) {
230
+ <input
231
+ #box
232
+ class="star-otp__box"
233
+ maxlength="1"
234
+ [type]="mask() ? 'password' : 'text'"
235
+ [attr.inputmode]="integerOnly() ? 'numeric' : 'text'"
236
+ [attr.autocomplete]="slot === 0 ? 'one-time-code' : 'off'"
237
+ [attr.aria-label]="text.otpCharacter(slot + 1, length())"
238
+ [value]="chars()[slot] ?? ''"
239
+ [disabled]="disabled()"
240
+ [readOnly]="readonly()"
241
+ (input)="onInput($event, slot)"
242
+ (keydown)="onKeydown($event, slot)"
243
+ (paste)="onPaste($event, slot)"
244
+ (focus)="box.select()"
245
+ (blur)="slot === length() - 1 && touch.emit()"
246
+ />
247
+ }
248
+ `
249
+ }]
250
+ }],
251
+ propDecorators: {
252
+ value: [{
253
+ type: i0.Input,
254
+ args: [{
255
+ isSignal: true,
256
+ alias: "value",
257
+ required: false
258
+ }]
259
+ }, {
260
+ type: i0.Output,
261
+ args: ["valueChange"]
262
+ }],
263
+ length: [{
264
+ type: i0.Input,
265
+ args: [{
266
+ isSignal: true,
267
+ alias: "length",
268
+ required: false
269
+ }]
270
+ }],
271
+ integerOnly: [{
272
+ type: i0.Input,
273
+ args: [{
274
+ isSignal: true,
275
+ alias: "integerOnly",
276
+ required: false
277
+ }]
278
+ }],
279
+ mask: [{
280
+ type: i0.Input,
281
+ args: [{
282
+ isSignal: true,
283
+ alias: "mask",
284
+ required: false
285
+ }]
286
+ }],
287
+ ariaLabel: [{
288
+ type: i0.Input,
289
+ args: [{
290
+ isSignal: true,
291
+ alias: "ariaLabel",
292
+ required: false
293
+ }]
294
+ }],
295
+ disabled: [{
296
+ type: i0.Input,
297
+ args: [{
298
+ isSignal: true,
299
+ alias: "disabled",
300
+ required: false
301
+ }]
302
+ }],
303
+ readonly: [{
304
+ type: i0.Input,
305
+ args: [{
306
+ isSignal: true,
307
+ alias: "readonly",
308
+ required: false
309
+ }]
310
+ }],
311
+ invalid: [{
312
+ type: i0.Input,
313
+ args: [{
314
+ isSignal: true,
315
+ alias: "invalid",
316
+ required: false
317
+ }]
318
+ }],
319
+ touched: [{
320
+ type: i0.Input,
321
+ args: [{
322
+ isSignal: true,
323
+ alias: "touched",
324
+ required: false
325
+ }]
326
+ }],
327
+ touch: [{
328
+ type: i0.Output,
329
+ args: ["touch"]
330
+ }],
331
+ completed: [{
332
+ type: i0.Output,
333
+ args: ["completed"]
334
+ }],
335
+ boxes: [{
336
+ type: i0.ViewChildren,
337
+ args: ["box", { isSignal: true }]
338
+ }]
339
+ }
340
+ });
341
+ export { StarInputOtp };
342
+
343
+ //# sourceMappingURL=star-ng-ui-input-otp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-input-otp.mjs","names":[],"sources":["../../../projects/star-ng/input-otp/input-otp.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n output,\n viewChildren,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { STAR_UI_TEXT, starInlineKey } from '@star-ng/ui/core';\n\n/**\n * One-time code field (PrimeNG `p-inputotp`): one box per character, auto-advance, Backspace\n * goes back, Arrow keys move, pasting a full code fills every box, `autocomplete=\"one-time-code\"`\n * on the first box so phones offer SMS codes.\n *\n * `<star-input-otp [length]=\"6\" integerOnly [formField]=\"form.code\" (completed)=\"verify($event)\" />`\n */\n@Component({\n selector: 'star-input-otp',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-otp',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel() ?? text.otpLabel',\n '[class.star-otp--invalid]': 'invalid() && touched()',\n },\n template: `\n @for (slot of slots(); track slot) {\n <input\n #box\n class=\"star-otp__box\"\n maxlength=\"1\"\n [type]=\"mask() ? 'password' : 'text'\"\n [attr.inputmode]=\"integerOnly() ? 'numeric' : 'text'\"\n [attr.autocomplete]=\"slot === 0 ? 'one-time-code' : 'off'\"\n [attr.aria-label]=\"text.otpCharacter(slot + 1, length())\"\n [value]=\"chars()[slot] ?? ''\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n (input)=\"onInput($event, slot)\"\n (keydown)=\"onKeydown($event, slot)\"\n (paste)=\"onPaste($event, slot)\"\n (focus)=\"box.select()\"\n (blur)=\"slot === length() - 1 && touch.emit()\"\n />\n }\n `,\n})\nexport class StarInputOtp implements FormValueControl<string> {\n protected readonly text = inject(STAR_UI_TEXT);\n readonly value = model('');\n readonly length = input(6);\n readonly integerOnly = input(false, { transform: booleanAttribute });\n /** Hides characters like a password. */\n readonly mask = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n readonly completed = output<string>();\n\n private readonly boxes = viewChildren<ElementRef<HTMLInputElement>>('box');\n protected readonly slots = computed(() => Array.from({ length: this.length() }, (_, i) => i));\n protected readonly chars = computed(() => [...this.value()]);\n\n private allowed(char: string): boolean {\n return this.integerOnly() ? /\\d/.test(char) : /[\\p{L}\\d]/u.test(char);\n }\n\n private setChar(index: number, char: string): void {\n const chars = Array.from({ length: this.length() }, (_, i) => this.chars()[i] ?? '');\n chars[index] = char;\n // Keep characters packed to the left; an empty slot ends the value.\n const end = chars.indexOf('');\n const value = (end < 0 ? chars : chars.slice(0, Math.max(end, index + (char ? 1 : 0)))).join(\n '',\n );\n this.value.set(value);\n if (value.length === this.length() && !value.includes(' ')) this.completed.emit(value);\n }\n\n private focusBox(index: number): void {\n this.boxes()[Math.min(Math.max(index, 0), this.length() - 1)]?.nativeElement.focus();\n }\n\n protected onInput(event: Event, index: number): void {\n const box = event.target as HTMLInputElement;\n const char = box.value.slice(-1);\n if (char && !this.allowed(char)) {\n box.value = this.chars()[index] ?? '';\n return;\n }\n this.setChar(index, char);\n if (char) this.focusBox(index + 1);\n }\n\n protected onKeydown(event: KeyboardEvent, index: number): void {\n const box = event.target as HTMLInputElement;\n if (event.key === 'Backspace' && !box.value) {\n event.preventDefault();\n this.setChar(index - 1, '');\n this.focusBox(index - 1);\n } else if (starInlineKey(event) === 'ArrowLeft') {\n event.preventDefault();\n this.focusBox(index - 1);\n } else if (starInlineKey(event) === 'ArrowRight') {\n event.preventDefault();\n this.focusBox(index + 1);\n }\n }\n\n protected onPaste(event: ClipboardEvent, index: number): void {\n const text = (event.clipboardData?.getData('text') ?? '').replace(/\\s/g, '');\n const chars = [...text].filter((c) => this.allowed(c));\n if (!chars.length) return;\n event.preventDefault();\n const current = [...this.value()].slice(0, index);\n const value = [...current, ...chars].slice(0, this.length()).join('');\n this.value.set(value);\n this.focusBox(value.length);\n if (value.length === this.length()) this.completed.emit(value);\n }\n\n focus(): void {\n this.focusBox(Math.min(this.value().length, this.length() - 1));\n }\n}\n"],"mappings":"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"}