@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-utility.mjs","names":[],"sources":["../../../projects/star-ng/utility/extras.ts","../../../projects/star-ng/utility/terminal.ts","../../../projects/star-ng/utility/utility.ts"],"sourcesContent":["import { _IdGenerator, CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\n\n/** Read view of `star-inplace`: `<ng-template starInplaceDisplay>…</ng-template>`. */\n@Directive({ selector: 'ng-template[starInplaceDisplay]' })\nexport class StarInplaceDisplay {\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/** Edit view of `star-inplace`: `<ng-template starInplaceContent>…</ng-template>`. */\n@Directive({ selector: 'ng-template[starInplaceContent]' })\nexport class StarInplaceContent {\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * Inplace (PrimeNG `p-inplace`): shows a value as a button; a click replaces it with the\n * edit content in the same place. Escape or the close button goes back to the value.\n *\n * ```html\n * <star-inplace ariaLabel=\"Edit requester\" closable>\n * <ng-template starInplaceDisplay>{{ name() }}</ng-template>\n * <ng-template starInplaceContent><input starInput [(value)]=\"name\" /></ng-template>\n * </star-inplace>\n * ```\n */\n@Component({\n selector: 'star-inplace',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-inplace', '(keydown.escape)': 'onEscape($event)' },\n template: `\n @if (active()) {\n <span class=\"star-inplace__content\">\n @if (content(); as edit) {\n <ng-container *ngTemplateOutlet=\"edit.template\" />\n }\n @if (closable()) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.close\"\n (click)=\"deactivate()\"\n >\n <i class=\"ph-bold ph-check\" aria-hidden=\"true\"></i>\n </button>\n }\n </span>\n } @else {\n <button\n type=\"button\"\n class=\"star-inplace__display\"\n [disabled]=\"disabled()\"\n (click)=\"activate()\"\n >\n <!-- The label is part of the name, so the visible value is too (WCAG 2.5.3). -->\n @if (ariaLabel(); as label) {\n <span class=\"star-sr-only\">{{ label }}: </span>\n }\n @if (display(); as view) {\n <ng-container *ngTemplateOutlet=\"view.template\" />\n }\n <i class=\"ph-bold ph-pencil-simple star-inplace__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n `,\n})\nexport class StarInplace {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n /** The edit content shows. Two-way. */\n readonly active = model(false);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Adds a button that goes back to the value. */\n readonly closable = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly display = contentChild(StarInplaceDisplay);\n protected readonly content = contentChild(StarInplaceContent);\n\n activate(): void {\n if (this.disabled() || this.active()) return;\n this.active.set(true);\n this.focusAfterRender('input, select, textarea, [tabindex]:not([tabindex=\"-1\"]), button');\n }\n\n deactivate(): void {\n if (!this.active()) return;\n this.active.set(false);\n this.focusAfterRender('.star-inplace__display');\n }\n\n protected onEscape(event: Event): void {\n if (!this.active()) return;\n event.stopPropagation();\n this.deactivate();\n }\n\n private focusAfterRender(selector: string): void {\n afterNextRender(() => this.host.nativeElement.querySelector<HTMLElement>(selector)?.focus(), {\n injector: this.injector,\n });\n }\n}\n\n/**\n * Scroll panel (PrimeNG `p-scrollpanel`): a region with a fixed height and a thin scrollbar\n * in the StarNG colors. It can take keyboard focus, so a keyboard user can scroll it; give\n * it a name with `ariaLabel`.\n *\n * `<star-scroll-panel height=\"12rem\" ariaLabel=\"Case narrative\">…</star-scroll-panel>`\n */\n@Component({\n selector: 'star-scroll-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-scroll-panel',\n role: 'region',\n tabindex: '0',\n '[style.height]': 'height()',\n '[style.max-height]': 'maxHeight()',\n '[attr.aria-label]': 'ariaLabel()',\n },\n template: `<ng-content />`,\n})\nexport class StarScrollPanel {\n readonly height = input<string | null>(null);\n readonly maxHeight = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n}\n\n/**\n * Keeps Tab and Shift+Tab inside an element (PrimeNG `pFocusTrap`), on the CDK focus trap.\n * `star-dialog` and `star-drawer` already trap focus; use this for a custom overlay.\n *\n * `<div [starFocusTrap]=\"open()\" autoCapture>…</div>`\n */\n@Directive({\n selector: '[starFocusTrap]',\n hostDirectives: [\n {\n directive: CdkTrapFocus,\n inputs: ['cdkTrapFocus: starFocusTrap', 'cdkTrapFocusAutoCapture: autoCapture'],\n },\n ],\n})\nexport class StarFocusTrap {}\n\n/**\n * Floating label (PrimeNG `p-floatlabel`): the label sits inside the input and moves above\n * it when the input has focus or a value. Wrap one text input, textarea or `star-select`.\n *\n * `<star-float-label label=\"Reporter name\"><input starInput [(value)]=\"name\" /></star-float-label>`\n *\n * The control gets an empty placeholder when it has none (the CSS needs one).\n *\n * The label is a real `<label>` around the control, so a click focuses the control and a\n * screen reader reads the label.\n */\n@Component({\n selector: 'star-float-label',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-float' },\n template: `\n <!-- The control is projected into the label, so the label wraps it at run time. -->\n <!-- eslint-disable-next-line @angular-eslint/template/label-has-associated-control -->\n <label class=\"star-float__wrap\">\n <ng-content />\n <span class=\"star-float__label\">{{ label() }}</span>\n </label>\n `,\n})\nexport class StarFloatLabel {\n readonly label = input.required<string>();\n\n constructor() {\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n // The CSS reads `:placeholder-shown`, which needs a placeholder. Give the control an\n // empty one when it has none, so the page does not have to.\n afterNextRender(() => {\n const control = host.querySelector<HTMLInputElement | HTMLTextAreaElement>('input, textarea');\n if (control && !control.getAttribute('placeholder')) control.setAttribute('placeholder', ' ');\n });\n }\n}\n\n/**\n * Ripple (PrimeNG `pRipple`): a short ink circle from the point of a press. Decoration only;\n * it does nothing when the user asks for reduced motion.\n *\n * `<button class=\"star-btn star-btn--secondary\" starRipple>Save</button>`\n */\n@Directive({\n selector: '[starRipple]',\n host: { class: 'star-ripple', '(pointerdown)': 'show($event)' },\n})\nexport class StarRipple {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n protected show(event: PointerEvent): void {\n const view = this.host.ownerDocument.defaultView;\n if (view?.matchMedia?.('(prefers-reduced-motion: reduce)').matches) return;\n const box = this.host.getBoundingClientRect();\n const size = Math.max(box.width, box.height) * 2;\n const ink = this.host.ownerDocument.createElement('span');\n ink.className = 'star-ripple__ink';\n ink.setAttribute('aria-hidden', 'true');\n ink.style.width = ink.style.height = `${size}px`;\n ink.style.left = `${event.clientX - box.left - size / 2}px`;\n ink.style.top = `${event.clientY - box.top - size / 2}px`;\n ink.addEventListener('animationend', () => ink.remove());\n this.host.append(ink);\n }\n}\n\n/**\n * Animate on scroll (PrimeNG `pAnimateOnScroll`): the element fades and moves in the first\n * time it comes into view. Content is visible at once when the user asks for reduced motion\n * or the browser has no `IntersectionObserver`.\n *\n * `<star-card starAnimateOnScroll>…</star-card>`\n */\n@Directive({\n selector: '[starAnimateOnScroll]',\n host: { class: 'star-reveal', '[class.star-reveal--in]': 'shown()' },\n})\nexport class StarAnimateOnScroll {\n /** Part of the element that must be in view, 0 to 1. */\n readonly threshold = input(0.15);\n protected readonly shown = signal(false);\n\n constructor() {\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const destroy = inject(DestroyRef);\n afterNextRender(() => {\n if (typeof IntersectionObserver === 'undefined') {\n this.shown.set(true);\n return;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n this.shown.set(true);\n observer.disconnect();\n }\n },\n { threshold: this.threshold() },\n );\n observer.observe(host);\n destroy.onDestroy(() => observer.disconnect());\n });\n }\n}\n\n/**\n * Image compare (PrimeNG `p-imagecompare`): two images on top of each other with a divider\n * that the user moves. The divider is a native range input, so arrow keys, Home and End work.\n *\n * `<star-image-compare leftSrc=\"before.png\" rightSrc=\"after.png\" leftAlt=\"Before\" rightAlt=\"After\" />`\n */\n@Component({\n selector: 'star-image-compare',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-compare', '[style.--star-compare.%]': 'value()' },\n template: `\n <img class=\"star-compare__image\" [src]=\"rightSrc()\" [alt]=\"rightAlt()\" />\n <img\n class=\"star-compare__image star-compare__image--left\"\n [src]=\"leftSrc()\"\n [alt]=\"leftAlt()\"\n />\n <span class=\"star-compare__divider\" aria-hidden=\"true\">\n <i class=\"ph-bold ph-arrows-horizontal\"></i>\n </span>\n <input\n type=\"range\"\n class=\"star-compare__range\"\n min=\"0\"\n max=\"100\"\n step=\"1\"\n [id]=\"rangeId\"\n [value]=\"value()\"\n [attr.aria-label]=\"ariaLabel() ?? text.compareImages\"\n [attr.aria-valuetext]=\"value() + '%'\"\n (input)=\"value.set($any($event.target).valueAsNumber)\"\n />\n `,\n})\nexport class StarImageCompare {\n protected readonly text = inject(STAR_UI_TEXT);\n protected readonly rangeId = inject(_IdGenerator).getId('star-compare-');\n\n readonly leftSrc = input.required<string>();\n readonly rightSrc = input.required<string>();\n readonly leftAlt = input('');\n readonly rightAlt = input('');\n readonly ariaLabel = input<string | null>(null);\n /** Divider position: percent of the width that shows the left image. Two-way. */\n readonly value = model(50);\n}\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n Injector,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\n\nexport interface StarTerminalEntry {\n readonly command: string;\n /** Text printed under the command; `null` while the handler runs. */\n readonly response: string | null;\n readonly error?: boolean;\n}\n\n/** Runs a command and returns the text to print. A thrown error prints its message in red. */\nexport type StarTerminalHandler = (command: string) => string | Promise<string>;\n\n/**\n * Terminal (PrimeNG `p-terminal`): a text command line. The user types a command, the\n * `handler` returns the text to print. Up / Down recall earlier commands. The output is a\n * live log, so a screen reader announces each response.\n *\n * `<star-terminal ariaLabel=\"Diagnostics\" prompt=\"mi $\" [handler]=\"run\" welcome=\"Type help.\" />`\n *\n * The control does not run anything itself and prints the response as plain text.\n */\n@Component({\n selector: 'star-terminal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-terminal', '(click)': 'focus()' },\n template: `\n <div\n #log\n class=\"star-terminal__log\"\n role=\"log\"\n aria-live=\"polite\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n @if (welcome()) {\n <p class=\"star-terminal__welcome\">{{ welcome() }}</p>\n }\n @for (entry of entries(); track $index) {\n <p class=\"star-terminal__command\">\n <span class=\"star-terminal__prompt\" aria-hidden=\"true\">{{ prompt() }}</span>\n {{ entry.command }}\n </p>\n @if (entry.response !== null) {\n <pre\n class=\"star-terminal__response\"\n [class.star-terminal__response--error]=\"entry.error\"\n >{{ entry.response }}</pre>\n }\n }\n </div>\n <div class=\"star-terminal__line\">\n <label class=\"star-terminal__prompt\" [for]=\"inputId\">{{ prompt() }}</label>\n <input\n #input\n type=\"text\"\n class=\"star-terminal__input\"\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [id]=\"inputId\"\n [attr.aria-label]=\"text.terminalCommand\"\n [disabled]=\"busy()\"\n (keydown)=\"onKeydown($event, input)\"\n />\n </div>\n `,\n})\nexport class StarTerminal {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly injector = inject(Injector);\n protected readonly inputId = inject(_IdGenerator).getId('star-terminal-');\n\n readonly prompt = input('$');\n readonly welcome = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n /** Runs a command. Without a handler the terminal only emits `commandRun`. */\n readonly handler = input<StarTerminalHandler | null>(null);\n readonly commandRun = output<string>();\n\n protected readonly entries = signal<readonly StarTerminalEntry[]>([]);\n protected readonly busy = signal(false);\n private readonly input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly log = viewChild.required<ElementRef<HTMLElement>>('log');\n /** Position in the command history while the user presses Up / Down (-1 = new line). */\n private recall = -1;\n\n focus(): void {\n // A click that ends a text selection must not move focus away from the selection.\n if (this.input().nativeElement.ownerDocument.getSelection()?.toString()) return;\n this.input().nativeElement.focus();\n }\n\n /** Removes all printed lines. */\n clear(): void {\n this.entries.set([]);\n }\n\n /** Prints a command and its response, as if the user typed it. */\n async run(command: string): Promise<void> {\n const text = command.trim();\n if (!text || this.busy()) return;\n this.recall = -1;\n this.commandRun.emit(text);\n const handler = this.handler();\n const index = this.entries().length;\n this.entries.update((entries) => [\n ...entries,\n { command: text, response: handler ? null : '' },\n ]);\n if (handler) {\n this.busy.set(true);\n let response: string;\n let error = false;\n try {\n response = await handler(text);\n } catch (cause) {\n error = true;\n response = cause instanceof Error ? cause.message : String(cause);\n }\n this.entries.update((entries) =>\n entries.map((entry, i) => (i === index ? { ...entry, response, error } : entry)),\n );\n this.busy.set(false);\n }\n afterNextRender(\n () => {\n const log = this.log().nativeElement;\n log.scrollTop = log.scrollHeight;\n this.input().nativeElement.focus();\n },\n { injector: this.injector },\n );\n }\n\n protected onKeydown(event: KeyboardEvent, input: HTMLInputElement): void {\n if (event.key === 'Enter') {\n const value = input.value;\n input.value = '';\n void this.run(value);\n return;\n }\n if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return;\n const history = this.entries().map((entry) => entry.command);\n if (!history.length) return;\n event.preventDefault();\n if (event.key === 'ArrowUp') {\n this.recall = this.recall < 0 ? history.length - 1 : Math.max(0, this.recall - 1);\n } else {\n this.recall = this.recall < 0 || this.recall >= history.length - 1 ? -1 : this.recall + 1;\n }\n input.value = this.recall < 0 ? '' : history[this.recall];\n }\n}\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { STAR_UI_TEXT, starIsRtl } from '@star-ng/ui/core';\nimport { StarMenuItem } from '@star-ng/ui/menu';\nimport { StarSpinner } from '@star-ng/ui/spinner';\n\n// ---------------------------------------------------------------- Splitter\n\n/**\n * Splitter (PrimeNG `p-splitter`): two panes with a draggable gutter. The gutter is a\n * `role=\"separator\"` with `aria-valuenow`; Arrow keys resize by 2 %, Home / End by the limits.\n * In right-to-left the first pane is on the right: Arrow left makes it larger (the gutter moves\n * left), Arrow right makes it smaller, and a drag measures from the right edge.\n *\n * ```html\n * <star-splitter [(size)]=\"split\" ariaLabel=\"Resize panes\">\n * <div starSplitterStart>…</div>\n * <div starSplitterEnd>…</div>\n * </star-splitter>\n * ```\n */\n@Component({\n selector: 'star-splitter',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': \"'star-splitter star-splitter--' + layout()\",\n '[style.--star-split]': \"size() + '%'\",\n },\n template: `\n <div class=\"star-splitter__pane\"><ng-content select=\"[starSplitterStart]\" /></div>\n <div\n class=\"star-splitter__gutter\"\n role=\"separator\"\n tabindex=\"0\"\n [attr.aria-orientation]=\"layout() === 'horizontal' ? 'vertical' : 'horizontal'\"\n [attr.aria-valuenow]=\"size()\"\n [attr.aria-valuemin]=\"minSize()\"\n [attr.aria-valuemax]=\"100 - minSize()\"\n [attr.aria-label]=\"ariaLabel() ?? text.resizePanes\"\n (pointerdown)=\"startDrag($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n <span class=\"star-splitter__handle\" aria-hidden=\"true\"></span>\n </div>\n <div class=\"star-splitter__pane\"><ng-content select=\"[starSplitterEnd]\" /></div>\n `,\n})\nexport class StarSplitter {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly layout = input<'horizontal' | 'vertical'>('horizontal');\n /** Size of the first pane in percent. */\n readonly size = model(50);\n readonly minSize = input(15);\n readonly ariaLabel = input<string | null>(null);\n\n private clamp(value: number): number {\n return Math.round(Math.min(100 - this.minSize(), Math.max(this.minSize(), value)) * 10) / 10;\n }\n\n protected startDrag(event: PointerEvent): void {\n const gutter = event.currentTarget as HTMLElement;\n gutter.setPointerCapture?.(event.pointerId);\n const box = this.host.nativeElement.getBoundingClientRect();\n const rtl = starIsRtl(this.host.nativeElement);\n const move = (e: PointerEvent) => {\n const ratio =\n this.layout() === 'horizontal'\n ? (rtl ? box.right - e.clientX : e.clientX - box.left) / box.width\n : (e.clientY - box.top) / box.height;\n this.size.set(this.clamp(ratio * 100));\n };\n const stop = () => {\n gutter.removeEventListener('pointermove', move);\n gutter.removeEventListener('pointerup', stop);\n };\n gutter.addEventListener('pointermove', move);\n gutter.addEventListener('pointerup', stop);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const horizontal = this.layout() === 'horizontal';\n // The arrow keys follow the visual direction: the gutter moves left on Arrow left, and the\n // first pane is on the right in right-to-left, so the sign turns.\n const flip = starIsRtl(this.host.nativeElement) ? -1 : 1;\n const delta = {\n ArrowLeft: horizontal ? -2 * flip : 0,\n ArrowRight: horizontal ? 2 * flip : 0,\n ArrowUp: horizontal ? 0 : -2,\n ArrowDown: horizontal ? 0 : 2,\n }[event.key];\n if (delta) {\n event.preventDefault();\n this.size.set(this.clamp(this.size() + delta));\n } else if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n this.size.set(event.key === 'Home' ? this.minSize() : 100 - this.minSize());\n }\n }\n}\n\n// ---------------------------------------------------------------- Speed dial and dock\n\n/**\n * Speed dial (PrimeNG `p-speeddial`): floating action button that opens a short list of\n * actions (up, down, left or right). `aria-expanded`, Escape closes, focus moves to the first action.\n * `<star-speed-dial [items]=\"quickActions\" direction=\"up\" ariaLabel=\"Quick actions\" />`\n *\n * `left` and `right` are the physical sides of the screen, as in CSS. `start` and `end` follow the\n * writing direction (`start` is the left side in LTR and the right side in RTL). The arrow keys\n * move along the visual direction of the list.\n */\n@Component({\n selector: 'star-speed-dial',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': \"'star-speed-dial star-speed-dial--' + direction()\",\n '[class.star-speed-dial--open]': 'open()',\n '[class.star-speed-dial--sm]': \"size() === 'sm'\",\n '[class.star-speed-dial--static]': 'icon() !== defaultIcon',\n '(keydown.escape)': 'close(true)',\n '(keydown)': 'onArrow($event)',\n },\n template: `\n <button\n #fab\n type=\"button\"\n class=\"star-speed-dial__fab\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-label]=\"ariaLabel() ?? text.actions\"\n (click)=\"toggle(list)\"\n >\n <i [class]=\"icon()\" aria-hidden=\"true\"></i>\n </button>\n <ul #list class=\"star-speed-dial__list\" [id]=\"listId\" [attr.inert]=\"open() ? null : ''\">\n @for (item of items(); track $index; let i = $index) {\n <li [style.--star-i]=\"i\">\n <button\n type=\"button\"\n class=\"star-speed-dial__action\"\n [class.star-speed-dial__action--active]=\"i === activeIndex()\"\n [attr.aria-pressed]=\"activeIndex() === null ? null : i === activeIndex()\"\n [attr.aria-label]=\"item.label\"\n [attr.title]=\"item.label\"\n [disabled]=\"item.disabled\"\n (click)=\"run(item); close(true, fab)\"\n >\n <i [class]=\"item.icon ?? 'ph-bold ph-circle'\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n `,\n})\nexport class StarSpeedDial {\n protected readonly text = inject(STAR_UI_TEXT);\n protected readonly listId = inject(_IdGenerator).getId('star-speed-dial-');\n private readonly injector = inject(Injector);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly items = input<readonly StarMenuItem[]>([]);\n readonly direction = input<'up' | 'down' | 'left' | 'right' | 'start' | 'end'>('up');\n readonly ariaLabel = input<string | null>(null);\n /** Icon of the main button. With another icon than the default, the button does not turn. */\n readonly icon = input('ph-bold ph-plus');\n readonly size = input<'sm' | 'md'>('md');\n /** Index of the item that is the current choice (a set of options, for example a theme). */\n readonly activeIndex = input<number | null>(null);\n readonly itemClick = output<StarMenuItem>();\n protected readonly defaultIcon = 'ph-bold ph-plus';\n protected readonly open = signal(false);\n\n protected toggle(list: HTMLElement): void {\n this.open.update((open) => !open);\n // Focus after render: the list is inert until the view updates.\n if (this.open()) {\n afterNextRender(() => list.querySelector<HTMLButtonElement>('button')?.focus(), {\n injector: this.injector,\n });\n }\n }\n\n close(restoreFocus = false, fab?: HTMLElement): void {\n if (!this.open()) return;\n this.open.set(false);\n if (restoreFocus)\n (fab ?? this.host.nativeElement.querySelector<HTMLElement>('.star-speed-dial__fab'))?.focus();\n }\n\n /**\n * Arrow keys along the direction of the list move the focus between the actions (added\n * to the source control, which only used Tab). Home and End go to the first and last action.\n */\n protected onArrow(event: KeyboardEvent): void {\n if (!this.open()) return;\n // The list runs toward a physical side: resolve start and end first.\n const rtl = starIsRtl(this.host.nativeElement);\n const direction = this.direction();\n const side =\n direction === 'start'\n ? rtl\n ? 'right'\n : 'left'\n : direction === 'end'\n ? rtl\n ? 'left'\n : 'right'\n : direction;\n const forward = { up: 'ArrowUp', down: 'ArrowDown', left: 'ArrowLeft', right: 'ArrowRight' }[\n side\n ];\n const backward = { up: 'ArrowDown', down: 'ArrowUp', left: 'ArrowRight', right: 'ArrowLeft' }[\n side\n ];\n if (\n event.key !== forward &&\n event.key !== backward &&\n event.key !== 'Home' &&\n event.key !== 'End'\n )\n return;\n const actions = [\n ...this.host.nativeElement.querySelectorAll<HTMLButtonElement>(\n '.star-speed-dial__action:not(:disabled)',\n ),\n ];\n if (!actions.length) return;\n event.preventDefault();\n const last = actions.length - 1;\n const current = actions.indexOf(\n this.host.nativeElement.ownerDocument.activeElement as HTMLButtonElement,\n );\n let next: number;\n if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = last;\n else if (event.key === forward) next = current < 0 ? 0 : Math.min(last, current + 1);\n else next = current < 0 ? last : Math.max(0, current - 1);\n actions[next].focus();\n }\n\n protected run(item: StarMenuItem): void {\n item.command?.(item);\n this.itemClick.emit(item);\n }\n}\n\n/**\n * Dock (PrimeNG `p-dock`): a bar of app shortcuts that magnify on hover and focus.\n * `<star-dock [items]=\"apps\" ariaLabel=\"Apps\" />`\n */\n@Component({\n selector: 'star-dock',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': \"'star-dock star-dock--' + position()\" },\n template: `\n <nav [attr.aria-label]=\"ariaLabel() ?? text.dock\">\n <ul class=\"star-dock__list\">\n @for (item of items(); track $index) {\n <li>\n <button\n type=\"button\"\n class=\"star-dock__item\"\n [attr.aria-label]=\"item.label\"\n [attr.title]=\"item.label\"\n [disabled]=\"item.disabled\"\n (click)=\"item.command?.(item); itemClick.emit(item)\"\n >\n <i [class]=\"item.icon ?? 'ph-bold ph-app-window'\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n </nav>\n `,\n})\nexport class StarDock {\n protected readonly text = inject(STAR_UI_TEXT);\n readonly items = input<readonly StarMenuItem[]>([]);\n /** `left` and `right` are physical; `start` and `end` follow the writing direction. */\n readonly position = input<'bottom' | 'top' | 'left' | 'right' | 'start' | 'end'>('bottom');\n readonly ariaLabel = input<string | null>(null);\n readonly itemClick = output<StarMenuItem>();\n}\n\n// ---------------------------------------------------------------- Scroll top and block UI\n\n/**\n * Scroll-to-top button (PrimeNG `p-scrolltop`): appears after `threshold` px of scroll on the\n * window or a `target` element; smooth scroll unless the user prefers reduced motion.\n * `<star-scroll-top [threshold]=\"400\" />`\n */\n@Component({\n selector: 'star-scroll-top',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-scroll-top', '[class.star-scroll-top--visible]': 'visible()' },\n template: `\n <button\n type=\"button\"\n class=\"star-scroll-top__btn\"\n [attr.aria-label]=\"text.scrollToTop\"\n [attr.tabindex]=\"visible() ? 0 : -1\"\n (click)=\"toTop()\"\n >\n <i class=\"ph-bold ph-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n `,\n})\nexport class StarScrollTop {\n protected readonly text = inject(STAR_UI_TEXT);\n readonly threshold = input(400);\n /** Scroll container; default the window. */\n readonly target = input<HTMLElement | null>(null);\n protected readonly visible = signal(false);\n\n constructor() {\n const onScroll = (event: Event) => {\n const el = this.target();\n if (el && event.target !== el) return;\n const top = el ? el.scrollTop : (document.scrollingElement?.scrollTop ?? 0);\n this.visible.set(top > this.threshold());\n };\n document.addEventListener('scroll', onScroll, { capture: true, passive: true });\n inject(DestroyRef).onDestroy(() =>\n document.removeEventListener('scroll', onScroll, { capture: true }),\n );\n }\n\n protected toTop(): void {\n const reduce = matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n (this.target() ?? document.scrollingElement ?? document.documentElement).scrollTo?.({\n top: 0,\n behavior: reduce ? 'auto' : 'smooth',\n });\n }\n}\n\n/**\n * Block UI (PrimeNG `p-blockui`): while `blocked`, the content is `inert` (no focus, no clicks,\n * hidden from assistive tech) and shows a busy overlay with a spinner.\n * `<star-block-ui [blocked]=\"saving()\">…form…</star-block-ui>`\n */\n@Component({\n selector: 'star-block-ui',\n imports: [StarSpinner],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-block-ui', '[attr.aria-busy]': 'blocked() || null' },\n template: `\n <div class=\"star-block-ui__content\" [attr.inert]=\"blocked() ? '' : null\"><ng-content /></div>\n @if (blocked()) {\n <div class=\"star-block-ui__mask\">\n <star-spinner size=\"2rem\" [ariaLabel]=\"message()\" />\n @if (message()) {\n <span class=\"star-block-ui__message\">{{ message() }}</span>\n }\n </div>\n }\n `,\n})\nexport class StarBlockUi {\n readonly blocked = input(false, { transform: booleanAttribute });\n readonly message = input('');\n}\n\n// ---------------------------------------------------------------- Meter group\n\nexport interface StarMeterItem {\n readonly label: string;\n readonly value: number;\n /** Phosphor icon class shown in the legend. */\n readonly icon?: string;\n}\n\n/**\n * Meter group (PrimeNG `p-metergroup`): one bar split into parts (fixed series colors, 2px gaps)\n * with a labelled legend. `role=\"meter\"` per part, so each value is announced.\n * `<star-meter-group [items]=\"storage\" [max]=\"100\" unit=\"GB\" ariaLabel=\"Storage\" />`\n */\n@Component({\n selector: 'star-meter-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-meter-group', role: 'group', '[attr.aria-label]': 'ariaLabel()' },\n template: `\n <div class=\"star-meter-group__bar\">\n @for (item of items(); track item.label; let i = $index) {\n <span\n class=\"star-meter-group__part\"\n role=\"meter\"\n [attr.aria-label]=\"item.label\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"total()\"\n [attr.aria-valuenow]=\"item.value\"\n [attr.aria-valuetext]=\"\n text.meterValue(item.value + (unit() ? ' ' + unit() : ''), total())\n \"\n [style.width.%]=\"(item.value / total()) * 100\"\n [style.background]=\"color(i)\"\n ></span>\n }\n </div>\n <ul class=\"star-meter-group__legend\" aria-hidden=\"true\">\n @for (item of items(); track item.label; let i = $index) {\n <li>\n <span class=\"star-chart__swatch\" [style.background]=\"color(i)\"></span>\n {{ item.label }} <strong>{{ item.value }}{{ unit() ? ' ' + unit() : '' }}</strong>\n </li>\n }\n </ul>\n `,\n})\nexport class StarMeterGroup {\n protected readonly text = inject(STAR_UI_TEXT);\n readonly items = input<readonly StarMeterItem[]>([]);\n /** Full scale; default: the sum of the items. */\n readonly max = input<number | null>(null);\n readonly unit = input('');\n readonly ariaLabel = input<string | null>(null);\n protected readonly total = computed(\n () => this.max() ?? (this.items().reduce((sum, item) => sum + item.value, 0) || 1),\n );\n protected color(index: number): string {\n return `var(--star-chart-${(index % 8) + 1})`;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export * from "@star-ng/ui/accordion";
2
+ export * from "@star-ng/ui/autocomplete";
3
+ export * from "@star-ng/ui/avatar";
4
+ export * from "@star-ng/ui/badge";
5
+ export * from "@star-ng/ui/breadcrumb";
6
+ export * from "@star-ng/ui/button";
7
+ export * from "@star-ng/ui/card";
8
+ export * from "@star-ng/ui/chart";
9
+ export * from "@star-ng/ui/checkbox";
10
+ export * from "@star-ng/ui/core";
11
+ export * from "@star-ng/ui/data-display";
12
+ export * from "@star-ng/ui/date-picker";
13
+ export * from "@star-ng/ui/dialog";
14
+ export * from "@star-ng/ui/drawer";
15
+ export * from "@star-ng/ui/editor";
16
+ export * from "@star-ng/ui/field";
17
+ export * from "@star-ng/ui/file-upload";
18
+ export * from "@star-ng/ui/input-group";
19
+ export * from "@star-ng/ui/input-mask";
20
+ export * from "@star-ng/ui/input-number";
21
+ export * from "@star-ng/ui/input-otp";
22
+ export * from "@star-ng/ui/input-tags";
23
+ export * from "@star-ng/ui/knob";
24
+ export * from "@star-ng/ui/layout";
25
+ export * from "@star-ng/ui/listbox";
26
+ export * from "@star-ng/ui/media";
27
+ export * from "@star-ng/ui/menu";
28
+ export * from "@star-ng/ui/message";
29
+ export * from "@star-ng/ui/paginator";
30
+ export * from "@star-ng/ui/panel";
31
+ export * from "@star-ng/ui/password";
32
+ export * from "@star-ng/ui/popover";
33
+ export * from "@star-ng/ui/progress-bar";
34
+ export * from "@star-ng/ui/radio";
35
+ export * from "@star-ng/ui/rating";
36
+ export * from "@star-ng/ui/select";
37
+ export * from "@star-ng/ui/select-button";
38
+ export * from "@star-ng/ui/skeleton";
39
+ export * from "@star-ng/ui/slider";
40
+ export * from "@star-ng/ui/spinner";
41
+ export * from "@star-ng/ui/stepper";
42
+ export * from "@star-ng/ui/table";
43
+ export * from "@star-ng/ui/tabs";
44
+ export * from "@star-ng/ui/tag";
45
+ export * from "@star-ng/ui/theme";
46
+ export * from "@star-ng/ui/theme-switch";
47
+ export * from "@star-ng/ui/toast";
48
+ export * from "@star-ng/ui/toggle-switch";
49
+ export * from "@star-ng/ui/tooltip";
50
+ export * from "@star-ng/ui/tree";
51
+ export * from "@star-ng/ui/utility";
package/package.json CHANGED
@@ -1,6 +1,284 @@
1
1
  {
2
2
  "name": "@star-ng/ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "StarNG: accessible Angular controls built on signals, Signal Forms and the Angular CDK.",
5
+ "license": "MIT",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/ramanacr/star-ng.git"
12
+ },
13
+ "homepage": "https://ramanacr.github.io/star-ng/",
14
+ "bugs": {
15
+ "url": "https://github.com/ramanacr/star-ng/issues"
16
+ },
17
+ "author": "ramanacr",
18
+ "keywords": [
19
+ "angular",
20
+ "components",
21
+ "ui",
22
+ "signals",
23
+ "signal-forms",
24
+ "accessibility"
25
+ ],
26
+ "peerDependencies": {
27
+ "@angular/cdk": "^22.0.0",
28
+ "@angular/common": "^22.0.0",
29
+ "@angular/core": "^22.0.0",
30
+ "@angular/forms": "^22.0.0",
31
+ "@angular/router": "^22.0.0",
32
+ "@jsverse/transloco": "^8.0.0",
33
+ "@phosphor-icons/web": "^2.1.0",
34
+ "rxjs": "^7.8.0"
35
+ },
36
+ "peerDependenciesMeta": {
37
+ "@jsverse/transloco": {
38
+ "optional": true
39
+ }
40
+ },
41
+ "dependencies": {
42
+ "tslib": "^2.3.0"
43
+ },
44
+ "exports": {
45
+ "./theme/star-theme-first-paint.js": {
46
+ "default": "./theme/star-theme-first-paint.js"
47
+ },
48
+ "./styles/star-ng.css": {
49
+ "style": "./styles/star-ng.css",
50
+ "default": "./styles/star-ng.css"
51
+ },
52
+ "./styles/*": {
53
+ "sass": "./styles/*",
54
+ "default": "./styles/*"
55
+ },
56
+ "./package.json": {
57
+ "default": "./package.json"
58
+ },
59
+ ".": {
60
+ "types": "./types/star-ng-ui.d.ts",
61
+ "default": "./fesm2022/star-ng-ui.mjs"
62
+ },
63
+ "./accordion": {
64
+ "types": "./types/star-ng-ui-accordion.d.ts",
65
+ "default": "./fesm2022/star-ng-ui-accordion.mjs"
66
+ },
67
+ "./autocomplete": {
68
+ "types": "./types/star-ng-ui-autocomplete.d.ts",
69
+ "default": "./fesm2022/star-ng-ui-autocomplete.mjs"
70
+ },
71
+ "./avatar": {
72
+ "types": "./types/star-ng-ui-avatar.d.ts",
73
+ "default": "./fesm2022/star-ng-ui-avatar.mjs"
74
+ },
75
+ "./badge": {
76
+ "types": "./types/star-ng-ui-badge.d.ts",
77
+ "default": "./fesm2022/star-ng-ui-badge.mjs"
78
+ },
79
+ "./breadcrumb": {
80
+ "types": "./types/star-ng-ui-breadcrumb.d.ts",
81
+ "default": "./fesm2022/star-ng-ui-breadcrumb.mjs"
82
+ },
83
+ "./button": {
84
+ "types": "./types/star-ng-ui-button.d.ts",
85
+ "default": "./fesm2022/star-ng-ui-button.mjs"
86
+ },
87
+ "./card": {
88
+ "types": "./types/star-ng-ui-card.d.ts",
89
+ "default": "./fesm2022/star-ng-ui-card.mjs"
90
+ },
91
+ "./chart": {
92
+ "types": "./types/star-ng-ui-chart.d.ts",
93
+ "default": "./fesm2022/star-ng-ui-chart.mjs"
94
+ },
95
+ "./checkbox": {
96
+ "types": "./types/star-ng-ui-checkbox.d.ts",
97
+ "default": "./fesm2022/star-ng-ui-checkbox.mjs"
98
+ },
99
+ "./core": {
100
+ "types": "./types/star-ng-ui-core.d.ts",
101
+ "default": "./fesm2022/star-ng-ui-core.mjs"
102
+ },
103
+ "./data-display": {
104
+ "types": "./types/star-ng-ui-data-display.d.ts",
105
+ "default": "./fesm2022/star-ng-ui-data-display.mjs"
106
+ },
107
+ "./date-picker": {
108
+ "types": "./types/star-ng-ui-date-picker.d.ts",
109
+ "default": "./fesm2022/star-ng-ui-date-picker.mjs"
110
+ },
111
+ "./dialog": {
112
+ "types": "./types/star-ng-ui-dialog.d.ts",
113
+ "default": "./fesm2022/star-ng-ui-dialog.mjs"
114
+ },
115
+ "./drawer": {
116
+ "types": "./types/star-ng-ui-drawer.d.ts",
117
+ "default": "./fesm2022/star-ng-ui-drawer.mjs"
118
+ },
119
+ "./editor": {
120
+ "types": "./types/star-ng-ui-editor.d.ts",
121
+ "default": "./fesm2022/star-ng-ui-editor.mjs"
122
+ },
123
+ "./field": {
124
+ "types": "./types/star-ng-ui-field.d.ts",
125
+ "default": "./fesm2022/star-ng-ui-field.mjs"
126
+ },
127
+ "./file-upload": {
128
+ "types": "./types/star-ng-ui-file-upload.d.ts",
129
+ "default": "./fesm2022/star-ng-ui-file-upload.mjs"
130
+ },
131
+ "./i18n/de": {
132
+ "types": "./types/star-ng-ui-i18n-de.d.ts",
133
+ "default": "./fesm2022/star-ng-ui-i18n-de.mjs"
134
+ },
135
+ "./i18n/es": {
136
+ "types": "./types/star-ng-ui-i18n-es.d.ts",
137
+ "default": "./fesm2022/star-ng-ui-i18n-es.mjs"
138
+ },
139
+ "./input-group": {
140
+ "types": "./types/star-ng-ui-input-group.d.ts",
141
+ "default": "./fesm2022/star-ng-ui-input-group.mjs"
142
+ },
143
+ "./input-mask": {
144
+ "types": "./types/star-ng-ui-input-mask.d.ts",
145
+ "default": "./fesm2022/star-ng-ui-input-mask.mjs"
146
+ },
147
+ "./input-number": {
148
+ "types": "./types/star-ng-ui-input-number.d.ts",
149
+ "default": "./fesm2022/star-ng-ui-input-number.mjs"
150
+ },
151
+ "./input-otp": {
152
+ "types": "./types/star-ng-ui-input-otp.d.ts",
153
+ "default": "./fesm2022/star-ng-ui-input-otp.mjs"
154
+ },
155
+ "./input-tags": {
156
+ "types": "./types/star-ng-ui-input-tags.d.ts",
157
+ "default": "./fesm2022/star-ng-ui-input-tags.mjs"
158
+ },
159
+ "./knob": {
160
+ "types": "./types/star-ng-ui-knob.d.ts",
161
+ "default": "./fesm2022/star-ng-ui-knob.mjs"
162
+ },
163
+ "./layout": {
164
+ "types": "./types/star-ng-ui-layout.d.ts",
165
+ "default": "./fesm2022/star-ng-ui-layout.mjs"
166
+ },
167
+ "./listbox": {
168
+ "types": "./types/star-ng-ui-listbox.d.ts",
169
+ "default": "./fesm2022/star-ng-ui-listbox.mjs"
170
+ },
171
+ "./media": {
172
+ "types": "./types/star-ng-ui-media.d.ts",
173
+ "default": "./fesm2022/star-ng-ui-media.mjs"
174
+ },
175
+ "./menu": {
176
+ "types": "./types/star-ng-ui-menu.d.ts",
177
+ "default": "./fesm2022/star-ng-ui-menu.mjs"
178
+ },
179
+ "./message": {
180
+ "types": "./types/star-ng-ui-message.d.ts",
181
+ "default": "./fesm2022/star-ng-ui-message.mjs"
182
+ },
183
+ "./paginator": {
184
+ "types": "./types/star-ng-ui-paginator.d.ts",
185
+ "default": "./fesm2022/star-ng-ui-paginator.mjs"
186
+ },
187
+ "./panel": {
188
+ "types": "./types/star-ng-ui-panel.d.ts",
189
+ "default": "./fesm2022/star-ng-ui-panel.mjs"
190
+ },
191
+ "./password": {
192
+ "types": "./types/star-ng-ui-password.d.ts",
193
+ "default": "./fesm2022/star-ng-ui-password.mjs"
194
+ },
195
+ "./popover": {
196
+ "types": "./types/star-ng-ui-popover.d.ts",
197
+ "default": "./fesm2022/star-ng-ui-popover.mjs"
198
+ },
199
+ "./progress-bar": {
200
+ "types": "./types/star-ng-ui-progress-bar.d.ts",
201
+ "default": "./fesm2022/star-ng-ui-progress-bar.mjs"
202
+ },
203
+ "./radio": {
204
+ "types": "./types/star-ng-ui-radio.d.ts",
205
+ "default": "./fesm2022/star-ng-ui-radio.mjs"
206
+ },
207
+ "./rating": {
208
+ "types": "./types/star-ng-ui-rating.d.ts",
209
+ "default": "./fesm2022/star-ng-ui-rating.mjs"
210
+ },
211
+ "./select": {
212
+ "types": "./types/star-ng-ui-select.d.ts",
213
+ "default": "./fesm2022/star-ng-ui-select.mjs"
214
+ },
215
+ "./select-button": {
216
+ "types": "./types/star-ng-ui-select-button.d.ts",
217
+ "default": "./fesm2022/star-ng-ui-select-button.mjs"
218
+ },
219
+ "./skeleton": {
220
+ "types": "./types/star-ng-ui-skeleton.d.ts",
221
+ "default": "./fesm2022/star-ng-ui-skeleton.mjs"
222
+ },
223
+ "./slider": {
224
+ "types": "./types/star-ng-ui-slider.d.ts",
225
+ "default": "./fesm2022/star-ng-ui-slider.mjs"
226
+ },
227
+ "./spinner": {
228
+ "types": "./types/star-ng-ui-spinner.d.ts",
229
+ "default": "./fesm2022/star-ng-ui-spinner.mjs"
230
+ },
231
+ "./stepper": {
232
+ "types": "./types/star-ng-ui-stepper.d.ts",
233
+ "default": "./fesm2022/star-ng-ui-stepper.mjs"
234
+ },
235
+ "./table": {
236
+ "types": "./types/star-ng-ui-table.d.ts",
237
+ "default": "./fesm2022/star-ng-ui-table.mjs"
238
+ },
239
+ "./tabs": {
240
+ "types": "./types/star-ng-ui-tabs.d.ts",
241
+ "default": "./fesm2022/star-ng-ui-tabs.mjs"
242
+ },
243
+ "./tag": {
244
+ "types": "./types/star-ng-ui-tag.d.ts",
245
+ "default": "./fesm2022/star-ng-ui-tag.mjs"
246
+ },
247
+ "./theme": {
248
+ "types": "./types/star-ng-ui-theme.d.ts",
249
+ "default": "./fesm2022/star-ng-ui-theme.mjs"
250
+ },
251
+ "./theme-switch": {
252
+ "types": "./types/star-ng-ui-theme-switch.d.ts",
253
+ "default": "./fesm2022/star-ng-ui-theme-switch.mjs"
254
+ },
255
+ "./toast": {
256
+ "types": "./types/star-ng-ui-toast.d.ts",
257
+ "default": "./fesm2022/star-ng-ui-toast.mjs"
258
+ },
259
+ "./toggle-switch": {
260
+ "types": "./types/star-ng-ui-toggle-switch.d.ts",
261
+ "default": "./fesm2022/star-ng-ui-toggle-switch.mjs"
262
+ },
263
+ "./tooltip": {
264
+ "types": "./types/star-ng-ui-tooltip.d.ts",
265
+ "default": "./fesm2022/star-ng-ui-tooltip.mjs"
266
+ },
267
+ "./transloco": {
268
+ "types": "./types/star-ng-ui-transloco.d.ts",
269
+ "default": "./fesm2022/star-ng-ui-transloco.mjs"
270
+ },
271
+ "./tree": {
272
+ "types": "./types/star-ng-ui-tree.d.ts",
273
+ "default": "./fesm2022/star-ng-ui-tree.mjs"
274
+ },
275
+ "./utility": {
276
+ "types": "./types/star-ng-ui-utility.d.ts",
277
+ "default": "./fesm2022/star-ng-ui-utility.mjs"
278
+ }
279
+ },
280
+ "sideEffects": false,
281
+ "module": "fesm2022/star-ng-ui.mjs",
282
+ "typings": "types/star-ng-ui.d.ts",
283
+ "type": "module"
6
284
  }
@@ -0,0 +1,70 @@
1
+ // Base rules shared by every control.
2
+
3
+ // Text color on a filled tone (primary, success, warning, danger). The dark theme uses
4
+ // lighter tones, where white text is under 3:1, so the text turns dark there.
5
+ :root {
6
+ --star-on-tone: #fff;
7
+ // Success and warning are bright fills: white text is about 3.2:1 on them in the light
8
+ // theme, so their text is dark in both themes.
9
+ --star-on-bright: var(--star-text-strong);
10
+ // Fill of a control that carries text on the primary color. A product whose primary color
11
+ // gives white text under 4.5:1 can set a darker fill here without changing `--star-primary`.
12
+ --star-primary-fill: var(--star-primary);
13
+ }
14
+ [data-theme='dark'] {
15
+ --star-on-tone: var(--star-surface);
16
+ --star-on-bright: var(--star-surface);
17
+ --star-primary-fill: var(--star-primary);
18
+ }
19
+
20
+ // A table ignores `width: 1px` and table rules can set a width; as a 1px block it does not
21
+ // widen the page.
22
+ table.star-sr-only {
23
+ display: block;
24
+ width: 1px;
25
+ }
26
+ .star-sr-only {
27
+ position: absolute;
28
+ width: 1px;
29
+ height: 1px;
30
+ margin: -1px;
31
+ padding: 0;
32
+ overflow: hidden;
33
+ clip-path: inset(50%);
34
+ white-space: nowrap;
35
+ border: 0;
36
+ }
37
+
38
+ @media (prefers-reduced-motion: reduce) {
39
+ .star-panel,
40
+ .star-toast,
41
+ .star-tooltip,
42
+ .star-dialog,
43
+ .star-dialog::backdrop,
44
+ .star-switch__thumb,
45
+ .star-tabs__tab::after,
46
+ .star-accordion__region,
47
+ .star-progress__fill {
48
+ animation: none;
49
+ transition: none;
50
+ }
51
+ .star-skeleton::after {
52
+ animation: none;
53
+ }
54
+ }
55
+
56
+ // Phosphor icons take size from their container.
57
+ i[class^='ph-'],
58
+ i[class*=' ph-'] {
59
+ font-size: 1.25em;
60
+ line-height: 1;
61
+ }
62
+
63
+ // Direction. An icon that points along the reading direction (next, previous, a submenu
64
+ // arrow, a breadcrumb separator) takes this class and turns around in right-to-left. An icon
65
+ // with a fixed meaning (check mark, clock, play, search) does not. `:dir()` is used instead of
66
+ // `[dir='rtl']` because it also follows `dir="auto"`, a nested `dir="ltr"` island and the CSS
67
+ // `direction` property. `scale` is separate from `rotate` and `translate`, so it does not clash.
68
+ .star-icon-mirror:dir(rtl) {
69
+ scale: -1 1;
70
+ }
@@ -0,0 +1,2 @@
1
+ // Sass values shared by the control partials. This file emits no CSS.
2
+ $ease: cubic-bezier(0.2, 0, 0, 1);