@bitforgehq/ui 0.3.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 (281) hide show
  1. package/CHANGELOG.md +3665 -0
  2. package/LICENSE +21 -0
  3. package/README.md +175 -0
  4. package/ai/MANIFEST.index.json +383 -0
  5. package/ai/MANIFEST.json +7528 -0
  6. package/ai/REFERENCE.index.json +1461 -0
  7. package/ai/REFERENCE.json +7213 -0
  8. package/ai/UI_GUIDE.md +1159 -0
  9. package/ai/components/action-bar.md +209 -0
  10. package/ai/components/action-sheet.md +526 -0
  11. package/ai/components/alert-dialog.md +509 -0
  12. package/ai/components/alert.md +376 -0
  13. package/ai/components/avatar.md +146 -0
  14. package/ai/components/back-button.md +286 -0
  15. package/ai/components/badge.md +171 -0
  16. package/ai/components/button.md +431 -0
  17. package/ai/components/card.md +303 -0
  18. package/ai/components/checkbox.md +418 -0
  19. package/ai/components/chip-group.md +205 -0
  20. package/ai/components/chip.md +300 -0
  21. package/ai/components/content.md +474 -0
  22. package/ai/components/desktop-toast.md +420 -0
  23. package/ai/components/dialog.md +962 -0
  24. package/ai/components/empty-state.md +146 -0
  25. package/ai/components/field.md +319 -0
  26. package/ai/components/header.md +809 -0
  27. package/ai/components/icon-button.md +221 -0
  28. package/ai/components/icon.md +176 -0
  29. package/ai/components/input.md +455 -0
  30. package/ai/components/list-item.md +326 -0
  31. package/ai/components/list.md +178 -0
  32. package/ai/components/menu-button.md +377 -0
  33. package/ai/components/menu.md +661 -0
  34. package/ai/components/modal.md +613 -0
  35. package/ai/components/number-input.md +423 -0
  36. package/ai/components/page.md +299 -0
  37. package/ai/components/progress.md +215 -0
  38. package/ai/components/radio-group.md +432 -0
  39. package/ai/components/refresher.md +377 -0
  40. package/ai/components/segmented.md +517 -0
  41. package/ai/components/select.md +510 -0
  42. package/ai/components/sheet.md +845 -0
  43. package/ai/components/spinner.md +171 -0
  44. package/ai/components/stack-outlet.md +661 -0
  45. package/ai/components/tab-bar.md +427 -0
  46. package/ai/components/tab.md +295 -0
  47. package/ai/components/tabs.md +408 -0
  48. package/ai/components/textarea.md +371 -0
  49. package/ai/components/toast.md +522 -0
  50. package/ai/components/toggle.md +387 -0
  51. package/ai/reference/bf-action-directive.md +21 -0
  52. package/ai/reference/bf-action-sheet-action-role.md +27 -0
  53. package/ai/reference/bf-action-sheet-action.md +28 -0
  54. package/ai/reference/bf-action-sheet-options.md +28 -0
  55. package/ai/reference/bf-action-sheet-service.md +33 -0
  56. package/ai/reference/bf-alert-dialog-button-role.md +27 -0
  57. package/ai/reference/bf-alert-dialog-button.md +27 -0
  58. package/ai/reference/bf-alert-dialog-options.md +29 -0
  59. package/ai/reference/bf-alert-dialog-service.md +34 -0
  60. package/ai/reference/bf-alert-variant.md +28 -0
  61. package/ai/reference/bf-autocapitalize.md +30 -0
  62. package/ai/reference/bf-avatar-size.md +27 -0
  63. package/ai/reference/bf-avatar-variant.md +28 -0
  64. package/ai/reference/bf-back-at-root.md +28 -0
  65. package/ai/reference/bf-back-button-service.md +40 -0
  66. package/ai/reference/bf-badge-variant.md +29 -0
  67. package/ai/reference/bf-button-size.md +29 -0
  68. package/ai/reference/bf-button-type.md +28 -0
  69. package/ai/reference/bf-button-variant.md +29 -0
  70. package/ai/reference/bf-card-padding.md +26 -0
  71. package/ai/reference/bf-card-variant.md +28 -0
  72. package/ai/reference/bf-chip-group-mode.md +27 -0
  73. package/ai/reference/bf-chip-variant.md +26 -0
  74. package/ai/reference/bf-compare-with.md +24 -0
  75. package/ai/reference/bf-component-overlay-ref.md +33 -0
  76. package/ai/reference/bf-confirm-button-role.md +26 -0
  77. package/ai/reference/bf-confirm-button.md +27 -0
  78. package/ai/reference/bf-confirm-options.md +31 -0
  79. package/ai/reference/bf-confirm-size.md +26 -0
  80. package/ai/reference/bf-content-scroll-event.md +21 -0
  81. package/ai/reference/bf-defaults-options.md +32 -0
  82. package/ai/reference/bf-defaults.md +28 -0
  83. package/ai/reference/bf-desktop-toast-config.md +28 -0
  84. package/ai/reference/bf-desktop-toast-harness.md +33 -0
  85. package/ai/reference/bf-desktop-toast-options.md +28 -0
  86. package/ai/reference/bf-desktop-toast-position.md +28 -0
  87. package/ai/reference/bf-desktop-toast-service.md +42 -0
  88. package/ai/reference/bf-dialog-config.md +44 -0
  89. package/ai/reference/bf-dialog-harness.md +52 -0
  90. package/ai/reference/bf-dialog-ref.md +44 -0
  91. package/ai/reference/bf-dialog-role.md +26 -0
  92. package/ai/reference/bf-dialog-service.md +55 -0
  93. package/ai/reference/bf-dialog-size.md +31 -0
  94. package/ai/reference/bf-dialog-template-context.md +32 -0
  95. package/ai/reference/bf-empty-state-heading-level.md +26 -0
  96. package/ai/reference/bf-enter-key-hint.md +31 -0
  97. package/ai/reference/bf-field-control-class.md +32 -0
  98. package/ai/reference/bf-field-control-state.md +28 -0
  99. package/ai/reference/bf-field-size.md +29 -0
  100. package/ai/reference/bf-haptics-impact-style.md +27 -0
  101. package/ai/reference/bf-haptics-notification-type.md +27 -0
  102. package/ai/reference/bf-haptics-service.md +41 -0
  103. package/ai/reference/bf-harness-filters.md +29 -0
  104. package/ai/reference/bf-horizontal-scroll-directive.md +129 -0
  105. package/ai/reference/bf-icon-button-variant.md +28 -0
  106. package/ai/reference/bf-icon-size.md +27 -0
  107. package/ai/reference/bf-input-autocapitalize.md +36 -0
  108. package/ai/reference/bf-input-enter-key-hint.md +38 -0
  109. package/ai/reference/bf-input-input-mode.md +38 -0
  110. package/ai/reference/bf-input-mode.md +32 -0
  111. package/ai/reference/bf-input-type.md +35 -0
  112. package/ai/reference/bf-jsdom-shim-options.md +22 -0
  113. package/ai/reference/bf-keyboard-assist-behavior.md +26 -0
  114. package/ai/reference/bf-keyboard-assist-directive.md +185 -0
  115. package/ai/reference/bf-keyboard-phase.md +30 -0
  116. package/ai/reference/bf-keyboard-service.md +50 -0
  117. package/ai/reference/bf-labels-overrides.md +26 -0
  118. package/ai/reference/bf-labels.md +44 -0
  119. package/ai/reference/bf-menu-button-harness.md +40 -0
  120. package/ai/reference/bf-menu-button-variant.md +27 -0
  121. package/ai/reference/bf-menu-divider-directive.md +13 -0
  122. package/ai/reference/bf-menu-group-directive.md +14 -0
  123. package/ai/reference/bf-menu-harness.md +55 -0
  124. package/ai/reference/bf-menu-item-checkbox-directive.md +31 -0
  125. package/ai/reference/bf-menu-item-directive.md +31 -0
  126. package/ai/reference/bf-menu-item-harness.md +52 -0
  127. package/ai/reference/bf-menu-item-radio-directive.md +29 -0
  128. package/ai/reference/bf-menu-placement.md +29 -0
  129. package/ai/reference/bf-menu-trigger-directive.md +46 -0
  130. package/ai/reference/bf-modal-options.md +30 -0
  131. package/ai/reference/bf-modal-presentation.md +26 -0
  132. package/ai/reference/bf-modal-service.md +38 -0
  133. package/ai/reference/bf-nav-controller.md +59 -0
  134. package/ai/reference/bf-nav-direction.md +23 -0
  135. package/ai/reference/bf-nav-target.md +21 -0
  136. package/ai/reference/bf-number-input-mode.md +28 -0
  137. package/ai/reference/bf-number-input-step.md +25 -0
  138. package/ai/reference/bf-overlay-auto-focus.md +29 -0
  139. package/ai/reference/bf-overlay-controller.md +22 -0
  140. package/ai/reference/bf-overlay-host.md +36 -0
  141. package/ai/reference/bf-overlay-options.md +53 -0
  142. package/ai/reference/bf-overlay-position.md +30 -0
  143. package/ai/reference/bf-overlay-ref.md +53 -0
  144. package/ai/reference/bf-overlay-role.md +27 -0
  145. package/ai/reference/bf-overlay-service.md +53 -0
  146. package/ai/reference/bf-overlay-stack-options.md +24 -0
  147. package/ai/reference/bf-overlay-stack.md +81 -0
  148. package/ai/reference/bf-overlay-template-context.md +24 -0
  149. package/ai/reference/bf-overscroll-stretch-directive.md +163 -0
  150. package/ai/reference/bf-page-context.md +24 -0
  151. package/ai/reference/bf-platform-service.md +53 -0
  152. package/ai/reference/bf-platform.md +28 -0
  153. package/ai/reference/bf-progress-size.md +26 -0
  154. package/ai/reference/bf-progress-tone.md +28 -0
  155. package/ai/reference/bf-radio-group-harness.md +49 -0
  156. package/ai/reference/bf-radio-group-orientation.md +26 -0
  157. package/ai/reference/bf-radio-option.md +30 -0
  158. package/ai/reference/bf-refresher-refresh-event.md +22 -0
  159. package/ai/reference/bf-segment-option.md +29 -0
  160. package/ai/reference/bf-segmented-harness.md +48 -0
  161. package/ai/reference/bf-segmented-size.md +29 -0
  162. package/ai/reference/bf-select-harness.md +70 -0
  163. package/ai/reference/bf-select-option.md +29 -0
  164. package/ai/reference/bf-sheet-auto-focus.md +29 -0
  165. package/ai/reference/bf-sheet-options.md +32 -0
  166. package/ai/reference/bf-sheet-ref.md +45 -0
  167. package/ai/reference/bf-sheet-service.md +34 -0
  168. package/ai/reference/bf-shell-config-mode.md +28 -0
  169. package/ai/reference/bf-shell-config.md +38 -0
  170. package/ai/reference/bf-shell-dynamic-type-limit.md +21 -0
  171. package/ai/reference/bf-shell-dynamic-type.md +25 -0
  172. package/ai/reference/bf-shell-mode.md +28 -0
  173. package/ai/reference/bf-shell-testing-options.md +26 -0
  174. package/ai/reference/bf-size.md +45 -0
  175. package/ai/reference/bf-spinner-size.md +27 -0
  176. package/ai/reference/bf-stack-change.md +22 -0
  177. package/ai/reference/bf-stack-reuse-strategy.md +32 -0
  178. package/ai/reference/bf-stack-transition-event.md +26 -0
  179. package/ai/reference/bf-stack-transition.md +26 -0
  180. package/ai/reference/bf-stacked-overlay.md +23 -0
  181. package/ai/reference/bf-system-bars-style.md +38 -0
  182. package/ai/reference/bf-tab-bar-controller.md +51 -0
  183. package/ai/reference/bf-tab-bar-host.md +52 -0
  184. package/ai/reference/bf-tab-context.md +32 -0
  185. package/ai/reference/bf-tab-links.md +37 -0
  186. package/ai/reference/bf-testing-options.md +27 -0
  187. package/ai/reference/bf-text-scale-service.md +35 -0
  188. package/ai/reference/bf-theme.md +27 -0
  189. package/ai/reference/bf-toast-action.md +25 -0
  190. package/ai/reference/bf-toast-controller.md +17 -0
  191. package/ai/reference/bf-toast-dismiss-reason.md +29 -0
  192. package/ai/reference/bf-toast-options.md +29 -0
  193. package/ai/reference/bf-toast-position.md +26 -0
  194. package/ai/reference/bf-toast-ref.md +41 -0
  195. package/ai/reference/bf-toast-service.md +39 -0
  196. package/ai/reference/bf-toggle-label-position.md +26 -0
  197. package/ai/reference/bf-transition-kind.md +28 -0
  198. package/ai/reference/bf-validation-message.md +31 -0
  199. package/ai/reference/bf-validation-messages.md +33 -0
  200. package/ai/reference/bf-view-event.md +28 -0
  201. package/ai/reference/bf-view-lifecycle.md +41 -0
  202. package/ai/reference/bf-view-state.md +28 -0
  203. package/ai/reference/bf_default_labels.md +21 -0
  204. package/ai/reference/bf_default_values.md +21 -0
  205. package/ai/reference/bf_defaults.md +21 -0
  206. package/ai/reference/bf_desktop_toast_defaults.md +21 -0
  207. package/ai/reference/bf_dialog_data.md +17 -0
  208. package/ai/reference/bf_labels.md +21 -0
  209. package/ai/reference/bf_overlay_data.md +19 -0
  210. package/ai/reference/bf_overlay_host.md +21 -0
  211. package/ai/reference/bf_sheet_default_snap_points.md +17 -0
  212. package/ai/reference/bf_shell_config.md +21 -0
  213. package/ai/reference/bf_shell_defaults.md +21 -0
  214. package/ai/reference/bf_tab_bar.md +21 -0
  215. package/ai/reference/bf_tab_bar_controller.md +21 -0
  216. package/ai/reference/bf_tab_context.md +21 -0
  217. package/ai/reference/bf_tab_links.md +21 -0
  218. package/ai/reference/bf_theme_storage.md +19 -0
  219. package/ai/reference/create-transition.md +36 -0
  220. package/ai/reference/duration_fast.md +17 -0
  221. package/ai/reference/duration_md.md +17 -0
  222. package/ai/reference/duration_overlay.md +17 -0
  223. package/ai/reference/duration_push.md +17 -0
  224. package/ai/reference/fade-down.md +26 -0
  225. package/ai/reference/fade-in.md +25 -0
  226. package/ai/reference/fade-out.md +25 -0
  227. package/ai/reference/fade-up.md +26 -0
  228. package/ai/reference/inject-shell-mode.md +23 -0
  229. package/ai/reference/install-bf-jsdom-shims.md +31 -0
  230. package/ai/reference/ios_duration.md +17 -0
  231. package/ai/reference/ios_easing.md +17 -0
  232. package/ai/reference/is-text-entry.md +25 -0
  233. package/ai/reference/max_complete_ms.md +17 -0
  234. package/ai/reference/md-transition.md +31 -0
  235. package/ai/reference/md_duration.md +17 -0
  236. package/ai/reference/md_easing.md +17 -0
  237. package/ai/reference/overlay_duration.md +21 -0
  238. package/ai/reference/overlay_easing.md +19 -0
  239. package/ai/reference/overlay_reduced_duration.md +17 -0
  240. package/ai/reference/pop-frames-at.md +25 -0
  241. package/ai/reference/prefers-reduced-motion.md +25 -0
  242. package/ai/reference/provide-bf-defaults.md +33 -0
  243. package/ai/reference/provide-bf-desktop-toast.md +28 -0
  244. package/ai/reference/provide-bf-labels.md +38 -0
  245. package/ai/reference/provide-bf-shell-testing.md +34 -0
  246. package/ai/reference/provide-bf-shell.md +41 -0
  247. package/ai/reference/provide-bf-testing.md +33 -0
  248. package/ai/reference/reduced-transition.md +28 -0
  249. package/ai/reference/reduced_duration.md +17 -0
  250. package/ai/reference/resolve-shell-mode.md +33 -0
  251. package/ai/reference/scale-in.md +25 -0
  252. package/ai/reference/settle-duration.md +25 -0
  253. package/ai/reference/settle-pop.md +33 -0
  254. package/ai/reference/settle_easing.md +17 -0
  255. package/ai/reference/should-complete-pop.md +26 -0
  256. package/ai/reference/slide-down.md +26 -0
  257. package/ai/reference/slide-up.md +26 -0
  258. package/ai/reference/with-bf-shell-routing.md +19 -0
  259. package/bin/bf-ui.js +81 -0
  260. package/fesm2022/bitforgehq-ui-icons.mjs +230 -0
  261. package/fesm2022/bitforgehq-ui-icons.mjs.map +1 -0
  262. package/fesm2022/bitforgehq-ui-mobile.mjs +5530 -0
  263. package/fesm2022/bitforgehq-ui-mobile.mjs.map +1 -0
  264. package/fesm2022/bitforgehq-ui-number-input.mjs +680 -0
  265. package/fesm2022/bitforgehq-ui-number-input.mjs.map +1 -0
  266. package/fesm2022/bitforgehq-ui-overlay.mjs +2675 -0
  267. package/fesm2022/bitforgehq-ui-overlay.mjs.map +1 -0
  268. package/fesm2022/bitforgehq-ui-testing.mjs +402 -0
  269. package/fesm2022/bitforgehq-ui-testing.mjs.map +1 -0
  270. package/fesm2022/bitforgehq-ui.mjs +7765 -0
  271. package/fesm2022/bitforgehq-ui.mjs.map +1 -0
  272. package/llms-full.txt +25394 -0
  273. package/llms.txt +329 -0
  274. package/package.json +94 -0
  275. package/theme.css +253 -0
  276. package/types/bitforgehq-ui-icons.d.ts +50 -0
  277. package/types/bitforgehq-ui-mobile.d.ts +2914 -0
  278. package/types/bitforgehq-ui-number-input.d.ts +282 -0
  279. package/types/bitforgehq-ui-overlay.d.ts +1514 -0
  280. package/types/bitforgehq-ui-testing.d.ts +495 -0
  281. package/types/bitforgehq-ui.d.ts +3499 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitforgehq-ui.mjs","names":[],"sources":["../../../projects/ui/src/config/defaults.ts","../../../projects/ui/src/config/labels.ts","../../../projects/ui/src/config/validation-messages.ts","../../../projects/ui/src/components/spinner/spinner.component.ts","../../../projects/ui/src/components/_shared/hit-classes.ts","../../../projects/ui/src/components/button/button.component.ts","../../../projects/ui/src/components/icon-button/icon-button.component.ts","../../../projects/ui/src/components/badge/badge.component.ts","../../../projects/ui/src/components/_shared/pointer-hold.ts","../../../projects/ui/src/components/field/field.component.ts","../../../projects/ui/src/components/_shared/field-classes.ts","../../../projects/ui/src/components/_shared/field-state.ts","../../../projects/ui/src/components/_shared/unique-id.ts","../../../projects/ui/src/components/input/input.component.ts","../../../projects/ui/src/components/textarea/textarea.component.ts","../../../projects/ui/src/components/_shared/choice.ts","../../../projects/ui/src/components/select/select.component.ts","../../../projects/ui/src/components/checkbox/checkbox.component.ts","../../../projects/ui/src/components/toggle/toggle.component.ts","../../../projects/ui/src/components/radio-group/radio-group.component.ts","../../../projects/ui/src/components/chip-group/chip-group.token.ts","../../../projects/ui/src/components/chip/chip.component.ts","../../../projects/ui/src/components/chip-group/chip-group.component.ts","../../../projects/ui/src/components/segmented/segmented.component.ts","../../../projects/ui/src/components/list/list.token.ts","../../../projects/ui/src/components/list/list.component.ts","../../../projects/ui/src/components/action/action-host.token.ts","../../../projects/ui/src/components/list/list-item.component.ts","../../../projects/ui/src/components/card/card.component.ts","../../../projects/ui/src/components/progress/progress.component.ts","../../../projects/ui/src/components/avatar/avatar.component.ts","../../../projects/ui/src/components/alert/alert.component.ts","../../../projects/ui/src/components/empty-state/empty-state.component.ts","../../../projects/ui/src/components/action-bar/action-bar.component.ts","../../../projects/ui/src/components/tab-bar/tab-bar.token.ts","../../../projects/ui/src/components/tab-bar/tab.component.ts","../../../projects/ui/src/components/tab-bar/tab-bar.component.ts","../../../projects/ui/src/components/action/action.directive.ts","../../../projects/ui/src/config/document-reset.ts"],"sourcesContent":["import { InjectionToken, inject, type Provider } from '@angular/core';\nimport type { BfSize } from './size';\n\n/**\n * App-wide widget defaults, read by every sized widget whose `size` input is left unset.\n *\n * @summary The default height steps of text fields and of actions and choice controls\n * @since 0.3.0\n */\nexport interface BfDefaults {\n /**\n * Height step of text fields: bf-input, bf-number-input, bf-select, bf-textarea.\n * @default 'md'\n */\n readonly fieldSize: BfSize;\n /**\n * Height step of actions and choice controls: bf-button, bf-icon-button, bf-chip, bf-segmented,\n * bf-checkbox, bf-toggle, bf-radio-group.\n * @default 'md'\n */\n readonly controlSize: BfSize;\n}\n\n/**\n * Options of `provideBfDefaults()`: any step left out keeps the parent injector's value.\n *\n * @summary The size steps provideBfDefaults sets, each one falling back to the parent\n * @since 0.3.0\n */\nexport interface BfDefaultsOptions extends Partial<BfDefaults> {\n /** Sets `fieldSize` and `controlSize` together; an explicit `fieldSize`/`controlSize` wins. */\n readonly size?: BfSize;\n}\n\n/**\n * Library defaults: compact `md` everywhere (desktop first).\n *\n * @summary The library's built-in widget defaults, the compact md step everywhere\n * @since 0.3.0\n */\nexport const BF_DEFAULT_VALUES: BfDefaults = { fieldSize: 'md', controlSize: 'md' };\n\n/**\n * The widget defaults in effect for the current injector; set them with `provideBfDefaults()`.\n *\n * @summary Injection token holding the widget defaults in effect for an injector\n * @since 0.3.0\n */\nexport const BF_DEFAULTS = new InjectionToken<BfDefaults>('BF_DEFAULTS', {\n providedIn: 'root',\n factory: () => BF_DEFAULT_VALUES,\n});\n\n/**\n * App-wide (ApplicationConfig) or sub-tree (a component's `providers`) widget defaults, merged\n * over the nearest parent's. Capacitor apps: `provideBfDefaults({ fieldSize: 'lg' })` keeps the\n * 0.2 phone look; `{ size: 'lg' }` enlarges every control.\n *\n * @param options The steps to set; any step left out keeps the parent's.\n * @returns The provider of `BF_DEFAULTS`.\n * @summary Sets the default field and control sizes for an app or a sub-tree\n * @since 0.3.0\n */\nexport function provideBfDefaults(options: BfDefaultsOptions): Provider {\n return {\n provide: BF_DEFAULTS,\n useFactory: (): BfDefaults => {\n const parent = inject(BF_DEFAULTS, { skipSelf: true, optional: true }) ?? BF_DEFAULT_VALUES;\n return {\n fieldSize: options.fieldSize ?? options.size ?? parent.fieldSize,\n controlSize: options.controlSize ?? options.size ?? parent.controlSize,\n };\n },\n };\n}\n","import { InjectionToken, inject, type Provider } from '@angular/core';\nimport type { BfValidationMessages } from './validation-messages';\n\n/**\n * Every built-in user-facing string of the library; replace any of them with `provideBfLabels()`.\n *\n * @summary Every built-in user-facing string of the library, one key per string\n * @since 0.3.0\n */\nexport interface BfLabels {\n /**\n * bf-spinner's accessible name (a loading bf-button's spinner is decorative and has none).\n * @default 'Loading'\n */\n readonly loading: string;\n /**\n * bf-alert's dismiss button.\n * @default 'Dismiss'\n */\n readonly dismiss: string;\n /**\n * bf-tab-bar's navigation name.\n * @default 'Main'\n */\n readonly tabBar: string;\n /**\n * bf-tab's announcement of a numeric badge.\n * @default (count) => `${count} new`\n */\n readonly tabBadge: (count: number) => string;\n /**\n * bf-back-button's label.\n * @default 'Back'\n */\n readonly back: string;\n /**\n * BfAlertDialogService's default button.\n * @default 'OK'\n */\n readonly ok: string;\n /**\n * BfActionSheetService's cancel row.\n * @default 'Cancel'\n */\n readonly cancel: string;\n /**\n * An action sheet's name when it has no title.\n * @default 'Actions'\n */\n readonly actions: string;\n /**\n * bf-sheet's name without an ariaLabel or heading.\n * @default 'Sheet'\n */\n readonly sheet: string;\n /**\n * bf-modal's name without an ariaLabel or heading.\n * @default 'Modal'\n */\n readonly modal: string;\n /**\n * bf-refresher's status while refreshing.\n * @default 'Refreshing'\n */\n readonly refreshing: string;\n /**\n * bf-dialog's close button, and bf-sheet's screen-reader Close.\n * @default 'Close'\n */\n readonly close: string;\n /**\n * bf-sheet's grabber button below the top snap point: the next press expands the sheet.\n * @default 'Expand'\n */\n readonly expand: string;\n /**\n * bf-sheet's grabber button at the top snap point: the next press collapses the sheet.\n * @default 'Collapse'\n */\n readonly collapse: string;\n /**\n * bf-sheet's snap position (1-based), announced politely when it changes and part of the\n * grabber button's name.\n * @default (position, count) => `Sheet at ${position} of ${count}`\n */\n readonly sheetPosition: (position: number, count: number) => string;\n /**\n * A dialog's name without an ariaLabel, a bf-dialog title or a heading.\n * @default 'Dialog'\n */\n readonly dialog: string;\n /**\n * The desktop toast stack's region name.\n * @default 'Notifications'\n */\n readonly notifications: string;\n /** Default error text per validator kind (see `BfValidationMessages`). */\n readonly validation: BfValidationMessages;\n}\n\n/**\n * Options of `provideBfLabels()`: any key left out keeps the parent injector's string.\n *\n * @summary The strings provideBfLabels replaces, each one falling back to the parent\n * @since 0.3.0\n */\nexport type BfLabelsOverrides = Partial<Omit<BfLabels, 'validation'>> & {\n readonly validation?: Partial<BfValidationMessages>;\n};\n\n/**\n * The library's built-in English strings.\n *\n * @summary The library's built-in English strings, the labels every widget starts from\n * @since 0.3.0\n */\nexport const BF_DEFAULT_LABELS: BfLabels = {\n loading: 'Loading',\n dismiss: 'Dismiss',\n tabBar: 'Main',\n tabBadge: (count) => `${count} new`,\n back: 'Back',\n ok: 'OK',\n cancel: 'Cancel',\n actions: 'Actions',\n sheet: 'Sheet',\n modal: 'Modal',\n refreshing: 'Refreshing',\n close: 'Close',\n expand: 'Expand',\n collapse: 'Collapse',\n sheetPosition: (position, count) => `Sheet at ${position} of ${count}`,\n dialog: 'Dialog',\n notifications: 'Notifications',\n validation: {\n required: 'Fill in this field',\n email: 'Enter a valid email address',\n pattern: 'Use the expected format',\n parse: 'Enter a valid number',\n min: (min) => `Enter ${min} or more`,\n max: (max) => `Enter ${max} or less`,\n minLength: (length) => `Use at least ${length} characters`,\n maxLength: (length) => `Use at most ${length} characters`,\n minDate: (date) => `Pick ${date.toLocaleDateString()} or later`,\n maxDate: (date) => `Pick ${date.toLocaleDateString()} or earlier`,\n fallback: 'Check this value',\n },\n};\n\n/**\n * The strings in effect for the current injector; set them with `provideBfLabels()`.\n *\n * @summary Injection token holding the user-facing strings in effect for an injector\n * @since 0.3.0\n */\nexport const BF_LABELS = new InjectionToken<BfLabels>('BF_LABELS', {\n providedIn: 'root',\n factory: () => BF_DEFAULT_LABELS,\n});\n\n/**\n * Replaces built-in strings, merged over the parent's (validation merged key by key); a key left\n * out or set to `undefined` keeps the parent's string. In `ApplicationConfig.providers` it covers\n * every string. In a component's `providers` it covers that sub-tree's widgets and form controls\n * (`loading`, `dismiss`, `tabBar`, `tabBadge`, `back`, `refreshing`, `validation`); the overlay\n * services (`ok`, `cancel`, `actions`, `sheet`, `modal`, `close`, `expand`, `collapse`,\n * `sheetPosition`, `dialog`, `notifications`) are\n * root singletons and pick it up only when the caller passes its injector:\n * `open(…, { injector: inject(Injector) })`.\n *\n * @param overrides The strings to replace; any key left out keeps the parent's.\n * @returns The provider of `BF_LABELS`.\n * @summary Replaces built-in strings for an app or a sub-tree, such as a translation\n * @since 0.3.0\n */\nexport function provideBfLabels(overrides: BfLabelsOverrides): Provider {\n return {\n provide: BF_LABELS,\n useFactory: (): BfLabels =>\n mergeLabels(\n inject(BF_LABELS, { skipSelf: true, optional: true }) ?? BF_DEFAULT_LABELS,\n overrides,\n ),\n };\n}\n\n/** Key by key, so an `undefined` override never blanks the parent's string. */\nfunction mergeLabels(parent: BfLabels, o: BfLabelsOverrides): BfLabels {\n const v = o.validation ?? {};\n const pv = parent.validation;\n return {\n loading: o.loading ?? parent.loading,\n dismiss: o.dismiss ?? parent.dismiss,\n tabBar: o.tabBar ?? parent.tabBar,\n tabBadge: o.tabBadge ?? parent.tabBadge,\n back: o.back ?? parent.back,\n ok: o.ok ?? parent.ok,\n cancel: o.cancel ?? parent.cancel,\n actions: o.actions ?? parent.actions,\n sheet: o.sheet ?? parent.sheet,\n modal: o.modal ?? parent.modal,\n refreshing: o.refreshing ?? parent.refreshing,\n close: o.close ?? parent.close,\n expand: o.expand ?? parent.expand,\n collapse: o.collapse ?? parent.collapse,\n sheetPosition: o.sheetPosition ?? parent.sheetPosition,\n dialog: o.dialog ?? parent.dialog,\n notifications: o.notifications ?? parent.notifications,\n validation: {\n required: v.required ?? pv.required,\n email: v.email ?? pv.email,\n pattern: v.pattern ?? pv.pattern,\n parse: v.parse ?? pv.parse,\n min: v.min ?? pv.min,\n max: v.max ?? pv.max,\n minLength: v.minLength ?? pv.minLength,\n maxLength: v.maxLength ?? pv.maxLength,\n minDate: v.minDate ?? pv.minDate,\n maxDate: v.maxDate ?? pv.maxDate,\n fallback: v.fallback ?? pv.fallback,\n },\n };\n}\n","import type { ValidationError } from '@angular/forms/signals';\n\n/**\n * Default text per validator kind, part of `BfLabels`; override with `provideBfLabels()`.\n *\n * @summary The default error text of each validator kind, shown under a form field\n * @since 0.3.0\n */\nexport interface BfValidationMessages {\n /**\n * `required` (Signal Forms and Reactive Forms; `Validators.requiredTrue` reports `required` too).\n * @default 'Fill in this field'\n */\n readonly required: string;\n /**\n * `email`.\n * @default 'Enter a valid email address'\n */\n readonly email: string;\n /**\n * `pattern`.\n * @default 'Use the expected format'\n */\n readonly pattern: string;\n /**\n * `parse`: the text could not be read as a value (e.g. a number field).\n * @default 'Enter a valid number'\n */\n readonly parse: string;\n /**\n * `min`, given the lower limit.\n * @default (min) => `Enter ${min} or more`\n */\n readonly min: (min: number) => string;\n /**\n * `max`, given the upper limit.\n * @default (max) => `Enter ${max} or less`\n */\n readonly max: (max: number) => string;\n /**\n * `minLength` (Signal Forms) and `minlength` (Reactive Forms), given the required length.\n * @default (length) => `Use at least ${length} characters`\n */\n readonly minLength: (length: number) => string;\n /**\n * `maxLength` (Signal Forms) and `maxlength` (Reactive Forms), given the allowed length.\n * @default (length) => `Use at most ${length} characters`\n */\n readonly maxLength: (length: number) => string;\n /**\n * `minDate`, given the earliest date.\n * @default (date) => `Pick ${date.toLocaleDateString()} or later`\n */\n readonly minDate: (date: Date) => string;\n /**\n * `maxDate`, given the latest date.\n * @default (date) => `Pick ${date.toLocaleDateString()} or earlier`\n */\n readonly maxDate: (date: Date) => string;\n /**\n * Any other kind without its own message.\n * @default 'Check this value'\n */\n readonly fallback: string;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n\n/** A numeric field of the error itself (Signal Forms) or of its `context` (Reactive interop). */\nfunction numberField(error: ValidationError, key: string, contextKey: string): number | undefined {\n const own: unknown = Reflect.get(error, key);\n if (typeof own === 'number') {\n return own;\n }\n const context: unknown = Reflect.get(error, 'context');\n if (isRecord(context)) {\n const limit = context[contextKey];\n if (typeof limit === 'number') {\n return limit;\n }\n }\n return undefined;\n}\n\nfunction dateField(error: ValidationError, key: string): Date | undefined {\n const own: unknown = Reflect.get(error, key);\n return own instanceof Date ? own : undefined;\n}\n\nfunction withLimit<T>(\n limit: T | undefined,\n format: (limit: T) => string,\n fallback: string,\n): string {\n return limit === undefined ? fallback : format(limit);\n}\n\n/**\n * The text for one error: its own `message`, else the default for its `kind` (Signal Forms kinds\n * `required|email|pattern|parse|min|max|minLength|maxLength|minDate|maxDate`, and the Reactive\n * interop kinds `required|email|pattern|min|max|minlength|maxlength` whose limits sit\n * in `context`), else `fallback`. Reads limits through type guards, never `any`.\n *\n * @param error A Signal Forms error, or a Reactive Forms error adapted to one.\n * @param messages The default texts, usually `inject(BF_LABELS).validation`.\n * @returns The text to show under the field.\n * @summary Turns one validation error into the text a form field shows under it\n * @since 0.3.0\n */\nexport function bfValidationMessage(\n error: ValidationError,\n messages: BfValidationMessages,\n): string {\n if (error.message) {\n return error.message;\n }\n const { fallback } = messages;\n switch (error.kind) {\n case 'required':\n return messages.required;\n case 'email':\n return messages.email;\n case 'pattern':\n return messages.pattern;\n case 'parse':\n return messages.parse;\n case 'min':\n return withLimit(numberField(error, 'min', 'min'), messages.min, fallback);\n case 'max':\n return withLimit(numberField(error, 'max', 'max'), messages.max, fallback);\n case 'minLength':\n case 'minlength':\n return withLimit(\n numberField(error, 'minLength', 'requiredLength'),\n messages.minLength,\n fallback,\n );\n case 'maxLength':\n case 'maxlength':\n return withLimit(\n numberField(error, 'maxLength', 'requiredLength'),\n messages.maxLength,\n fallback,\n );\n case 'minDate':\n return withLimit(dateField(error, 'minDate'), messages.minDate, fallback);\n case 'maxDate':\n return withLimit(dateField(error, 'maxDate'), messages.maxDate, fallback);\n default:\n return fallback;\n }\n}\n","import { Component, booleanAttribute, computed, inject, input } from '@angular/core';\nimport { BF_LABELS } from '../../config/labels';\n\n/**\n * The diameter of a `bf-spinner`: sm, md or lg.\n *\n * @summary The three spinner diameters, from inline text to a page loading state\n * @since 0.1.0\n */\nexport type BfSpinnerSize = 'sm' | 'md' | 'lg';\n\n/* A CSS ring (no SVG): a faint `currentColor` track with a solid top arc. The ring (14/18/22 px)\n sits inset by a 1 px margin, so its margin box matches `bf-icon`'s sizes (16/20/24 px) and a\n spinner can stand in for an icon without a layout shift, while its outer edge stays close to the\n earlier SVG's (14/17.5/21 px). It rotates only when motion is allowed; under\n `prefers-reduced-motion` it pulses its opacity instead. Under forced colours the arc keeps a\n system-colour contrast against the track, which would otherwise be forced to one colour. */\nconst RING =\n 'block rounded-full border-solid border-current/25 border-t-current motion-safe:animate-spin motion-reduce:animate-pulse forced-colors:forced-color-adjust-none forced-colors:border-[GrayText] forced-colors:border-t-[CanvasText]';\nconst SIZE: Record<BfSpinnerSize, string> = {\n sm: 'size-3.5 m-px border-2',\n md: 'size-4.5 m-px border-2',\n lg: 'size-5.5 m-px border-[3px]',\n};\n/** The box of each size in px, as the deprecated `px` member reports it. */\nconst SIZE_PX: Record<BfSpinnerSize, number> = { sm: 16, md: 20, lg: 24 };\n\n/**\n * Indeterminate progress indicator. Inherits `currentColor`, so place it inside a colored parent\n * (a button, a muted paragraph) rather than coloring it directly.\n *\n * @example\n * <p class=\"flex items-center gap-2 text-text-muted\"><bf-spinner size=\"sm\" /> Loading recipes</p>\n * @summary Indeterminate loading spinner in three sizes that inherits its parent's text color\n * @category Feedback\n * @since 0.1.0\n */\n@Component({\n selector: 'bf-spinner',\n host: { class: 'inline-flex shrink-0' },\n template: `\n <span\n class=\"inline-flex\"\n [attr.role]=\"decorative() ? null : 'status'\"\n [attr.aria-live]=\"decorative() ? null : 'polite'\"\n [attr.aria-hidden]=\"decorative() ? 'true' : null\"\n >\n <span data-bf-spinner-ring [class]=\"ringClasses()\" aria-hidden=\"true\"></span>\n @if (!decorative()) {\n <span class=\"sr-only\">{{ name() }}</span>\n }\n </span>\n `,\n})\nexport class BfSpinnerComponent {\n /** Visual size: 16, 20 or 24 px (the `bf-icon` sizes). */\n readonly size = input<BfSpinnerSize>('md');\n /** Screen-reader text; keep it a short verb phrase. Empty falls back to `provideBfLabels()`'s\n * `loading` (\"Loading\"). Not rendered while `decorative`. */\n readonly label = input('');\n /** Hides the spinner from assistive tech (no status role, no live region, no label), for a\n * spinner inside a control that already reports its busy state, such as a loading `bf-button`. */\n readonly decorative = input(false, { transform: booleanAttribute });\n\n private readonly labels = inject(BF_LABELS);\n\n /** The spinner's box in px (16, 20 or 24) for its `size`.\n * @deprecated 0.3.0 use the size input; removed in 0.4.0 */\n readonly px = computed(() => SIZE_PX[this.size()]);\n /** @internal The ring's classes: the shared ring plus the size's box and border width. */\n readonly ringClasses = computed(() => `${RING} ${SIZE[this.size()]}`);\n /** The rendered screen-reader text: `label`, else the `loading` label. */\n readonly name = computed(() => this.label() || this.labels.loading);\n}\n","import type { BfSize } from '../../config/size';\n\n/* Touch-size hit areas for self-contained controls (buttons, chips, segments). Under a fine pointer\n the visual box is the hit area (sm 32 px is above the 24 px of WCAG 2.5.8), so dense desktop rows\n never overlap; under a coarse pointer an ::after extends it vertically to 44 px. Every part of the\n extension, not only the inset, sits behind `pointer-coarse:`. At `sm` it reaches up to 7.5 px past\n the visual edge (bordered), so stacked or wrapping rows of these controls need `gap-2` (8 px). Class strings stay literal so\n Tailwind finds them in the published bundle. */\n\n/** The positioned, empty ::after that carries the extension; add one inset class beside it. */\nexport const COARSE_HIT_BASE =\n \"pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:content-['']\";\n\n/**\n * Vertical hit extension of a 32/40/48 px pill, to 44 px under a coarse pointer. `bordered` boxes\n * (1.5 px border) position the ::after inside the border, so their inset adds the border back.\n */\nexport const PILL_HIT: Record<BfSize, Record<'plain' | 'bordered', string>> = {\n sm: {\n plain: `${COARSE_HIT_BASE} pointer-coarse:after:-inset-y-1.5`,\n bordered: `${COARSE_HIT_BASE} pointer-coarse:after:-inset-y-[calc(0.375rem+1.5px)]`,\n },\n md: {\n plain: `${COARSE_HIT_BASE} pointer-coarse:after:-inset-y-0.5`,\n bordered: `${COARSE_HIT_BASE} pointer-coarse:after:-inset-y-[calc(0.125rem+1.5px)]`,\n },\n lg: { plain: '', bordered: '' },\n};\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n ElementRef,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { type BfSize } from '../../config/size';\nimport { PILL_HIT } from '../_shared/hit-classes';\nimport { BfSpinnerComponent } from '../spinner/spinner.component';\n\n/**\n * The visual style of a `bf-button`: primary (filled), tonal (soft tint), outline, text or danger.\n *\n * @summary The five visual styles of a button, from filled primary to plain text\n * @since 0.1.0\n */\nexport type BfButtonVariant = 'primary' | 'tonal' | 'outline' | 'text' | 'danger';\n/**\n * The height step of a `bf-button`; the same scale as every sized widget.\n *\n * @deprecated 0.3.0 use BfSize; removed in 1.0.0\n * @summary Former name of the shared size scale for buttons, kept until 1.0.0\n * @since 0.1.0\n */\nexport type BfButtonSize = BfSize;\n/**\n * The native `type` of a `bf-button`: button, submit or reset.\n *\n * @summary The native button types, for a plain action, a form submit or reset\n * @since 0.1.0\n */\nexport type BfButtonType = 'button' | 'submit' | 'reset';\n\nconst BASE =\n 'relative inline-flex max-w-full min-w-0 items-center justify-center gap-2 rounded-control font-bold whitespace-nowrap ' +\n 'transition-colors duration-150 select-none focus-visible:outline-hidden ' +\n 'focus-visible:ring-4 focus-visible:ring-ring ' +\n 'disabled:cursor-not-allowed disabled:bg-surface-sunken disabled:text-text-disabled disabled:border-transparent';\n\nconst VARIANT: Record<BfButtonVariant, string> = {\n primary: 'bg-primary text-on-primary hover:bg-primary-hover',\n tonal: 'bg-primary-soft text-primary-strong hover:bg-primary-soft-hover',\n outline:\n 'bg-surface text-text border-[1.5px] border-border-strong hover:border-text-muted focus-visible:border-primary',\n text: 'bg-transparent text-primary-text hover:text-primary-strong',\n /* The hover label is danger-soft: it holds 4.5:1 on danger in both modes, whatever on-primary a\n custom primary derives. */\n danger: 'bg-danger-soft text-danger hover:bg-danger hover:text-danger-soft',\n};\n\n/* Pressed (while the pointer or Space/Enter holds the button down): one step past the hover fill.\n The text variant also takes the hover label, so a touch press (no hover) reads the same. The\n `<button>` form guards with `enabled:`, the `a[bfButton]` link with plain `active:` (a link is\n never `:enabled`). Added only while the control can act (not disabled or loading). Under forced\n colours the system colours win, so nothing changes there. */\ntype BfButtonPressedForm = 'button' | 'link';\nconst PRESSED: Record<BfButtonPressedForm, Record<BfButtonVariant, string>> = {\n button: {\n primary: 'enabled:active:bg-primary-pressed',\n tonal: 'enabled:active:bg-primary-soft-pressed',\n outline: 'enabled:active:bg-primary-soft-pressed',\n text: 'enabled:active:bg-primary-soft-pressed enabled:active:text-primary-strong',\n danger: 'enabled:active:bg-danger-pressed enabled:active:text-danger-soft',\n },\n link: {\n primary: 'active:bg-primary-pressed',\n tonal: 'active:bg-primary-soft-pressed',\n outline: 'active:bg-primary-soft-pressed',\n text: 'active:bg-primary-soft-pressed active:text-primary-strong',\n danger: 'active:bg-danger-pressed active:text-danger-soft',\n },\n};\n\n/* Loading is not native `disabled` (that would drop keyboard focus to <body>): the button keeps its\n variant fill and reports itself through `aria-disabled` and `aria-busy`; only the cursor changes. */\ntype BfButtonState = 'idle' | 'loading';\nconst STATE: Record<BfButtonState, string> = {\n idle: 'cursor-pointer',\n loading: 'cursor-progress',\n};\n\n/* Heights 32/40/48 from the design. Under a coarse pointer PILL_HIT extends sm and md to 44 px\n without changing the visual; the outline variant's entry adds its 1.5 px border back. */\nconst SIZE: Record<BfSize, string> = {\n sm: 'h-8 text-label-xs',\n md: 'h-10 text-label-sm',\n lg: 'h-12 text-label',\n};\n\nconst PADDING: Record<BfSize, string> = { sm: 'px-3.5', md: 'px-4.5', lg: 'px-6' };\n\n/* The text variant has no surface, so it gets tighter horizontal padding. */\nconst TEXT_PADDING: Record<BfSize, string> = { sm: 'px-2', md: 'px-3', lg: 'px-3' };\n\n/** The class maps of bf-button, shared with `bf-menu-button` (`@bitforgehq/ui/overlay`) through\n * the internal `ɵBF_BUTTON_CLASSES` export so the two never drift. */\nexport const BUTTON_CLASSES = {\n base: BASE,\n variant: VARIANT,\n pressed: PRESSED.button,\n size: SIZE,\n padding: PADDING,\n textPadding: TEXT_PADDING,\n} as const;\n\n/**\n * Pill-shaped action button with five variants, three sizes, a loading state and icon slots. Put\n * the label in the default slot and icons in the `icon-start` / `icon-end` slots; never place a\n * `bf-button` inside another interactive element. For navigation, put `bfButton` on your own `<a>`\n * (with `href` or `routerLink`): it renders as a real link that looks like the button.\n *\n * @example\n * <bf-button (clicked)=\"save()\">Save changes</bf-button>\n * <bf-button variant=\"tonal\" size=\"sm\" [loading]=\"saving()\">\n * <bf-icon bfSlot=\"icon-start\" [icon]=\"Plus\" />\n * New task\n * </bf-button>\n * <a bfButton variant=\"outline\" routerLink=\"/projects\">All projects</a>\n * @summary Pill-shaped action button with five variants, three sizes and a loading state\n * @category Actions\n * @since 0.1.0\n * @slot icon-start An icon before the label.\n * @slot default The label.\n * @slot icon-end An icon after the label.\n */\n@Component({\n selector: 'bf-button, a[bfButton]',\n imports: [BfSpinnerComponent, NgTemplateOutlet],\n host: { '[class]': 'hostClasses()', '(click)': 'onHostClick($event)' },\n template: `\n @if (isLink) {\n <!-- a[bfButton]: the consumer's <a> is the control; no inner button. -->\n <ng-container *ngTemplateOutlet=\"content\" />\n } @else {\n <button\n [type]=\"type()\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"loading() ? 'true' : null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n [class]=\"classes()\"\n (click)=\"onClick($event)\"\n >\n <ng-container *ngTemplateOutlet=\"content\" />\n </button>\n }\n <ng-template #content>\n @if (loading() && !isLink) {\n <!-- md = 20 px, the default bf-icon size, so the swap keeps the button's width. -->\n <bf-spinner size=\"md\" decorative />\n } @else {\n <ng-content select=\"[bfSlot=icon-start]\" />\n }\n <!-- The label truncates with an ellipsis in a narrow container; the icons keep their size. -->\n <span data-label class=\"max-w-full min-w-0 truncate empty:hidden\"><ng-content /></span>\n <ng-content select=\"[bfSlot=icon-end]\" />\n </ng-template>\n `,\n})\nexport class BfButtonComponent {\n /** Visual style: primary (filled), tonal (soft tint), outline, text, danger. */\n readonly variant = input<BfButtonVariant>('primary');\n /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`controlSize`,\n * `md` by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Native button type. Use `submit` inside a form. Ignored on `a[bfButton]`. */\n readonly type = input<BfButtonType>('button');\n /** Disables the control and swallows clicks. Ignored on `a[bfButton]`: a link is never\n * disabled; render a disabled `bf-button` instead. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Shows a spinner instead of the start icon and blocks activation. The button stays focusable\n * (`aria-disabled` and `aria-busy`, never native `disabled`) and keeps its variant fill. Ignored\n * on `a[bfButton]`. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Stretches the button to its container's width. */\n readonly fullWidth = input(false, { transform: booleanAttribute });\n\n /** Emitted on click while enabled and not loading; on `a[bfButton]`, on every click (the link\n * still navigates). */\n readonly clicked = output<Event>();\n\n private readonly defaults = inject(BF_DEFAULTS);\n /** Whether the host is the consumer's `<a>` (`a[bfButton]`) rather than a `bf-button` element. */\n protected readonly isLink =\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.tagName === 'A';\n /** The size in effect: `size`, else the app's `controlSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.controlSize);\n\n readonly classes = computed(() => {\n const size = this.resolvedSize();\n const variant = this.variant();\n const padding = variant === 'text' ? TEXT_PADDING[size] : PADDING[size];\n const hit = PILL_HIT[size][variant === 'outline' ? 'bordered' : 'plain'];\n const width = this.fullWidth() ? 'w-full' : '';\n const state: BfButtonState = this.loading() && !this.isLink ? 'loading' : 'idle';\n const pressed = this.isLink\n ? PRESSED.link[variant]\n : this.disabled() || this.loading()\n ? ''\n : PRESSED.button[variant];\n return [BASE, VARIANT[variant], pressed, STATE[state], SIZE[size], hit, padding, width]\n .filter(Boolean)\n .join(' ');\n });\n\n /** The host's classes: the whole button on a link, else the wrapper's display and width. A link\n * adds `no-underline!`: important, so an unlayered global rule of the app\n * (`a { text-decoration: underline }`) cannot underline it, as it would beat a layered utility. */\n readonly hostClasses = computed(() => {\n if (this.isLink) {\n return `${this.classes()} no-underline!`;\n }\n return this.fullWidth() ? 'inline-flex max-w-full w-full' : 'inline-flex max-w-full';\n });\n\n /**\n * A click on `a[bfButton]` emits `clicked`; the browser (or `routerLink`) still follows it.\n * @internal\n */\n onHostClick(event: Event): void {\n if (this.isLink) {\n this.clicked.emit(event);\n }\n }\n\n /**\n * The inner button's click: emits `clicked` unless disabled or loading.\n * @internal\n */\n onClick(event: Event): void {\n if (this.loading()) {\n // Still focusable and clickable while loading: cancel the click so a submit button cannot\n // submit its form again.\n event.preventDefault();\n return;\n }\n if (this.disabled()) {\n return;\n }\n this.clicked.emit(event);\n }\n}\n","import { Component, booleanAttribute, computed, inject, input, output } from '@angular/core';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { type BfSize } from '../../config/size';\nimport { PILL_HIT } from '../_shared/hit-classes';\nimport { type BfButtonType } from '../button/button.component';\n\n/**\n * The visual style of a `bf-icon-button`: tonal, primary, outline or text.\n *\n * @summary The four visual styles of an icon button, from tonal to plain text\n * @since 0.1.0\n */\nexport type BfIconButtonVariant = 'tonal' | 'primary' | 'outline' | 'text';\n\nconst BASE =\n 'relative inline-flex shrink-0 cursor-pointer items-center justify-center rounded-control transition-colors duration-150 select-none ' +\n 'focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring ' +\n 'disabled:cursor-not-allowed disabled:bg-surface-sunken disabled:text-text-disabled disabled:border-transparent';\n\nconst VARIANT: Record<BfIconButtonVariant, string> = {\n tonal: 'bg-primary-soft text-primary-strong hover:bg-primary-soft-hover',\n primary: 'bg-primary text-on-primary hover:bg-primary-hover',\n outline:\n 'bg-surface text-text border-[1.5px] border-border-strong hover:border-text-muted focus-visible:border-primary',\n text: 'bg-transparent text-text-muted hover:bg-surface-muted hover:text-text',\n};\n\n/* Pressed: one step past the hover fill (the text variant takes the soft pressed tint and the\n hover icon colour); added only while enabled. */\nconst PRESSED: Record<BfIconButtonVariant, string> = {\n tonal: 'enabled:active:bg-primary-soft-pressed',\n primary: 'enabled:active:bg-primary-pressed',\n outline: 'enabled:active:bg-primary-soft-pressed',\n text: 'enabled:active:bg-primary-soft-pressed enabled:active:text-text',\n};\n\n/* Square boxes 32/40/48. Under a coarse pointer sm and md extend the hit area vertically to 44 px\n (PILL_HIT, as bf-button), so adjacent icon buttons in a toolbar don't overlap horizontally. */\nconst SIZE: Record<BfSize, string> = {\n sm: 'h-8 w-8',\n md: 'h-10 w-10',\n lg: 'h-12 w-12',\n};\n\n/** The class maps of bf-icon-button, shared with `bf-menu-button` (`@bitforgehq/ui/overlay`)\n * through the internal `ɵBF_ICON_BUTTON_CLASSES` export so the two never drift. */\nexport const ICON_BUTTON_CLASSES = {\n base: BASE,\n variant: VARIANT,\n pressed: PRESSED,\n size: SIZE,\n} as const;\n\n/**\n * Round button that holds a single icon, for toolbars, headers and list rows. The `label` is\n * required because the icon alone gives assistive tech no name.\n *\n * @example\n * <bf-icon-button label=\"Search\" (clicked)=\"openSearch()\">\n * <bf-icon [icon]=\"Search\" />\n * </bf-icon-button>\n * @summary Round icon-only button for toolbars and rows, with a required accessible label\n * @category Actions\n * @since 0.1.0\n * @slot default The icon, a `bf-icon`.\n */\n@Component({\n selector: 'bf-icon-button',\n host: { class: 'inline-flex' },\n template: `\n <button\n [type]=\"type()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label()\"\n [class]=\"classes()\"\n (click)=\"onClick($event)\"\n >\n <ng-content />\n </button>\n `,\n})\nexport class BfIconButtonComponent {\n /** Visual style: tonal (soft tint, default), primary, outline, text. */\n readonly variant = input<BfIconButtonVariant>('tonal');\n /** Height step: sm 32, md 40, lg 48 px (square); unset follows `provideBfDefaults()`\n * (`controlSize`, `md` by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Native button type. */\n readonly type = input<BfButtonType>('button');\n /** Disables the control and swallows clicks. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Accessible name announced instead of the icon. */\n readonly label = input.required<string>();\n\n /** Emitted on click while enabled. */\n readonly clicked = output<Event>();\n\n private readonly defaults = inject(BF_DEFAULTS);\n /** The size in effect: `size`, else the app's `controlSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.controlSize);\n\n readonly classes = computed(() => {\n const size = this.resolvedSize();\n const variant = this.variant();\n const hit = PILL_HIT[size][variant === 'outline' ? 'bordered' : 'plain'];\n const pressed = this.disabled() ? '' : PRESSED[variant];\n return [BASE, VARIANT[variant], pressed, SIZE[size], hit].filter(Boolean).join(' ');\n });\n\n /**\n * The inner button's click: emits `clicked` unless disabled.\n * @internal\n */\n onClick(event: Event): void {\n if (this.disabled()) {\n return;\n }\n this.clicked.emit(event);\n }\n}\n","import { Component, computed, input } from '@angular/core';\n\n/**\n * The tone of a `bf-badge`: neutral, primary, success, warning or danger.\n *\n * @summary The five tones of a badge, from neutral counts to danger states\n * @since 0.1.0\n */\nexport type BfBadgeVariant = 'neutral' | 'primary' | 'success' | 'warning' | 'danger';\n\nconst LABEL_BASE =\n 'inline-flex items-center rounded-control px-2.5 py-1.25 text-micro font-bold leading-none';\nconst COUNT_BASE =\n 'inline-flex h-box min-w-box items-center justify-center rounded-control bg-primary px-1.75 text-micro font-bold leading-none text-on-primary';\n\nconst VARIANT: Record<BfBadgeVariant, string> = {\n neutral: 'bg-neutral-soft text-neutral',\n primary: 'bg-primary-soft text-primary-strong',\n success: 'bg-success-soft text-success',\n warning: 'bg-warning-soft text-warning',\n danger: 'bg-danger-soft text-danger',\n};\n\n/**\n * Status label (\"On track\", \"At risk\") or, with `count`, a compact numeric pill for unread counts.\n *\n * @example\n * <bf-badge variant=\"warning\">At risk</bf-badge>\n * <bf-badge [count]=\"unread()\" countLabel=\"unread messages\" />\n * @summary Small status label in semantic tones, or a compact numeric pill for counts\n * @category Data display\n * @since 0.1.0\n * @slot default The badge text, shown when no `count` is set.\n */\n@Component({\n selector: 'bf-badge',\n host: { class: 'inline-flex' },\n template: `\n @if (countText(); as text) {\n <span [class]=\"countClasses\"\n >{{ text }}\n @if (countLabel()) {\n <span class=\"sr-only\"> {{ countLabel() }}</span>\n }\n </span>\n } @else {\n <span [class]=\"classes()\"><ng-content /></span>\n }\n `,\n})\nexport class BfBadgeComponent {\n /** Tint for the label style. Ignored when `count` is set. */\n readonly variant = input<BfBadgeVariant>('neutral');\n /** Switches to the count pill; values above 99 render as \"99+\". */\n readonly count = input<number | undefined>(undefined);\n /** What the count counts (\"unread messages\"), read by assistive tech after the number (\"99+\n * unread messages\"); visually hidden. Only used with `count`. */\n readonly countLabel = input('');\n\n readonly classes = computed(() => `${LABEL_BASE} ${VARIANT[this.variant()]}`);\n readonly countText = computed(() => {\n const c = this.count();\n return c === undefined ? null : c > 99 ? '99+' : String(c);\n });\n readonly countClasses = COUNT_BASE;\n}\n","import {\n DOCUMENT,\n type Signal,\n type WritableSignal,\n computed,\n inject,\n linkedSignal,\n signal,\n} from '@angular/core';\n\n/*\n * Holds a layout-changing value (a field's error message) while a pointer button is down.\n *\n * A field is marked touched on blur, and a mouse press on another control (the form's Save button)\n * blurs it on mousedown. Showing the new error text right then pushes everything below the field\n * down by a line (about 22 px), so the mouseup lands off the button and its click is lost. While a\n * pointer is pressed anywhere in the document the held value keeps what it showed at the press;\n * it catches up one task after the release (after the click that release makes), or at once on\n * the first key press or button-less pointer move, in case the release never reached the page (a\n * native select's picker, a drag out of the window).\n */\n\n/** Per document: whether a pointer button is held down. */\nconst PRESSED = new WeakMap<Document, WritableSignal<boolean>>();\n\nfunction pointerPressed(doc: Document): Signal<boolean> {\n const known = PRESSED.get(doc);\n if (known) {\n return known;\n }\n const pressed = signal(false);\n PRESSED.set(doc, pressed);\n const view = doc.defaultView;\n // Server renders (no window) and non-DOM documents never hold.\n if (!view || typeof doc.addEventListener !== 'function') {\n return pressed;\n }\n const options: AddEventListenerOptions = { capture: true, passive: true };\n // A task later, so the click the release makes is dispatched before the layout moves.\n const release = (): void => {\n view.setTimeout(() => pressed.set(false));\n };\n // The primary mouse button, a touch or a pen: a right-click's context menu can swallow the\n // release, so it never starts a hold.\n doc.addEventListener(\n 'pointerdown',\n (event) => {\n if (event.button === 0 || event.pointerType === 'touch' || event.pointerType === 'pen') {\n pressed.set(true);\n }\n },\n options,\n );\n doc.addEventListener('pointerup', release, options);\n doc.addEventListener('pointercancel', release, options);\n doc.addEventListener('keydown', () => pressed.set(false), options);\n doc.addEventListener(\n 'pointermove',\n (event) => {\n if (event.buttons === 0 && pressed()) {\n pressed.set(false);\n }\n },\n options,\n );\n view.addEventListener('blur', release);\n return pressed;\n}\n\n/** A message paragraph that never moves the layout under a pressed pointer. */\nexport interface HeldMessage {\n /** The text to render: the current one, else (while pressed) the one still on screen. */\n readonly text: Signal<string>;\n /** Render it visually hidden (`sr-only`): a new message that arrived during the press. It is in\n * the DOM at once, so the ids that point at it resolve and assistive tech reads it; it becomes\n * visible, as the same element, once the press ends. */\n readonly hidden: Signal<boolean>;\n}\n\n/**\n * The paragraph state for a message `source` (an error text) under `heldWhilePressed`: a message\n * that appears during a press renders at once but visually hidden; one that disappears stays\n * visible until the press ends. Call it in an injection context.\n */\nexport function heldMessage(source: () => string): HeldMessage {\n const shown = heldWhilePressed(source);\n // Both read `shown` first, every time: a linkedSignal only remembers the values it was read\n // at, so skipping it while `source` is set would lose the text to hold when it disappears.\n return {\n text: computed(() => {\n const held = shown();\n return source() || held;\n }),\n hidden: computed(() => {\n const held = shown();\n return !held && Boolean(source());\n }),\n };\n}\n\n/**\n * `source`, except that while a pointer button is held down anywhere in the document it keeps the\n * value it had when the press began, and catches up once the press ends. Call it in an injection\n * context (a component field initializer).\n */\nexport function heldWhilePressed<T>(source: () => T): Signal<T> {\n const pressed = pointerPressed(inject(DOCUMENT));\n return linkedSignal<{ value: T; pressed: boolean }, T>({\n source: () => ({ value: source(), pressed: pressed() }),\n computation: (next, previous) => (next.pressed && previous ? previous.value : next.value),\n }).asReadonly();\n}\n","import { Component, booleanAttribute, computed, input } from '@angular/core';\nimport { heldMessage } from '../_shared/pointer-hold';\n\n/**\n * Label, help text and error text around a form control, with the id wiring assistive tech needs.\n * The form widgets use it internally; use it directly only to dress a custom control the same way.\n *\n * @example\n * <bf-field #field label=\"Project name\" helpText=\"Shown to your team\" controlId=\"project\">\n * <input id=\"project\" [class]=\"controlClass\" [attr.aria-describedby]=\"field.describedBy()\" />\n * </bf-field>\n * @summary Label, help text and error text wrapper that wires ids for assistive tech\n * @category Forms\n * @since 0.1.0\n * @slot default The control the field labels, such as a native input styled with `bfFieldControlClass`.\n */\n@Component({\n selector: 'bf-field',\n host: { class: 'block' },\n // Label, help and error text break long words anywhere (a German or Finnish compound in a narrow\n // column) instead of running past the field's edge.\n template: `\n <div class=\"group/bf-field flex flex-col gap-1.5\">\n @if (label()) {\n <label\n [for]=\"controlId()\"\n class=\"text-caption text-text-muted group-focus-within/bf-field:text-primary-text wrap-anywhere\"\n [class.text-text-disabled]=\"disabled()\"\n >\n {{ label() }}\n @if (required()) {\n <span class=\"text-danger\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n <ng-content />\n @if (helpText()) {\n <p [id]=\"helpId()\" class=\"text-text-muted text-micro wrap-anywhere\">{{ helpText() }}</p>\n }\n @if (message.text(); as text) {\n <p\n [id]=\"errorId()\"\n class=\"text-danger text-micro wrap-anywhere\"\n [class.sr-only]=\"message.hidden()\"\n >\n {{ text }}\n </p>\n }\n </div>\n `,\n})\nexport class BfFieldComponent {\n /** Visible label; rendered as a `<label for>` pointing at `controlId`. */\n readonly label = input('');\n /** Helper text under the control; stays while `error` is shown. */\n readonly helpText = input('');\n /** Error text under the help text. One that appears while a pointer button is held down (the\n * press on a Save button that blurred the field) renders visually hidden until the press ends,\n * so assistive tech has it at once and the layout never moves under the pointer between\n * mousedown and mouseup. */\n readonly error = input('');\n /** Adds the required marker to the label. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Dims the label; the control carries its own disabled styling. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** The id of the control inside the default slot. */\n readonly controlId = input.required<string>();\n\n readonly helpId = computed(() => `${this.controlId()}-help`);\n readonly errorId = computed(() => `${this.controlId()}-error`);\n /** The error paragraph: `error`, visually hidden while a press holds the layout. */\n protected readonly message = heldMessage(this.error);\n /** Value for the control's `aria-describedby`: the help id and the error id, each while it is\n * set (`\"<id>-help <id>-error\"`), else null; the paragraphs render whenever they are named. */\n readonly describedBy = computed(() => {\n const ids = [this.helpText() ? this.helpId() : '', this.error() ? this.errorId() : ''].filter(\n Boolean,\n );\n return ids.length > 0 ? ids.join(' ') : null;\n });\n}\n","import type { BfSize } from '../../config/size';\n\n/* Class maps of the single-line text fields (bf-input, bf-select, and bf-number-input from 0.3):\n one BfSize step each, in logical (RTL-ready) utilities. */\n\n/** Field box: height and type per step (32 / 40 / 48 px). */\nexport const FIELD_BOX: Record<BfSize, string> = {\n sm: 'h-8 text-label-xs',\n md: 'h-10 text-label-sm',\n lg: 'h-12 text-label',\n};\n\n/** Inline-start padding of the text, without and with an `icon-start` slot. */\nexport const FIELD_PADDING_START: Record<BfSize, Record<'text' | 'icon', string>> = {\n sm: { text: 'ps-3', icon: 'ps-9' },\n md: { text: 'ps-3.5', icon: 'ps-10' },\n lg: { text: 'ps-4', icon: 'ps-11' },\n};\n\n/** Inline-end padding of the text, without and with an `icon-end` slot. */\nexport const FIELD_PADDING_END: Record<BfSize, Record<'text' | 'icon', string>> = {\n sm: { text: 'pe-3', icon: 'pe-9' },\n md: { text: 'pe-3.5', icon: 'pe-10' },\n lg: { text: 'pe-4', icon: 'pe-11' },\n};\n\n/** Inset of the `icon-start` slot from the field's inline-start edge. */\nexport const FIELD_ICON_START: Record<BfSize, string> = {\n sm: 'start-3',\n md: 'start-3.5',\n lg: 'start-4',\n};\n\n/** Inset of the `icon-end` slot from the field's inline-end edge. */\nexport const FIELD_ICON_END: Record<BfSize, string> = {\n sm: 'end-3',\n md: 'end-3.5',\n lg: 'end-4',\n};\n\n/** Box of a text-entry control: shape, border width, surface, focus ring and the native states. */\nexport const FIELD_CONTROL_BASE =\n 'block w-full rounded-field border bg-surface text-text placeholder:text-text-muted ' +\n 'transition-colors focus:outline-hidden focus:border-primary focus:ring-2 focus:ring-ring ' +\n 'read-only:bg-surface-muted disabled:cursor-not-allowed disabled:border-surface-sunken disabled:bg-surface-muted disabled:text-text-disabled';\n\n/**\n * The field state `bfFieldControlClass` styles a control for.\n *\n * @summary The size and state a custom field control is styled for by bfFieldControlClass\n * @since 0.3.0\n */\nexport interface BfFieldControlState {\n /** Height step: sm 32, md 40, lg 48 px, as `bf-input`'s `size`. */\n size: BfSize;\n /** Whether the control shows its error state (the danger border). */\n invalid: boolean;\n /** Whether the control is disabled; set the control's native `disabled` too. */\n disabled: boolean;\n /** Whether the control is read-only; set the control's native `readonly` too. */\n readonly: boolean;\n}\n\n/**\n * The class list `bf-input` puts on its native `<input>`, for a custom control inside `bf-field`\n * (a native input with a mask, a combobox, a date picker's text box) that must look like the\n * library's own fields: the same box, height and type per `size`, padding, focus ring and border,\n * with the danger border while `invalid`. The disabled and read-only styles come from the\n * control's native `disabled` / `readonly` attributes (`:disabled`, `:read-only`), so set those on\n * the control as well; the class list is the one `bf-input` renders in the same state.\n *\n * @example\n * <input [class]=\"controlClass()\" [id]=\"id\" [attr.aria-describedby]=\"field.describedBy()\" />\n * @param state The size and state to style the control for.\n * @returns The class list, as one string for `[class]`.\n * @summary The class list that makes a custom control look like a library text field\n * @since 0.3.0\n */\nexport function bfFieldControlClass(state: BfFieldControlState): string {\n return [\n FIELD_CONTROL_BASE,\n FIELD_BOX[state.size],\n FIELD_PADDING_START[state.size].text,\n FIELD_PADDING_END[state.size].text,\n state.invalid ? 'border-danger-border' : 'border-border-strong',\n ].join(' ');\n}\n","import type { ValidationError } from '@angular/forms/signals';\nimport { bfValidationMessage, type BfValidationMessages } from '../../config/validation-messages';\n\n/** An error as a field reads it: its kind and optional message; limit fields (`minLength`,\n * `context.requiredLength`, …) are read through type guards by `bfValidationMessage`. */\nexport type FieldErrorLike = Pick<ValidationError, 'kind' | 'message'>;\n\n/**\n * Explicit error message wins; otherwise, once the field was touched, the first form error's text:\n * its own `message`, else the default for its kind from `messages` (`BF_LABELS.validation`).\n */\nexport function fieldErrorText(\n errorMessage: string,\n touched: boolean,\n errors: readonly FieldErrorLike[],\n messages: BfValidationMessages,\n): string {\n if (errorMessage) {\n return errorMessage;\n }\n const first = errors[0];\n return touched && first ? bfValidationMessage(first, messages) : '';\n}\n\n/** The visual error state: any error text, or a field the form marked invalid after it was touched. */\nexport function fieldShowsError(errorText: string, invalid: boolean, touched: boolean): boolean {\n return Boolean(errorText) || (invalid && touched);\n}\n\n/**\n * `aria-describedby` targets: the help paragraph and the error paragraph under it, each while it\n * is rendered (`\"<id>-help <id>-error\"`, `\"<id>-help\"`, `\"<id>-error\"`), else none.\n */\nexport function fieldDescribedBy(id: string, errorText: string, helpText: string): string | null {\n const ids = [helpText ? `${id}-help` : '', errorText ? `${id}-error` : ''].filter(Boolean);\n return ids.length > 0 ? ids.join(' ') : null;\n}\n\n/** `aria-errormessage` target: the error paragraph while the control is invalid, else none. */\nexport function fieldErrorMessageId(\n id: string,\n errorText: string,\n showError: boolean,\n): string | null {\n return showError && errorText ? `${id}-error` : null;\n}\n","let counter = 0;\n\n/**\n * Returns a document-unique id such as `bf-input-3`, for associating labels and hints with controls.\n *\n * The ids come from this module-level counter, so a server render and the client (or two server\n * renders in one process) number them differently: `@bitforgehq/ui` 0.x is client-rendered only,\n * and SSR, hydration and prerendering of pages that render its components are not supported.\n * Hydration-stable ids are decided before 1.0.\n */\nexport function uniqueId(prefix: string): string {\n counter += 1;\n return `${prefix}-${counter}`;\n}\n","import {\n Component,\n type ElementRef,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n viewChild,\n inject,\n} from '@angular/core';\nimport { type FormValueControl, type ValidationError } from '@angular/forms/signals';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { BF_LABELS } from '../../config/labels';\nimport { type BfSize } from '../../config/size';\nimport {\n FIELD_BOX,\n FIELD_CONTROL_BASE,\n FIELD_ICON_END,\n FIELD_ICON_START,\n FIELD_PADDING_END,\n FIELD_PADDING_START,\n} from '../_shared/field-classes';\nimport {\n fieldDescribedBy,\n fieldErrorMessageId,\n fieldErrorText,\n fieldShowsError,\n} from '../_shared/field-state';\nimport { uniqueId } from '../_shared/unique-id';\nimport { BfFieldComponent } from '../field/field.component';\n\n/**\n * The native `type` of a `bf-input`; the value stays a string (for numbers, use `bf-number-input`).\n *\n * @summary The native input types a text field supports, all bound as strings\n * @since 0.1.0\n */\nexport type BfInputType =\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'url'\n | 'search'\n | 'date'\n | 'time'\n | 'datetime-local'\n | 'month';\n/** Regex flags the native `pattern` attribute can express (it always compiles with `v`). */\nconst NATIVE_PATTERN_FLAGS = new Set(['', 'u', 'v']);\n\n/**\n * Native `inputmode`: the virtual keyboard a phone shows.\n *\n * @summary The virtual keyboards a phone can show for a text field\n * @since 0.2.0\n */\nexport type BfInputMode =\n 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';\n/**\n * Native `enterkeyhint`: the label of the virtual keyboard's Enter key.\n *\n * @summary The labels a phone keyboard can put on its Enter key\n * @since 0.2.0\n */\nexport type BfEnterKeyHint = 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send';\n/**\n * Native `autocapitalize`: how a virtual keyboard capitalises typed text.\n *\n * @summary How a phone keyboard capitalises the text typed into a field\n * @since 0.2.0\n */\nexport type BfAutocapitalize = 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters';\n/**\n * The `inputMode` of a `bf-input`: a `BfInputMode`, or `''` (the default) to leave the native\n * `inputmode` off.\n *\n * @summary A text field's virtual keyboard setting, a keyboard or empty to leave it off\n * @since 0.3.0\n */\nexport type BfInputInputMode = BfInputMode | '';\n/**\n * The `enterKeyHint` of a `bf-input` or `bf-number-input`: a `BfEnterKeyHint`, or `''` (the\n * default) to leave the native `enterkeyhint` off.\n *\n * @summary A field's Enter key label setting, a label or empty to leave it off\n * @since 0.3.0\n */\nexport type BfInputEnterKeyHint = BfEnterKeyHint | '';\n/**\n * The `autocapitalize` of a `bf-input`: a `BfAutocapitalize`, or `''` (the default) to leave the\n * native `autocapitalize` off.\n *\n * @summary A text field's capitalisation setting, a mode or empty to leave it off\n * @since 0.3.0\n */\nexport type BfInputAutocapitalize = BfAutocapitalize | '';\n/**\n * The height step of a text field; the same scale as every sized widget.\n *\n * @deprecated 0.3.0 use BfSize; removed in 1.0.0\n * @summary Former name of the shared size scale for text fields, kept until 1.0.0\n * @since 0.1.0\n */\nexport type BfFieldSize = BfSize;\n\n/**\n * Single-line text field with label, help and error text, icon slots and Signal Forms binding.\n * Bind `[(value)]` directly or `[formField]` from a signal form; the field state (touched,\n * invalid, errors, disabled, readonly, required) flows in through the matching inputs.\n *\n * @example\n * <bf-input label=\"Email\" type=\"email\" placeholder=\"name@company.ch\" [(value)]=\"email\" />\n * <bf-input label=\"Email\" [formField]=\"signup.email\" />\n * @summary Single-line text field with label, help and error text, icon slots and Signal Forms binding\n * @category Forms\n * @since 0.1.0\n * @slot icon-start An icon inside the field, before the text.\n * @slot icon-end An icon inside the field, after the text.\n */\n@Component({\n selector: 'bf-input',\n imports: [BfFieldComponent],\n host: { class: 'block', '[attr.id]': 'null' },\n template: `\n <bf-field\n [label]=\"label()\"\n [helpText]=\"helpText()\"\n [error]=\"errorText()\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n [controlId]=\"id()\"\n >\n <div class=\"relative\">\n @if (iconStart()) {\n <span [class]=\"iconStartClasses()\">\n <ng-content select=\"[bfSlot=icon-start]\" />\n </span>\n }\n <input\n #el\n [id]=\"id()\"\n [type]=\"type()\"\n [name]=\"name()\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.maxlength]=\"maxLength() ?? null\"\n [attr.minlength]=\"minLength() ?? null\"\n [attr.min]=\"min() ?? null\"\n [attr.max]=\"max() ?? null\"\n [attr.step]=\"step() ?? null\"\n [attr.pattern]=\"patternAttr()\"\n [attr.inputmode]=\"inputMode() || null\"\n [attr.enterkeyhint]=\"enterKeyHint() || null\"\n [attr.spellcheck]=\"spellcheckAttr()\"\n [attr.autocapitalize]=\"autocapitalize() || null\"\n [attr.aria-label]=\"ariaLabelAttr()\"\n [attr.aria-labelledby]=\"ariaLabelledbyAttr()\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-errormessage]=\"errorMessageId()\"\n [class]=\"classes()\"\n (input)=\"value.set(el.value); changed.emit(el.value)\"\n (focus)=\"focused.emit($event)\"\n (blur)=\"onBlur($event)\"\n />\n @if (iconEnd()) {\n <span [class]=\"iconEndClasses()\">\n <ng-content select=\"[bfSlot=icon-end]\" />\n </span>\n }\n </div>\n </bf-field>\n `,\n})\nexport class BfInputComponent implements FormValueControl<string> {\n /** The text value; two-way bindable and bound by `[formField]`. */\n readonly value = model('');\n /** Native input type; the value stays a string. For numbers use `bf-number-input`, which binds\n * `number | null`. */\n readonly type = input<BfInputType>('text');\n /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`fieldSize`, `md`\n * by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Visible label above the control. */\n readonly label = input('');\n /**\n * Accessible name when no visible label is rendered (e.g. a search field). Ignored when `label`\n * is set.\n */\n readonly ariaLabel = input('');\n /**\n * Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when\n * `label` is set.\n */\n readonly ariaLabelledby = input('');\n /** Example value shown while empty. */\n readonly placeholder = input('');\n /** Helper text under the control. */\n readonly helpText = input('');\n /** Explicit error text; takes precedence over Signal Forms errors. */\n readonly errorMessage = input('');\n /** Disables the control. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Makes the control read-only. */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Marks the control required (label marker and native attribute). */\n readonly required = input(false, { transform: booleanAttribute });\n /** Field validity from Signal Forms. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Whether the user has left the field; errors show only once touched. */\n readonly touched = input(false, { transform: booleanAttribute });\n /** Validation errors from Signal Forms; the first message is shown once touched. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /** Native name attribute. */\n readonly name = input('');\n /** Control id; generated when not set. */\n readonly id = input(uniqueId('bf-input'));\n /** Reserve space for an icon in the `icon-start` slot. */\n readonly iconStart = input(false, { transform: booleanAttribute });\n /** Reserve space for an icon in the `icon-end` slot. */\n readonly iconEnd = input(false, { transform: booleanAttribute });\n /** Native autocomplete hint. */\n readonly autocomplete = input('');\n /** Maximum number of characters (native `maxlength`); bound by Signal Forms `maxLength()`. */\n readonly maxLength = input<number | undefined>(undefined);\n /** Minimum number of characters (native `minlength`); bound by Signal Forms `minLength()`. */\n readonly minLength = input<number | undefined>(undefined);\n /** Lowest value (native `min`), e.g. `2026-01-01` for a date or `0` for a number. */\n readonly min = input<string | undefined>(undefined);\n /** Highest value (native `max`), e.g. `2026-12-31` for a date or `100` for a number. */\n readonly max = input<string | undefined>(undefined);\n /** Step between valid values (native `step`), e.g. `0.5` or `any`. */\n readonly step = input<string | number | undefined>(undefined);\n /**\n * Patterns from Signal Forms `pattern()`; exactly one, with no flags or only `u`/`v`, is rendered\n * as the native `pattern`.\n */\n readonly pattern = input<readonly RegExp[]>([]);\n /** Virtual keyboard to show (native `inputmode`). */\n readonly inputMode = input<BfInputInputMode>('');\n /** Label of the virtual keyboard's Enter key (native `enterkeyhint`). */\n readonly enterKeyHint = input<BfInputEnterKeyHint>('');\n /** Spell checking on or off (native `spellcheck`); the browser decides while unset. */\n readonly spellcheck = input<boolean | undefined>(undefined);\n /** Capitalisation of typed text on virtual keyboards (native `autocapitalize`). */\n readonly autocapitalize = input<BfInputAutocapitalize>('');\n\n /** Emitted with the new text right after the user changes it (each keystroke or paste). */\n readonly changed = output<string>();\n /** Emitted when the control gains focus. */\n readonly focused = output<FocusEvent>();\n /** Emitted when the control loses focus. */\n readonly blurred = output<FocusEvent>();\n /** Emitted on blur so Signal Forms marks the field touched. */\n readonly touch = output<void>();\n\n private readonly el = viewChild.required<ElementRef<HTMLInputElement>>('el');\n\n private readonly labels = inject(BF_LABELS);\n private readonly defaults = inject(BF_DEFAULTS);\n\n /** The size in effect: `size`, else the app's `fieldSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.fieldSize);\n readonly iconStartClasses = computed(\n () =>\n `text-text-subtle pointer-events-none absolute inset-y-0 flex items-center ${FIELD_ICON_START[this.resolvedSize()]}`,\n );\n readonly iconEndClasses = computed(\n () =>\n `text-text-subtle absolute inset-y-0 flex items-center ${FIELD_ICON_END[this.resolvedSize()]}`,\n );\n\n readonly errorText = computed(() =>\n fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation),\n );\n readonly showError = computed(() =>\n fieldShowsError(this.errorText(), this.invalid(), this.touched()),\n );\n readonly describedBy = computed(() =>\n fieldDescribedBy(this.id(), this.errorText(), this.helpText()),\n );\n /** `aria-errormessage`: the error paragraph while `aria-invalid` is set. */\n readonly errorMessageId = computed(() =>\n fieldErrorMessageId(this.id(), this.errorText(), this.showError()),\n );\n /**\n * `aria-label` value: only when there is no visible label, so the label stays the sole accessible\n * name.\n */\n readonly ariaLabelAttr = computed(() => (this.label() ? null : this.ariaLabel() || null));\n /** `aria-labelledby` value, under the same rule as `ariaLabelAttr`. */\n readonly ariaLabelledbyAttr = computed(() =>\n this.label() ? null : this.ariaLabelledby() || null,\n );\n /**\n * Native `pattern`: only an unambiguous single pattern whose flags HTML can honour (none, `u` or\n * `v`; the browser compiles it anchored in `v` mode). Several patterns, or flags such as `i`,\n * are validated by the form alone, so the native check never rejects a value the form accepts.\n */\n readonly patternAttr = computed(() => {\n const patterns = this.pattern();\n const only = patterns.length === 1 ? patterns[0] : undefined;\n return only && NATIVE_PATTERN_FLAGS.has(only.flags) ? only.source : null;\n });\n readonly spellcheckAttr = computed(() => {\n const spellcheck = this.spellcheck();\n return spellcheck === undefined ? null : String(spellcheck);\n });\n readonly classes = computed(() => {\n const size = this.resolvedSize();\n return [\n FIELD_CONTROL_BASE,\n FIELD_BOX[size],\n FIELD_PADDING_START[size][this.iconStart() ? 'icon' : 'text'],\n FIELD_PADDING_END[size][this.iconEnd() ? 'icon' : 'text'],\n this.showError() ? 'border-danger-border' : 'border-border-strong',\n ].join(' ');\n });\n\n /**\n * Focuses the native input; Signal Forms calls it from `focusBoundControl()`.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n this.el().nativeElement.focus(options);\n }\n\n /**\n * Marks the field touched and emits `blurred`.\n * @internal\n */\n onBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n this.touch.emit();\n }\n}\n","import {\n Component,\n DOCUMENT,\n type ElementRef,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n viewChild,\n inject,\n} from '@angular/core';\nimport { type FormValueControl, type ValidationError } from '@angular/forms/signals';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { BF_LABELS } from '../../config/labels';\nimport { type BfSize } from '../../config/size';\nimport {\n fieldDescribedBy,\n fieldErrorMessageId,\n fieldErrorText,\n fieldShowsError,\n} from '../_shared/field-state';\nimport { uniqueId } from '../_shared/unique-id';\nimport { BfFieldComponent } from '../field/field.component';\n\nconst BASE =\n 'block w-full rounded-field border bg-surface text-text placeholder:text-text-muted ' +\n 'transition-colors focus:outline-hidden focus:border-primary focus:ring-2 focus:ring-ring ' +\n 'read-only:bg-surface-muted disabled:cursor-not-allowed disabled:border-surface-sunken disabled:bg-surface-muted disabled:text-text-disabled';\n\n/* A textarea has no fixed height (rows and autoResize set it), so a step sets padding and type. */\nconst SIZE: Record<BfSize, string> = {\n sm: 'px-3 py-1.5 text-label-xs',\n md: 'px-3.5 py-2 text-label-sm',\n lg: 'px-4 py-3 text-label leading-6', // multi-line text keeps 24 px lines (the forms-plugin line-height it had)\n};\n/* Auto-resize: sized to the content, between the bounds the host's custom properties carry (an\n unset one leaves its side unbounded); scrolls past the upper one. */\nconst GROWING =\n 'field-sizing-content resize-none overflow-y-auto [min-block-size:var(--bf-textarea-min-block-size)] [max-block-size:var(--bf-textarea-max-block-size)]';\n/* What a box of `n` lines adds to `n lh`: its block padding (read from the step's own `py-*`\n class in SIZE, one spacing step is 0.25rem, so the two can never drift) plus the 1 px border on\n both sides. */\nfunction blockChrome(size: BfSize): string {\n const step = /(?:^|\\s)py-(\\d+(?:\\.\\d+)?)(?:\\s|$)/.exec(SIZE[size])?.[1];\n return `${Number(step ?? 0) * 0.5}rem + 2px`;\n}\n\n/** `CSS.supports('field-sizing', 'content')` in `view`, false without a window or `CSS.supports`. */\nfunction supportsFieldSizing(view: (Window & typeof globalThis) | null): boolean {\n const css = view?.CSS;\n return typeof css?.supports === 'function' && css.supports('field-sizing', 'content');\n}\n\n/**\n * Multi-line text field with the same chrome and Signal Forms binding as `bf-input`.\n *\n * @example\n * <bf-textarea label=\"Notes\" [rows]=\"4\" [(value)]=\"notes\" />\n * @summary Multi-line text field with label, help and error text, and Signal Forms binding\n * @category Forms\n * @since 0.1.0\n */\n@Component({\n selector: 'bf-textarea',\n imports: [BfFieldComponent],\n // The auto-resize bounds are custom properties on the host, which the textarea's classes read.\n host: {\n class: 'block',\n '[attr.id]': 'null',\n '[style.--bf-textarea-min-block-size]': 'minBlockSize()',\n '[style.--bf-textarea-max-block-size]': 'maxBlockSize()',\n },\n template: `\n <bf-field\n [label]=\"label()\"\n [helpText]=\"helpText()\"\n [error]=\"errorText()\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n [controlId]=\"id()\"\n >\n <textarea\n #el\n [id]=\"id()\"\n [name]=\"name()\"\n [value]=\"value()\"\n [rows]=\"rows()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [attr.maxlength]=\"maxLength() ?? null\"\n [attr.minlength]=\"minLength() ?? null\"\n [attr.aria-label]=\"ariaLabelAttr()\"\n [attr.aria-labelledby]=\"ariaLabelledbyAttr()\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-errormessage]=\"errorMessageId()\"\n [class]=\"classes()\"\n (input)=\"value.set(el.value); changed.emit(el.value)\"\n (focus)=\"focused.emit($event)\"\n (blur)=\"onBlur($event)\"\n ></textarea>\n </bf-field>\n `,\n})\nexport class BfTextareaComponent implements FormValueControl<string> {\n /** The text value; two-way bindable and bound by `[formField]`. */\n readonly value = model('');\n /** Padding and type step: sm, md, lg (a textarea's height comes from `rows`); unset follows\n * `provideBfDefaults()` (`fieldSize`, `md` by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Visible label above the control. */\n readonly label = input('');\n /**\n * Accessible name when no visible label is rendered (e.g. an inline comment box). Ignored when\n * `label` is set.\n */\n readonly ariaLabel = input('');\n /**\n * Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when\n * `label` is set.\n */\n readonly ariaLabelledby = input('');\n /** Example value shown while empty. */\n readonly placeholder = input('');\n /** Helper text under the control. */\n readonly helpText = input('');\n /** Explicit error text; takes precedence over Signal Forms errors. */\n readonly errorMessage = input('');\n /** Disables the control. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Makes the control read-only. */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Marks the control required. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Field validity from Signal Forms. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Whether the user has left the field. */\n readonly touched = input(false, { transform: booleanAttribute });\n /** Validation errors from Signal Forms. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /** Native name attribute. */\n readonly name = input('');\n /** Control id; generated when not set. */\n readonly id = input(uniqueId('bf-textarea'));\n /** Visible rows; with `autoResize`, the rows the empty box starts at. */\n readonly rows = input(3);\n /** Grows with the content (CSS `field-sizing: content`) from `rows` up to `maxRows`. Where the\n * browser has no `field-sizing` it keeps the fixed `rows`. */\n readonly autoResize = input(false, { transform: booleanAttribute });\n /** With `autoResize`, the rows the box grows to at most; past them it scrolls. Unset, it grows\n * without a bound. */\n readonly maxRows = input<number | undefined>(undefined);\n /** Maximum number of characters (native `maxlength`); bound by Signal Forms `maxLength()`. */\n readonly maxLength = input<number | undefined>(undefined);\n /** Minimum number of characters (native `minlength`); bound by Signal Forms `minLength()`. */\n readonly minLength = input<number | undefined>(undefined);\n\n /** Emitted with the new text right after the user changes it (each keystroke or paste). */\n readonly changed = output<string>();\n /** Emitted when the control gains focus. */\n readonly focused = output<FocusEvent>();\n /** Emitted when the control loses focus. */\n readonly blurred = output<FocusEvent>();\n /** Emitted on blur so Signal Forms marks the field touched. */\n readonly touch = output<void>();\n\n private readonly el = viewChild.required<ElementRef<HTMLTextAreaElement>>('el');\n\n private readonly labels = inject(BF_LABELS);\n private readonly defaults = inject(BF_DEFAULTS);\n /** The size in effect: `size`, else the app's `fieldSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.fieldSize);\n /** Whether the browser sizes a field to its content; read once. False on the server and where\n * `CSS.supports` is missing, so the box keeps its fixed `rows` there. */\n private readonly fieldSizing = supportsFieldSizing(inject(DOCUMENT).defaultView);\n /** Auto-resize in effect: asked for, and the browser can do it. */\n private readonly growing = computed(() => this.autoResize() && this.fieldSizing);\n /** The height of `n` lines of this step, padding and border included. */\n private blockSize(lines: number): string {\n return `calc(${lines}lh + ${blockChrome(this.resolvedSize())})`;\n }\n /** While growing: the empty box is as tall as `rows` lines. */\n protected readonly minBlockSize = computed(() =>\n this.growing() ? this.blockSize(this.rows()) : null,\n );\n /** While growing with `maxRows`: it stops at `maxRows` lines. */\n protected readonly maxBlockSize = computed(() => {\n const max = this.maxRows();\n return this.growing() && max !== undefined ? this.blockSize(max) : null;\n });\n\n readonly errorText = computed(() =>\n fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation),\n );\n readonly showError = computed(() =>\n fieldShowsError(this.errorText(), this.invalid(), this.touched()),\n );\n readonly describedBy = computed(() =>\n fieldDescribedBy(this.id(), this.errorText(), this.helpText()),\n );\n /** `aria-errormessage`: the error paragraph while `aria-invalid` is set. */\n readonly errorMessageId = computed(() =>\n fieldErrorMessageId(this.id(), this.errorText(), this.showError()),\n );\n /**\n * `aria-label` value: only when there is no visible label, so the label stays the sole accessible\n * name.\n */\n readonly ariaLabelAttr = computed(() => (this.label() ? null : this.ariaLabel() || null));\n /** `aria-labelledby` value, under the same rule as `ariaLabelAttr`. */\n readonly ariaLabelledbyAttr = computed(() =>\n this.label() ? null : this.ariaLabelledby() || null,\n );\n readonly classes = computed(() =>\n [\n BASE,\n SIZE[this.resolvedSize()],\n this.showError() ? 'border-danger-border' : 'border-border-strong',\n this.growing() ? GROWING : 'resize-y',\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n /**\n * Focuses the native textarea; Signal Forms calls it from `focusBoundControl()`.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n this.el().nativeElement.focus(options);\n }\n\n /**\n * Marks the field touched and emits `blurred`.\n * @internal\n */\n onBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n this.touch.emit();\n }\n}\n","/**\n * Equality that matches a bound value to an option's value (`compareWith` of the choice controls).\n * Called as `compareWith(optionValue, value)`: the option's value first, the bound value second.\n *\n * @summary Equality of choice values, for options that are objects rather than primitives\n * @since 0.3.0\n */\nexport type BfCompareWith<T> = (optionValue: T, value: T) => boolean;\n\n/**\n * Index of the option whose value matches `value` under `compare`; `-1` for `null` (nothing\n * selected) or a value no option matches. An option whose value is `null` therefore never shows as\n * selected.\n */\nexport function choiceIndex<T>(\n options: readonly { readonly value: T }[],\n value: T | null,\n compare: BfCompareWith<T>,\n): number {\n return value === null ? -1 : options.findIndex((option) => compare(option.value, value));\n}\n\n/**\n * The native `value` of an option (`<option>`, radio): `String(value)` for a string, number or\n * boolean, so native reads, form posts and browser tests see the real value; the option index for\n * anything else (objects). The controls map a choice back by position, never by this key, so\n * duplicate keys still resolve to the right option.\n */\nexport function choiceKey(value: unknown, index: number): string {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'\n ? String(value)\n : String(index);\n}\n","import {\n Component,\n type ElementRef,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n viewChild,\n inject,\n} from '@angular/core';\nimport { type FormValueControl, type ValidationError } from '@angular/forms/signals';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { BF_LABELS } from '../../config/labels';\nimport { type BfSize } from '../../config/size';\nimport { type BfCompareWith, choiceIndex, choiceKey } from '../_shared/choice';\nimport { FIELD_BOX, FIELD_PADDING_START } from '../_shared/field-classes';\nimport {\n fieldDescribedBy,\n fieldErrorMessageId,\n fieldErrorText,\n fieldShowsError,\n} from '../_shared/field-state';\nimport { uniqueId } from '../_shared/unique-id';\nimport { BfFieldComponent } from '../field/field.component';\n\n/**\n * One choice of `bf-select`; `value` is any type (a string by default).\n *\n * @summary One choice of a select with its value, its label and a disabled flag\n * @since 0.1.0\n */\nexport interface BfSelectOption<T = string> {\n /** The value the select's `value` takes when this option is chosen. */\n value: T;\n /** The text of the native `option`. */\n label: string;\n /** Whether this option cannot be chosen. */\n disabled?: boolean;\n}\n\nconst BASE =\n 'block w-full appearance-none rounded-field border bg-none text-text ' +\n 'transition-colors focus:outline-hidden focus:border-primary focus:ring-2 focus:ring-ring ' +\n 'disabled:cursor-not-allowed disabled:border-surface-sunken disabled:bg-surface-muted disabled:text-text-disabled';\n\n/* A native <select> always matches :read-only, so the read-only surface comes from this map rather\n than a read-only: variant as on bf-input. */\ntype BfSelectMode = 'editable' | 'readonly';\nconst MODE: Record<BfSelectMode, string> = {\n editable: 'cursor-pointer bg-surface',\n readonly: 'cursor-default bg-surface-muted',\n};\n\n/* Keys that open the picker or change a closed select's value; blocked while read-only, with or\n without Alt (Alt+ArrowDown/Up and F4 open the picker on Windows and Linux). Tab, Escape and\n Ctrl/Cmd shortcuts pass through. */\nconst PICKER_KEYS = new Set([\n 'F4',\n 'ArrowUp',\n 'ArrowDown',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown',\n 'Enter',\n]);\n\n/* The text stops short of the chevron at the inline end. */\nconst PADDING_END: Record<BfSize, string> = { sm: 'pe-9', md: 'pe-10', lg: 'pe-11' };\n\n/* The chevron is a rotated square drawn with borders, so no icon dependency is needed. It points\n down, so it needs no mirroring; only its inset from the inline end follows the size. -70 %\n instead of -50 % centres the rotated square's visible corner rather than its box. */\nconst CHEVRON =\n 'relative after:pointer-events-none after:absolute after:top-1/2 after:h-2.5 after:w-2.5 ' +\n \"after:-translate-y-[70%] after:rotate-45 after:border-r-[1.5px] after:border-b-[1.5px] after:border-text-subtle after:content-['']\";\nconst CHEVRON_INSET: Record<BfSize, string> = {\n sm: 'after:end-3.5',\n md: 'after:end-4',\n lg: 'after:end-4.5',\n};\n\n/**\n * Native single-choice dropdown styled like the text field, with a placeholder option and\n * Signal Forms binding. Generic over the option value (a string by default); `null` means nothing\n * is selected.\n *\n * @example\n * <bf-select label=\"Project\" placeholder=\"Pick a project\" [options]=\"projects\" [(value)]=\"projectId\" />\n * <bf-select label=\"Team\" placeholder=\"Pick a team\" [options]=\"teams\" [formField]=\"task.teamId\" />\n * @summary Native single-choice dropdown styled like the text field, with Signal Forms binding\n * @category Forms\n * @since 0.1.0\n */\n@Component({\n selector: 'bf-select',\n imports: [BfFieldComponent],\n host: { class: 'block', '[attr.id]': 'null' },\n template: `\n <bf-field\n [label]=\"label()\"\n [helpText]=\"helpText()\"\n [error]=\"errorText()\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n [controlId]=\"id()\"\n >\n <div [class]=\"wrapperClasses()\">\n <!-- Selection is driven entirely by [selected] on each <option>; a [value] binding on\n <select> would fight it once options are added, removed or reordered. A primitive\n option value is its native value, an object's is its index; a choice maps back by\n position, so any value type round-trips. -->\n <select\n #el\n [id]=\"id()\"\n [name]=\"name()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n [attr.aria-label]=\"ariaLabelAttr()\"\n [attr.aria-labelledby]=\"ariaLabelledbyAttr()\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-errormessage]=\"errorMessageId()\"\n [class]=\"classes()\"\n (mousedown)=\"onMousedown($event)\"\n (keydown)=\"onKeydown($event)\"\n (change)=\"onChange(el)\"\n (focus)=\"focused.emit($event)\"\n (blur)=\"onBlur($event)\"\n >\n @if (placeholder()) {\n <option value=\"\" disabled [selected]=\"selectedIndex() === -1\">\n {{ placeholder() }}\n </option>\n } @else if (showEmptyOption()) {\n <option value=\"\" hidden disabled selected></option>\n }\n @for (option of options(); track $index) {\n <option\n [value]=\"key(option.value, $index)\"\n [disabled]=\"option.disabled ?? false\"\n [selected]=\"$index === selectedIndex()\"\n >\n {{ option.label }}\n </option>\n }\n </select>\n </div>\n </bf-field>\n `,\n})\nexport class BfSelectComponent<T = string> implements FormValueControl<T | null> {\n /** The selected option's value, `null` while nothing is selected; two-way bindable and bound by\n * `[formField]`. */\n readonly value = model<T | null>(null);\n /** The options to choose from. */\n readonly options = input.required<readonly BfSelectOption<T>[]>();\n /** Equality for matching `value` to an option (default `Object.is`); pass one for object values. */\n readonly compareWith = input<BfCompareWith<T>>(Object.is);\n /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`fieldSize`, `md`\n * by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Visible label above the control. */\n readonly label = input('');\n /**\n * Accessible name when no visible label is rendered (e.g. a table filter). Ignored when `label`\n * is set.\n */\n readonly ariaLabel = input('');\n /**\n * Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when\n * `label` is set.\n */\n readonly ariaLabelledby = input('');\n /** Disabled first option shown while nothing is selected. */\n readonly placeholder = input('');\n /** Helper text under the control. */\n readonly helpText = input('');\n /** Explicit error text; takes precedence over Signal Forms errors. */\n readonly errorMessage = input('');\n /** Disables the control. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Shows the value but blocks changes; the select stays focusable and exposes `aria-readonly`. */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Marks the control required. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Field validity from Signal Forms. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Whether the user has left the field. */\n readonly touched = input(false, { transform: booleanAttribute });\n /** Validation errors from Signal Forms. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /** Native name attribute. */\n readonly name = input('');\n /** Control id; generated when not set. */\n readonly id = input(uniqueId('bf-select'));\n\n /** Emitted with the chosen value after a user change (never `null`). */\n readonly changed = output<T>();\n /** Emitted when the control gains focus. */\n readonly focused = output<FocusEvent>();\n /** Emitted when the control loses focus. */\n readonly blurred = output<FocusEvent>();\n /** Emitted on blur so Signal Forms marks the field touched. */\n readonly touch = output<void>();\n\n private readonly el = viewChild.required<ElementRef<HTMLSelectElement>>('el');\n\n private readonly defaults = inject(BF_DEFAULTS);\n /** The size in effect: `size`, else the app's `fieldSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.fieldSize);\n readonly wrapperClasses = computed(() => `${CHEVRON} ${CHEVRON_INSET[this.resolvedSize()]}`);\n /** Index of the option matching `value`, `-1` while nothing (or `null`) is selected. */\n readonly selectedIndex = computed(() =>\n choiceIndex(this.options(), this.value(), this.compareWith()),\n );\n readonly showEmptyOption = computed(() => !this.placeholder() && this.selectedIndex() === -1);\n private readonly labels = inject(BF_LABELS);\n\n readonly errorText = computed(() =>\n fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation),\n );\n readonly showError = computed(() =>\n fieldShowsError(this.errorText(), this.invalid(), this.touched()),\n );\n readonly describedBy = computed(() =>\n fieldDescribedBy(this.id(), this.errorText(), this.helpText()),\n );\n /** `aria-errormessage`: the error paragraph while `aria-invalid` is set. */\n readonly errorMessageId = computed(() =>\n fieldErrorMessageId(this.id(), this.errorText(), this.showError()),\n );\n /**\n * `aria-label` value: only when there is no visible label, so the label stays the sole accessible\n * name.\n */\n readonly ariaLabelAttr = computed(() => (this.label() ? null : this.ariaLabel() || null));\n /** `aria-labelledby` value, under the same rule as `ariaLabelAttr`. */\n readonly ariaLabelledbyAttr = computed(() =>\n this.label() ? null : this.ariaLabelledby() || null,\n );\n readonly classes = computed(() =>\n [\n BASE,\n FIELD_BOX[this.resolvedSize()],\n FIELD_PADDING_START[this.resolvedSize()].text,\n PADDING_END[this.resolvedSize()],\n MODE[this.readonly() ? 'readonly' : 'editable'],\n /* Plain hover sorts before focus: and disabled:, so the focus and disabled borders still win. */\n this.showError()\n ? 'border-danger-border hover:border-danger'\n : 'border-border-strong hover:border-text-muted',\n this.selectedIndex() === -1 ? 'text-text-muted' : '',\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n /** Native `value` of an option: its value for a primitive, its index for an object. */\n protected readonly key = choiceKey;\n\n /**\n * Focuses the native select; Signal Forms calls it from `focusBoundControl()`.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n this.el().nativeElement.focus(options);\n }\n\n /**\n * Read-only: no picker on a mouse press. Cancelling the press also cancels its focus, so the\n * select is focused explicitly, like any other read-only control. Touch screens open the\n * platform picker without a cancellable press; a choice made there is reverted by `onChange`.\n * @internal\n */\n onMousedown(event: MouseEvent): void {\n if (this.readonly()) {\n event.preventDefault();\n this.el().nativeElement.focus();\n }\n }\n\n /**\n * Read-only: no picker or value change from the keyboard (arrows, Enter, Space, F4, type-ahead).\n * @internal\n */\n onKeydown(event: KeyboardEvent): void {\n if (!this.readonly() || event.ctrlKey || event.metaKey) {\n return;\n }\n if (PICKER_KEYS.has(event.key) || (event.key.length === 1 && !event.altKey)) {\n event.preventDefault();\n }\n }\n\n /**\n * Writes the chosen option's value to the model and emits `changed`; while read-only, restores\n * the shown option instead.\n * @internal\n */\n onChange(el: HTMLSelectElement): void {\n // The placeholder or the hidden empty option, when rendered, is the first native option.\n const offset = this.placeholder() || this.showEmptyOption() ? 1 : 0;\n const index = this.selectedIndex();\n if (this.readonly()) {\n el.selectedIndex = index < 0 ? 0 : index + offset;\n return;\n }\n const option = this.options()[el.selectedIndex - offset];\n if (!option) {\n return;\n }\n this.value.set(option.value);\n this.changed.emit(option.value);\n // A value that matches no option (a `null` option value) reads as nothing selected; show that.\n if (this.selectedIndex() < 0) {\n el.selectedIndex = 0;\n }\n }\n\n /**\n * Marks the field touched and emits `blurred`.\n * @internal\n */\n onBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n this.touch.emit();\n }\n}\n","import {\n Component,\n type ElementRef,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n viewChild,\n inject,\n} from '@angular/core';\nimport { type FormCheckboxControl, type ValidationError } from '@angular/forms/signals';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { BF_LABELS } from '../../config/labels';\nimport { type BfSize } from '../../config/size';\nimport { fieldErrorText, fieldShowsError } from '../_shared/field-state';\nimport { heldMessage } from '../_shared/pointer-hold';\nimport { uniqueId } from '../_shared/unique-id';\n\nconst BOX_BASE =\n 'relative flex shrink-0 items-center justify-center rounded-checkbox border-[1.5px] transition-colors ' +\n 'peer-focus-visible:ring-4 peer-focus-visible:ring-ring peer-focus-visible:outline-hidden ' +\n 'peer-disabled:border-surface-sunken peer-disabled:bg-surface-muted ' +\n \"after:absolute after:content-['']\";\n/* Box, check mark and dash per step: 18 / 22 / 24 px boxes. */\nconst BOX_SIZE: Record<BfSize, string> = { sm: 'size-4.5', md: 'size-box', lg: 'size-6' };\nconst CHECK: Record<BfSize, string> = {\n sm: 'after:h-[9px] after:w-[5px] after:-translate-y-px after:rotate-45 after:border-r-2 after:border-b-2',\n md: 'after:h-[11px] after:w-[6px] after:-translate-y-px after:rotate-45 after:border-r-2 after:border-b-2',\n lg: 'after:h-3 after:w-[7px] after:-translate-y-px after:rotate-45 after:border-r-2 after:border-b-2',\n};\nconst DASH: Record<BfSize, string> = {\n sm: 'after:h-0 after:w-2 after:border-b-2',\n md: 'after:h-0 after:w-[10px] after:border-b-2',\n lg: 'after:h-0 after:w-3 after:border-b-2',\n};\n/* Row height per step: the visual row under a fine pointer (sm 32 is above the 24 px of WCAG 2.5.8),\n 44 px under a coarse pointer (lg is 48 already). A min-height, never ::after, because the row\n projects the consumer's label. */\nconst ROW: Record<BfSize, string> = {\n sm: 'min-h-8 pointer-coarse:min-h-hit',\n md: 'min-h-10 pointer-coarse:min-h-hit',\n lg: 'min-h-12',\n};\nconst TEXT: Record<BfSize, string> = { sm: 'text-label-sm', md: 'text-label', lg: 'text-label' };\n/* The error text lines up with the label: box plus the 10 px gap. */\nconst ERROR_INDENT: Record<BfSize, string> = { sm: 'ps-7', md: 'ps-8', lg: 'ps-8.5' };\n\n/* Read-only boxes rest on `surface-muted` like the read-only radio rings; a checked one keeps a\n `primary` border and mark (>= 4.8:1 on surface-muted and bg in both themes, above the 3:1\n non-text minimum), so it reads as checked but not as an editable filled box. */\ntype BfCheckboxBoxState = 'on' | 'readonlyOn' | 'error' | 'readonly' | 'off';\nconst BOX_STATE: Record<BfCheckboxBoxState, string> = {\n on: 'border-primary bg-primary after:border-on-primary after:opacity-100',\n readonlyOn: 'border-primary bg-surface-muted after:border-primary after:opacity-100',\n error: 'border-danger-border bg-surface after:border-on-primary after:opacity-0',\n readonly: 'border-border-strong bg-surface-muted after:border-on-primary after:opacity-0',\n off: 'border-border-strong bg-surface after:border-on-primary after:opacity-0',\n};\nconst BOX_HOVER: Record<BfCheckboxBoxState, string> = {\n on: 'group-hover/bf-checkbox:border-primary-hover group-hover/bf-checkbox:bg-primary-hover',\n readonlyOn: '',\n error: 'group-hover/bf-checkbox:border-danger',\n readonly: '',\n off: 'group-hover/bf-checkbox:border-text-muted',\n};\n/* Pressed boundary while the label (the named group) is held down; editable boxes only. */\nconst BOX_PRESSED = 'group-active/bf-checkbox:border-text';\n\n/* How the row responds to the pointer: only an editable row is a hover group with a pointer. */\ntype BfCheckboxMode = 'editable' | 'readonly' | 'disabled';\nconst LABEL_MODE: Record<BfCheckboxMode, string> = {\n editable: 'group/bf-checkbox cursor-pointer',\n readonly: 'cursor-default',\n disabled: 'cursor-not-allowed',\n};\n\n/**\n * Checkbox with a 22 px rounded box and an optional label, implementing the Signal Forms\n * checkbox contract so `[formField]` binds `checked`.\n *\n * @example\n * <bf-checkbox [(checked)]=\"agree\">I agree to the terms</bf-checkbox>\n * <bf-checkbox label=\"Notify me\" [formField]=\"prefs.notify\" />\n * @summary Rounded checkbox with an optional label that binds to Signal Forms\n * @category Forms\n * @since 0.1.0\n * @slot default Rich label content next to the box, before the `label` text.\n */\n@Component({\n selector: 'bf-checkbox',\n host: { class: 'block', '[attr.id]': 'null' },\n // items-start keeps the label row only as wide as its content, so a click on empty space beside\n // it does not toggle the box.\n template: `\n <div class=\"flex flex-col items-start gap-1.5\">\n <label [for]=\"id()\" [class]=\"labelClasses()\">\n <input\n #el\n type=\"checkbox\"\n class=\"peer sr-only\"\n [id]=\"id()\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"errorId()\"\n [attr.aria-errormessage]=\"showError() ? errorId() : null\"\n (click)=\"onClick($event)\"\n (change)=\"onChange(el.checked)\"\n (blur)=\"touch.emit()\"\n />\n <span data-box aria-hidden=\"true\" [class]=\"boxClasses()\"></span>\n <span data-text [class]=\"textClasses()\"><ng-content />{{ label() }}</span>\n </label>\n @if (message.text(); as text) {\n <p [id]=\"id() + '-error'\" [class.sr-only]=\"message.hidden()\" [class]=\"errorClasses()\">\n {{ text }}\n </p>\n }\n </div>\n `,\n})\nexport class BfCheckboxComponent implements FormCheckboxControl {\n /** Whether the box is checked; two-way bindable and bound by `[formField]`. */\n readonly checked = model(false);\n /** Label text; the default slot works too. */\n readonly label = input('');\n /** Accessible name when there is no visible `label`, e.g. a row-selection box. */\n readonly ariaLabel = input('');\n /** Id(s) of the element(s) that name the control when no visible label is rendered (e.g. a\n * table column header). */\n readonly ariaLabelledby = input('');\n /** Height step of the row: sm 32, md 40, lg 48 px (44 px under a coarse pointer for sm and md);\n * unset follows `provideBfDefaults()` (`controlSize`, `md` by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Shows the mixed state (e.g. \"select all\" with some rows selected); two-way bindable. A user\n * change clears it, like the native checkbox, so the box and `aria-checked` agree. */\n readonly indeterminate = model(false);\n /** Disables the control. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Shows the state but blocks changes; the box stays focusable and exposes `aria-readonly`. */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Marks the control required. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Field validity from Signal Forms. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Whether the user has left the field. */\n readonly touched = input(false, { transform: booleanAttribute });\n /** Validation errors from Signal Forms. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /** Explicit error text; takes precedence over Signal Forms errors. */\n readonly errorMessage = input('');\n /** Native name attribute. */\n readonly name = input('');\n /** Control id; generated when not set. */\n readonly id = input(uniqueId('bf-checkbox'));\n\n /** Emitted with the new checked state after a user change. */\n readonly changed = output<boolean>();\n /** Emitted on blur so Signal Forms marks the field touched. */\n readonly touch = output<void>();\n\n private readonly el = viewChild.required<ElementRef<HTMLInputElement>>('el');\n\n private readonly labels = inject(BF_LABELS);\n private readonly defaults = inject(BF_DEFAULTS);\n /** The size in effect: `size`, else the app's `controlSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.controlSize);\n\n readonly errorText = computed(() =>\n fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation),\n );\n readonly showError = computed(() =>\n fieldShowsError(this.errorText(), this.invalid(), this.touched()),\n );\n /** The error paragraph: `errorText`, visually hidden while a press elsewhere (that blurred\n * this control) holds the layout, so it never moves under the pointer. */\n protected readonly message = heldMessage(this.errorText);\n /** The id of the error paragraph (`aria-describedby`) while there is an error, else null; the\n * paragraph renders whenever it is named. */\n protected readonly errorId = computed(() => (this.errorText() ? `${this.id()}-error` : null));\n private readonly mode = computed<BfCheckboxMode>(() =>\n this.disabled() ? 'disabled' : this.readonly() ? 'readonly' : 'editable',\n );\n readonly labelClasses = computed(() =>\n [\n 'inline-flex min-w-6 items-center gap-2.5',\n ROW[this.resolvedSize()],\n LABEL_MODE[this.mode()],\n ].join(' '),\n );\n readonly textClasses = computed(\n () =>\n `text-text peer-disabled:text-text-disabled font-semibold empty:hidden ${TEXT[this.resolvedSize()]}`,\n );\n readonly errorClasses = computed(\n () => `text-danger text-micro ${ERROR_INDENT[this.resolvedSize()]}`,\n );\n readonly boxClasses = computed(() => {\n const on = this.checked() || this.indeterminate();\n const state: BfCheckboxBoxState = on\n ? this.readonly()\n ? 'readonlyOn'\n : 'on'\n : this.showError()\n ? 'error'\n : this.readonly()\n ? 'readonly'\n : 'off';\n const size = this.resolvedSize();\n return [\n BOX_BASE,\n BOX_SIZE[size],\n BOX_STATE[state],\n // Hovering the label (the named `group/bf-checkbox`) tints the box; a disabled or read-only\n // box has no hover. Named so a consumer's own `.group` ancestor (e.g. a card) does not also\n // tint it.\n this.mode() === 'editable' ? BOX_HOVER[state] : '',\n this.mode() === 'editable' ? BOX_PRESSED : '',\n this.indeterminate() ? DASH[size] : CHECK[size],\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n /**\n * Focuses the native checkbox; Signal Forms calls it from `focusBoundControl()`.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n this.el().nativeElement.focus(options);\n }\n\n /**\n * Read-only: cancels the toggle. Space activates a checkbox through a click, so this covers it.\n * @internal\n */\n onClick(event: MouseEvent): void {\n if (this.readonly()) {\n event.preventDefault();\n }\n }\n\n /**\n * Writes the native checkbox state to `checked` and emits `changed`.\n * @internal\n */\n onChange(next: boolean): void {\n this.indeterminate.set(false);\n this.checked.set(next);\n this.changed.emit(next);\n }\n}\n","import {\n Component,\n type ElementRef,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n viewChild,\n inject,\n} from '@angular/core';\nimport { type FormCheckboxControl, type ValidationError } from '@angular/forms/signals';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { BF_LABELS } from '../../config/labels';\nimport { type BfSize } from '../../config/size';\nimport { fieldErrorText, fieldShowsError } from '../_shared/field-state';\nimport { heldMessage } from '../_shared/pointer-hold';\nimport { uniqueId } from '../_shared/unique-id';\n\n/* The design's 3 px knob inset: a 1.5 px border (transparent except read-only off, so\n forced-colors mode draws the track) plus 1.5 px padding. */\nconst TRACK_BASE =\n 'relative flex shrink-0 items-center rounded-control border-[1.5px] p-[1.5px] transition-colors ' +\n 'peer-focus-visible:ring-4 peer-focus-visible:ring-ring peer-focus-visible:outline-hidden';\nconst KNOB_BASE =\n 'block rounded-control border-[1.5px] border-transparent shadow-segment transition-transform';\n\n/* Row height per step: the visual row under a fine pointer (sm 32 is above the 24 px of WCAG 2.5.8),\n 44 px under a coarse pointer (lg is 48 already). A min-height, never ::after, because the row\n projects the consumer's label. */\nconst ROW: Record<BfSize, string> = {\n sm: 'min-h-8 pointer-coarse:min-h-hit',\n md: 'min-h-10 pointer-coarse:min-h-hit',\n lg: 'min-h-12',\n};\n/* Track, knob and knob travel per step: the knob fills the track's inner height (track minus the\n 3 px inset each side) and travels the rest of its inner width, towards the inline end (mirrored\n under dir=\"rtl\"). */\nconst TRACK_SIZE: Record<BfSize, string> = { sm: 'h-6 w-10', md: 'h-7 w-12', lg: 'h-8 w-14' };\nconst KNOB_SIZE: Record<BfSize, string> = { sm: 'size-4.5', md: 'size-box', lg: 'size-6.5' };\nconst KNOB_TRAVEL: Record<BfSize, Record<'on' | 'off', string>> = {\n sm: { on: 'translate-x-4 rtl:-translate-x-4', off: 'translate-x-0' },\n md: { on: 'translate-x-5 rtl:-translate-x-5', off: 'translate-x-0' },\n lg: { on: 'translate-x-6 rtl:-translate-x-6', off: 'translate-x-0' },\n};\nconst TEXT: Record<BfSize, string> = { sm: 'text-label-sm', md: 'text-label', lg: 'text-label' };\n/* How the row responds to the pointer: only an editable row is a hover group with a pointer. */\ntype BfToggleMode = 'editable' | 'readonly' | 'disabled';\nconst LABEL_MODE: Record<BfToggleMode, string> = {\n editable: 'group/bf-toggle cursor-pointer',\n readonly: 'cursor-default',\n disabled: 'cursor-not-allowed',\n};\n/* Track fill and border per mode and state. Disabled uses tokens, never opacity: a soft primary\n track when on, the sunken fill when off. Read-only rests on the muted surface like the other\n read-only controls, outlined in `primary` when on (>= 4.8:1 on bg and surface-muted in both\n themes) and in `control-off` when off (>= 3:1 on bg and surface), so the track keeps its\n non-text boundary; no hover. Enabled tracks darken while the label (the named `group/bf-toggle`)\n is hovered — named so a consumer's own `.group` ancestor (e.g. a card) does not also tint it. */\nconst TRACK_FILL: Record<BfToggleMode, Record<'on' | 'off', string>> = {\n editable: {\n on: 'border-transparent bg-primary group-hover/bf-toggle:bg-primary-hover',\n off: 'border-transparent bg-control-off group-hover/bf-toggle:bg-text-muted',\n },\n readonly: {\n on: 'border-primary bg-surface-muted',\n off: 'border-control-off bg-surface-muted',\n },\n disabled: {\n on: 'border-transparent bg-primary-soft',\n off: 'border-transparent bg-surface-sunken',\n },\n};\n\n/* Pressed boundary while the label (the named group) is held down; editable tracks only. */\nconst TRACK_PRESSED: Record<BfToggleMode, string> = {\n editable: 'group-active/bf-toggle:border-text',\n readonly: '',\n disabled: '',\n};\n\n/* Knob fill per mode and state; the knob carries the state (WCAG 1.4.11), so it reaches 3:1 on its\n track for any configured primary: on-primary on the primary track, primary-strong on the muted\n read-only track, surface on control-off. A disabled knob stays surface (exempt). */\nconst KNOB_FILL: Record<BfToggleMode, Record<'on' | 'off', string>> = {\n editable: { on: 'bg-on-primary', off: 'bg-surface' },\n readonly: { on: 'bg-primary-strong', off: 'bg-surface' },\n disabled: { on: 'bg-surface', off: 'bg-surface' },\n};\n\n/**\n * The side of a `bf-toggle`'s switch its label sits on: after it (`end`) or before it (`start`).\n *\n * @summary Whether a toggle's label sits after or before its switch\n * @since 0.3.0\n */\nexport type BfToggleLabelPosition = 'end' | 'start';\n\n/**\n * On/off switch for settings that apply immediately. Implements the Signal Forms checkbox contract.\n *\n * @example\n * <bf-toggle label=\"Notifications\" [(checked)]=\"notifications\" />\n * @summary On/off switch for settings that apply immediately, with Signal Forms binding\n * @category Forms\n * @since 0.1.0\n * @slot default Rich label content after the `label` text.\n */\n@Component({\n selector: 'bf-toggle',\n host: { class: 'block', '[attr.id]': 'null' },\n template: `\n <!-- items-start keeps the end-positioned label (and its 44 px hit row) as wide as its content. -->\n <div class=\"flex flex-col items-start gap-1.5\">\n <label [for]=\"id()\" [class]=\"labelClasses()\">\n <input\n #el\n type=\"checkbox\"\n role=\"switch\"\n class=\"peer sr-only\"\n [id]=\"id()\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n [attr.aria-checked]=\"checked() ? 'true' : 'false'\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledby() || null\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"errorId()\"\n [attr.aria-errormessage]=\"showError() ? errorId() : null\"\n (click)=\"onClick($event)\"\n (change)=\"onChange(el.checked)\"\n (blur)=\"touch.emit()\"\n />\n <span data-track aria-hidden=\"true\" [class]=\"trackClasses()\">\n <span data-knob [class]=\"knobClasses()\"></span>\n </span>\n @if (label()) {\n <span [class]=\"textClasses()\">{{ label() }}</span>\n }\n <ng-content />\n </label>\n @if (message.text(); as text) {\n <p [id]=\"id() + '-error'\" [class.sr-only]=\"message.hidden()\" class=\"text-danger text-micro\">\n {{ text }}\n </p>\n }\n </div>\n `,\n})\nexport class BfToggleComponent implements FormCheckboxControl {\n /** Whether the switch is on; two-way bindable and bound by `[formField]`. */\n readonly checked = model(false);\n /** Label text; the default slot works too. */\n readonly label = input('');\n /** Accessible name when no visible label is rendered (e.g. a switch in a list row). */\n readonly ariaLabel = input('');\n /** Id(s) of the element(s) that name the control when no visible label is rendered (e.g. a\n * table column header). */\n readonly ariaLabelledby = input('');\n /** Height step of the row: sm 32, md 40, lg 48 px (44 px under a coarse pointer for sm and md);\n * unset follows `provideBfDefaults()` (`controlSize`, `md` by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Put the label before the switch (as in settings lists). */\n readonly labelPosition = input<BfToggleLabelPosition>('end');\n /** Disables the control. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Shows the state but blocks changes; the switch stays focusable and exposes `aria-readonly`. */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Marks the control required. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Field validity from Signal Forms. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Whether the user has left the field. */\n readonly touched = input(false, { transform: booleanAttribute });\n /** Validation errors from Signal Forms. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /** Explicit error text; takes precedence over Signal Forms errors. */\n readonly errorMessage = input('');\n /** Native name attribute. */\n readonly name = input('');\n /** Control id; generated when not set. */\n readonly id = input(uniqueId('bf-toggle'));\n\n /** Emitted with the new state after a user change. */\n readonly changed = output<boolean>();\n /** Emitted on blur so Signal Forms marks the field touched. */\n readonly touch = output<void>();\n\n private readonly el = viewChild.required<ElementRef<HTMLInputElement>>('el');\n private readonly defaults = inject(BF_DEFAULTS);\n /** The size in effect: `size`, else the app's `controlSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.controlSize);\n private readonly mode = computed<BfToggleMode>(() =>\n this.disabled() ? 'disabled' : this.readonly() ? 'readonly' : 'editable',\n );\n\n readonly labelClasses = computed(() =>\n [\n this.labelPosition() === 'start'\n ? 'flex w-full flex-row-reverse items-center justify-between gap-2.5'\n : 'inline-flex items-center gap-2.5',\n ROW[this.resolvedSize()],\n LABEL_MODE[this.mode()],\n ].join(' '),\n );\n readonly trackClasses = computed(() =>\n [\n TRACK_BASE,\n TRACK_SIZE[this.resolvedSize()],\n TRACK_FILL[this.mode()][this.checked() ? 'on' : 'off'],\n TRACK_PRESSED[this.mode()],\n ]\n .filter(Boolean)\n .join(' '),\n );\n /* min-w-0 and wrap-anywhere: a long label (or a large text size) wraps beside the track instead\n of overflowing the row (a start label would spill past the row's start edge). */\n readonly textClasses = computed(\n () =>\n `text-text peer-disabled:text-text-disabled min-w-0 font-semibold wrap-anywhere ${TEXT[this.resolvedSize()]}`,\n );\n readonly knobClasses = computed(() => {\n const on = this.checked();\n const fill = KNOB_FILL[this.mode()][on ? 'on' : 'off'];\n const size = this.resolvedSize();\n return `${KNOB_BASE} ${KNOB_SIZE[size]} ${fill} ${KNOB_TRAVEL[size][on ? 'on' : 'off']}`;\n });\n private readonly labels = inject(BF_LABELS);\n\n readonly errorText = computed(() =>\n fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation),\n );\n readonly showError = computed(() =>\n fieldShowsError(this.errorText(), this.invalid(), this.touched()),\n );\n /** The error paragraph: `errorText`, visually hidden while a press elsewhere (that blurred\n * this control) holds the layout, so it never moves under the pointer. */\n protected readonly message = heldMessage(this.errorText);\n /** The id of the error paragraph (`aria-describedby`) while there is an error, else null; the\n * paragraph renders whenever it is named. */\n protected readonly errorId = computed(() => (this.errorText() ? `${this.id()}-error` : null));\n\n /**\n * Focuses the native switch; Signal Forms calls it from `focusBoundControl()`.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n this.el().nativeElement.focus(options);\n }\n\n /**\n * Read-only: cancels the toggle. Space activates a switch through a click, so this covers it.\n * @internal\n */\n onClick(event: MouseEvent): void {\n if (this.readonly()) {\n event.preventDefault();\n }\n }\n\n /**\n * Writes the native switch state to `checked` and emits `changed`.\n * @internal\n */\n onChange(next: boolean): void {\n this.checked.set(next);\n this.changed.emit(next);\n }\n}\n","import {\n Component,\n type ElementRef,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n viewChildren,\n inject,\n} from '@angular/core';\nimport { type FormValueControl, type ValidationError } from '@angular/forms/signals';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { BF_LABELS } from '../../config/labels';\nimport { type BfSize } from '../../config/size';\nimport { type BfCompareWith, choiceIndex, choiceKey } from '../_shared/choice';\nimport { fieldErrorText, fieldShowsError } from '../_shared/field-state';\nimport { heldMessage } from '../_shared/pointer-hold';\nimport { uniqueId } from '../_shared/unique-id';\n\n/**\n * How a `bf-radio-group` lays out its options: stacked (`vertical`) or in a row (`horizontal`).\n *\n * @summary Whether a radio group stacks its options or sets them in a row\n * @since 0.3.0\n */\nexport type BfRadioGroupOrientation = 'vertical' | 'horizontal';\n\n/**\n * One choice of `bf-radio-group`; `value` is any type (a string by default).\n *\n * @summary One choice of a radio group with its value, label and optional description\n * @since 0.1.0\n */\nexport interface BfRadioOption<T = string> {\n /** The value the group's `value` takes when this option is chosen. */\n value: T;\n /** The visible label, also the radio's accessible name. */\n label: string;\n /** A second line under the label, linked to the radio with `aria-describedby`. */\n description?: string;\n /** Whether this option cannot be chosen. */\n disabled?: boolean;\n}\n\nconst RING_BASE =\n 'relative mt-0.5 flex shrink-0 items-center justify-center rounded-full border-[1.5px] transition-colors ' +\n 'peer-focus-visible:ring-4 peer-focus-visible:ring-ring peer-focus-visible:outline-hidden peer-disabled:border-surface-sunken peer-disabled:bg-surface-muted';\n/* The dot is primary-strong, not primary: it carries the checked state inside its surface ring,\n and primary-strong reaches 3:1 there for any configured primary (a pale brand primary does not). */\nconst DOT_BASE = 'rounded-full bg-primary-strong forced-colors:bg-[CanvasText] transition-opacity';\n/* The label text sits in a wrapper span, so `peer-disabled:` cannot reach it; the row colours it\n instead and dims it while its radio is disabled. */\nconst OPTION_LABEL_BASE =\n 'inline-flex items-center gap-2.5 text-text has-[input:disabled]:text-text-disabled';\n/* Row height per step: the visual row under a fine pointer (sm 32 is above the 24 px of WCAG 2.5.8),\n 44 px under a coarse pointer (lg is 48 already). A min-height, never ::after, because the row\n projects the consumer's label. */\nconst ROW: Record<BfSize, string> = {\n sm: 'min-h-8 pointer-coarse:min-h-hit',\n md: 'min-h-10 pointer-coarse:min-h-hit',\n lg: 'min-h-12',\n};\n/* Ring (18 / 22 / 24 px), dot and option label type per step. */\nconst RING_SIZE: Record<BfSize, string> = { sm: 'size-4.5', md: 'size-box', lg: 'size-6' };\nconst DOT_SIZE: Record<BfSize, string> = { sm: 'size-2.5', md: 'size-3', lg: 'size-3.5' };\nconst TEXT: Record<BfSize, string> = { sm: 'text-label-sm', md: 'text-label', lg: 'text-label' };\n\n/* How an option responds to the pointer. Only an editable option is a hover group with a pointer\n (named `group/bf-radio` so a consumer's own `.group` ancestor, e.g. a card, does not also tint\n the ring); a read-only one rests on the muted surface. */\ntype BfRadioMode = 'editable' | 'readonly' | 'disabled';\nconst OPTION_LABEL_MODE: Record<BfRadioMode, string> = {\n editable: 'group/bf-radio cursor-pointer',\n readonly: 'cursor-default',\n disabled: 'cursor-not-allowed',\n};\nconst RING_FILL: Record<BfRadioMode, string> = {\n editable: 'bg-surface',\n readonly: 'bg-surface-muted',\n disabled: 'bg-surface',\n};\n\n/* Pressed boundary of an editable option's ring while its label is held down. */\nconst RING_PRESSED = 'group-active/bf-radio:border-text';\n\n/* Keys that move a native radio group's selection; blocked while read-only. */\nconst ARROW_KEYS = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']);\n\n/**\n * A group of radio buttons for choosing one of a few options, with an optional description per\n * option. Implements the Signal Forms value contract; generic over the option value (a string by\n * default), `null` while nothing is selected.\n *\n * @example\n * <bf-radio-group label=\"View\" [options]=\"views\" [(value)]=\"view\" />\n * @summary Group of radio buttons for choosing one option, with optional per-option descriptions\n * @category Forms\n * @since 0.1.0\n */\n@Component({\n selector: 'bf-radio-group',\n host: { class: 'block', '[attr.id]': 'null' },\n template: `\n <fieldset\n [id]=\"id()\"\n role=\"radiogroup\"\n class=\"flex flex-col gap-1.5\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabelAttr()\"\n [attr.aria-labelledby]=\"ariaLabelledbyAttr()\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"errorId()\"\n [attr.aria-errormessage]=\"showError() ? errorId() : null\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (label()) {\n <!-- A rendered legend is not a flex item of the fieldset, so the 6 px gap to the options is\n its own margin; gap-1.5 spaces the options and the error message. -->\n <legend class=\"text-caption text-text-muted mb-1.5\">{{ label() }}</legend>\n }\n <div data-options [class]=\"optionsClasses()\">\n @for (option of options(); track $index) {\n <label [class]=\"optionLabelClasses(option)\">\n <input\n #radio\n type=\"radio\"\n class=\"peer sr-only\"\n [name]=\"name()\"\n [value]=\"key(option.value, $index)\"\n [checked]=\"$index === selectedIndex()\"\n [disabled]=\"disabled() || (option.disabled ?? false)\"\n (click)=\"onClick($event)\"\n (change)=\"onChange($index)\"\n (blur)=\"touch.emit()\"\n />\n <span aria-hidden=\"true\" [class]=\"ringClasses(option, $index)\">\n <span data-dot [class]=\"dotClasses($index)\"></span>\n </span>\n <span class=\"flex flex-col\">\n <span [class]=\"textClasses()\">{{ option.label }}</span>\n @if (option.description) {\n <span data-description class=\"text-caption text-text-muted\">{{\n option.description\n }}</span>\n }\n </span>\n </label>\n }\n </div>\n @if (message.text(); as text) {\n <p [id]=\"id() + '-error'\" [class.sr-only]=\"message.hidden()\" class=\"text-danger text-micro\">\n {{ text }}\n </p>\n }\n </fieldset>\n `,\n})\nexport class BfRadioGroupComponent<T = string> implements FormValueControl<T | null> {\n /** The selected option's value, `null` while nothing is selected; two-way bindable and bound by\n * `[formField]`. */\n readonly value = model<T | null>(null);\n /** The options to choose from. */\n readonly options = input.required<readonly BfRadioOption<T>[]>();\n /** Equality for matching `value` to an option (default `Object.is`); pass one for object values. */\n readonly compareWith = input<BfCompareWith<T>>(Object.is);\n /** Group label, rendered as the fieldset legend. */\n readonly label = input('');\n /**\n * Accessible name of the group when no visible `label` is rendered. Ignored when `label` is set.\n */\n readonly ariaLabel = input('');\n /**\n * Id(s) of the element(s) that name the group when no visible `label` is rendered. Ignored when\n * `label` is set.\n */\n readonly ariaLabelledby = input('');\n /** Height step of the option row: sm 32, md 40, lg 48 px (44 px under a coarse pointer for sm and md);\n * unset follows `provideBfDefaults()` (`controlSize`, `md` by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Stack the options vertically (default) or in a row. */\n readonly orientation = input<BfRadioGroupOrientation>('vertical');\n /** Disables every option. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * Shows the choice but blocks changes; the options stay focusable and the group exposes\n * `aria-readonly`.\n */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Marks the group required. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Field validity from Signal Forms. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Whether the user has left the field. */\n readonly touched = input(false, { transform: booleanAttribute });\n /** Validation errors from Signal Forms. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /** Explicit error text; takes precedence over Signal Forms errors. */\n readonly errorMessage = input('');\n /** Shared name of the radio inputs; generated when not set. */\n readonly name = input(uniqueId('bf-radio'));\n /** Group id; generated when not set. */\n readonly id = input(uniqueId('bf-radio-group'));\n\n /** Emitted with the newly selected value after a user change (never `null`). */\n readonly changed = output<T>();\n /** Emitted on blur so Signal Forms marks the field touched. */\n readonly touch = output<void>();\n\n /** The rendered radio inputs, in option order; used by `focus()`. */\n private readonly radios = viewChildren<ElementRef<HTMLInputElement>>('radio');\n\n private readonly labels = inject(BF_LABELS);\n private readonly defaults = inject(BF_DEFAULTS);\n /** Index of the option matching `value`, `-1` while nothing (or `null`) is selected. */\n readonly selectedIndex = computed(() =>\n choiceIndex(this.options(), this.value(), this.compareWith()),\n );\n /** The size in effect: `size`, else the app's `controlSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.controlSize);\n readonly textClasses = computed(() => `font-semibold ${TEXT[this.resolvedSize()]}`);\n\n readonly errorText = computed(() =>\n fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation),\n );\n readonly showError = computed(() =>\n fieldShowsError(this.errorText(), this.invalid(), this.touched()),\n );\n /** The error paragraph: `errorText`, visually hidden while a press elsewhere (that blurred\n * this control) holds the layout, so it never moves under the pointer. */\n protected readonly message = heldMessage(this.errorText);\n /** The id of the error paragraph (`aria-describedby`) while there is an error, else null; the\n * paragraph renders whenever it is named. */\n protected readonly errorId = computed(() => (this.errorText() ? `${this.id()}-error` : null));\n /**\n * `aria-label` value: only when there is no visible label, so the legend stays the sole\n * accessible name.\n */\n readonly ariaLabelAttr = computed(() => (this.label() ? null : this.ariaLabel() || null));\n /** `aria-labelledby` value, under the same rule as `ariaLabelAttr`. */\n readonly ariaLabelledbyAttr = computed(() =>\n this.label() ? null : this.ariaLabelledby() || null,\n );\n readonly optionsClasses = computed(() =>\n this.orientation() === 'horizontal'\n ? 'flex flex-row flex-wrap gap-x-6 gap-y-2'\n : 'flex flex-col items-start gap-1',\n );\n\n protected optionLabelClasses(option: BfRadioOption<T>): string {\n return `${OPTION_LABEL_BASE} ${ROW[this.resolvedSize()]} ${OPTION_LABEL_MODE[this.optionMode(option)]}`;\n }\n\n protected ringClasses(option: BfRadioOption<T>, index: number): string {\n const mode = this.optionMode(option);\n const fill = `${RING_SIZE[this.resolvedSize()]} ${RING_FILL[mode]}`;\n // Pressing an editable option's named `group/bf-radio` label draws the pressed boundary.\n const pressed = mode === 'editable' ? ` ${RING_PRESSED}` : '';\n if (index === this.selectedIndex()) {\n return `${RING_BASE} ${fill} border-primary${pressed}`;\n }\n // Hovering an editable option's named `group/bf-radio` label darkens its ring; the selected\n // one stays.\n const hover = mode === 'editable';\n const border = this.showError()\n ? `border-danger-border${hover ? ' group-hover/bf-radio:border-danger' : ''}`\n : `border-border-strong${hover ? ' group-hover/bf-radio:border-text-muted' : ''}`;\n return `${RING_BASE} ${fill} ${border}${pressed}`;\n }\n\n protected dotClasses(index: number): string {\n const shown = index === this.selectedIndex() ? 'opacity-100' : 'opacity-0';\n return `${DOT_BASE} ${DOT_SIZE[this.resolvedSize()]} ${shown}`;\n }\n\n /**\n * Focuses the checked radio, else the first enabled one; Signal Forms calls it from\n * `focusBoundControl()`.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n const all = this.options();\n const enabled = (option: BfRadioOption<T> | undefined) =>\n option !== undefined && !(this.disabled() || option.disabled);\n let index = this.selectedIndex();\n if (!enabled(all[index])) {\n index = all.findIndex(enabled);\n }\n this.radios()[index]?.nativeElement.focus(options);\n }\n\n /**\n * Read-only: cancels the selection. Space activates a radio through a click, so this covers it.\n * @internal\n */\n onClick(event: MouseEvent): void {\n if (this.readonly()) {\n event.preventDefault();\n }\n }\n\n /**\n * Read-only: arrow keys would move the native selection, so they do nothing.\n * @internal\n */\n onKeydown(event: KeyboardEvent): void {\n if (this.readonly() && ARROW_KEYS.has(event.key)) {\n event.preventDefault();\n }\n }\n\n /** Native `value` of a radio: its option's value for a primitive, its index for an object. */\n protected readonly key = choiceKey;\n\n /**\n * Writes the value of the option at `index` to the model and emits `changed`.\n * @internal\n */\n onChange(index: number): void {\n const option = this.options()[index];\n if (!option) {\n return;\n }\n this.value.set(option.value);\n this.changed.emit(option.value);\n }\n\n private optionMode(option: BfRadioOption<T>): BfRadioMode {\n if (this.disabled() || option.disabled) {\n return 'disabled';\n }\n return this.readonly() ? 'readonly' : 'editable';\n }\n}\n","import { InjectionToken, type Signal } from '@angular/core';\n\n/*\n * What `bf-chip` and `bf-chip-group` need from each other, through an injection token so the chip\n * never imports the group. Internal: not exported from the package.\n */\n\n/** A chip as its group sees it. */\nexport interface BfChipGroupItem {\n /** The value the chip stands for, compared with `Object.is`. */\n readonly value: Signal<unknown>;\n /** The chip's own `disabled` input. */\n readonly disabled: Signal<boolean>;\n /** Focuses the chip's button. */\n focus(options?: FocusOptions): void;\n}\n\n/** The enclosing `bf-chip-group`, as its chips inject it. */\nexport interface BfChipGroupHost {\n /** True in `single` mode: the chips are radios and the group owns the selection. */\n readonly radio: Signal<boolean>;\n /** Disables every chip of the group. */\n readonly disabled: Signal<boolean>;\n /** Single mode: whether `item` is the selected chip. */\n isSelected(item: BfChipGroupItem): boolean;\n /** Single mode: whether `item` owns the roving tab stop. */\n isTabStop(item: BfChipGroupItem): boolean;\n /** Single mode: selects `item`, as a click on it does. */\n select(item: BfChipGroupItem): void;\n}\n\nexport const BF_CHIP_GROUP = new InjectionToken<BfChipGroupHost>('BF_CHIP_GROUP');\n","import {\n Component,\n ElementRef,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n output,\n viewChild,\n} from '@angular/core';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { type BfSize } from '../../config/size';\nimport { PILL_HIT } from '../_shared/hit-classes';\nimport { BF_CHIP_GROUP, type BfChipGroupItem } from '../chip-group/chip-group.token';\n\n/**\n * The colour of a `bf-chip`: tonal or ink.\n *\n * @summary The two chip colours, a soft tonal tint or a dark ink fill\n * @since 0.1.0\n */\nexport type BfChipVariant = 'tonal' | 'ink';\n\nconst BASE =\n 'relative inline-flex max-w-full min-w-0 items-center gap-1.5 rounded-control border-[1.5px] font-bold whitespace-nowrap ' +\n 'cursor-pointer transition-colors duration-150 select-none focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring ' +\n 'disabled:cursor-not-allowed disabled:border-transparent disabled:bg-surface-sunken disabled:text-text-disabled';\n\n/* Heights 32/40/48, the scale of bf-button, so a chip row lines up with the fields and buttons\n beside it. The chip always has a 1.5 px border, so its coarse-pointer hit extension (PILL_HIT)\n is the border-compensated one. */\nconst SIZE: Record<BfSize, string> = {\n sm: 'h-8 px-3 text-label-xs',\n md: 'h-10 px-3.5 text-label-sm',\n lg: 'h-12 px-4.5 text-label',\n};\n\nconst OFF = 'bg-surface text-text border-border-strong enabled:hover:border-text-muted';\nconst ON: Record<BfChipVariant, string> = {\n tonal:\n 'bg-primary-soft text-primary-strong border-primary-soft enabled:hover:bg-primary-soft-hover enabled:hover:border-primary-soft-hover',\n ink: 'bg-text text-bg border-text enabled:hover:bg-text-secondary enabled:hover:border-text-secondary',\n};\n/* Pressed, added only while the chip can be pressed: off takes the pressed neutral surface, a\n selected tonal chip the soft pressed tint, a selected ink chip `text-secondary`. */\nconst PRESSED_OFF = 'enabled:active:bg-surface-pressed';\nconst PRESSED_ON: Record<BfChipVariant, string> = {\n tonal: 'enabled:active:bg-primary-soft-pressed enabled:active:border-primary-soft-pressed',\n ink: 'enabled:active:bg-text-secondary enabled:active:border-text-secondary',\n};\n\n/* Check mark drawn with two borders, shown only while selected. `before:block` is required: a\n pseudo-element defaults to `display: inline`, and an inline, non-replaced box ignores explicit\n width/height, which collapsed the mark to a thin vertical line instead of a check shape. */\nconst MARK =\n \"before:block before:h-[10px] before:w-[5px] before:-translate-y-px before:rotate-45 before:border-r-2 before:border-b-2 before:border-current before:content-['']\";\n\n/**\n * Toggleable filter chip. Selected chips carry a check mark and a tint (`tonal`) or the ink\n * treatment used by mobile filter rows (`ink`). For a single-choice row, put the chips in a\n * `bf-chip-group`, which makes them a radio group.\n *\n * @example\n * <bf-chip [(selected)]=\"filters.design\">Design</bf-chip>\n * <bf-chip variant=\"ink\" [selected]=\"view() === 'open'\" (changed)=\"setView('open')\">Open</bf-chip>\n * @summary Toggleable filter chip with a check mark when selected, in tonal or ink style\n * @category Forms\n * @since 0.1.0\n * @slot icon-start An icon before the label.\n * @slot default Rich label content, before the `label` text.\n */\n@Component({\n selector: 'bf-chip',\n host: { class: 'inline-flex max-w-full' },\n template: `\n <button\n #button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.role]=\"radio() ? 'radio' : null\"\n [attr.aria-checked]=\"radio() ? (isSelected() ? 'true' : 'false') : null\"\n [attr.aria-pressed]=\"radio() ? null : isSelected() ? 'true' : 'false'\"\n [attr.tabindex]=\"tabIndex()\"\n [class]=\"classes()\"\n (click)=\"onClick()\"\n >\n @if (isSelected()) {\n <span aria-hidden=\"true\" [class]=\"markClasses\"></span>\n }\n <ng-content select=\"[bfSlot=icon-start]\" />\n <!-- The label truncates with an ellipsis in a narrow container; icon and mark keep their size. -->\n <span data-label class=\"max-w-full min-w-0 truncate\"><ng-content />{{ label() }}</span>\n </button>\n `,\n})\nexport class BfChipComponent implements BfChipGroupItem {\n /** Whether the chip is selected; two-way bindable. Inside a `single`-mode `bf-chip-group` the\n * group's `value` decides and this is ignored. */\n readonly selected = model(false);\n /** The value this chip stands for inside a `bf-chip-group` (compared with `Object.is`); unused\n * outside one. */\n readonly value = input<unknown>(undefined);\n /** Selected treatment: tonal tint (default) or ink. */\n readonly variant = input<BfChipVariant>('tonal');\n /** Disables the chip. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Label text; the default slot works too. */\n readonly label = input('');\n /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`controlSize`, `md`\n * by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** When false, clicking an already selected chip does nothing (single-choice rows). */\n readonly deselectable = input(true, { transform: booleanAttribute });\n\n /** Emitted with the new state after a user toggle. */\n readonly changed = output<boolean>();\n /**\n * Emitted with the new state after a user toggle, together with `changed`.\n * @deprecated 0.3.0 use changed; removed in 0.4.0\n */\n readonly toggled = output<boolean>();\n\n readonly markClasses = `inline-block ${MARK}`;\n private readonly defaults = inject(BF_DEFAULTS);\n private readonly group = inject(BF_CHIP_GROUP, { optional: true });\n private readonly button = viewChild.required<ElementRef<HTMLButtonElement>>('button');\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n /** The size in effect: `size`, else the app's `controlSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.controlSize);\n /** Inside a `single`-mode group: a radio whose selection the group owns. */\n protected readonly radio = computed(() => this.group?.radio() ?? false);\n /** Disabled by its own input or by its group. */\n protected readonly isDisabled = computed(\n () => this.disabled() || (this.group?.disabled() ?? false),\n );\n /** The selection shown: the group's in a single-mode group, else `selected`. */\n protected readonly isSelected = computed(() =>\n this.group && this.radio() ? this.group.isSelected(this) : this.selected(),\n );\n /** Roving tab stop in a single-mode group; the native order otherwise. */\n protected readonly tabIndex = computed(() => {\n if (!this.group || !this.radio()) {\n return null;\n }\n return this.group.isTabStop(this) ? 0 : -1;\n });\n\n readonly classes = computed(() => {\n const size = this.resolvedSize();\n const variant = this.variant();\n const on = this.isSelected();\n const pressed = this.isDisabled() ? '' : on ? PRESSED_ON[variant] : PRESSED_OFF;\n return [BASE, SIZE[size], PILL_HIT[size].bordered, on ? ON[variant] : OFF, pressed]\n .filter(Boolean)\n .join(' ');\n });\n\n /**\n * Focuses the chip's button.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n this.button().nativeElement.focus(options);\n }\n\n /**\n * Whether `node` is this chip or inside it; the group finds the focused chip with it.\n * @internal\n */\n contains(node: Node | null): boolean {\n return node !== null && this.host.contains(node);\n }\n\n /**\n * Toggles `selected` and emits `changed`, unless disabled or selected and not `deselectable`;\n * in a single-mode group, selects this chip through the group instead.\n * @internal\n */\n onClick(): void {\n if (this.isDisabled()) {\n return;\n }\n if (this.group && this.radio()) {\n this.group.select(this);\n return;\n }\n if (!this.deselectable() && this.selected()) {\n return;\n }\n const next = !this.selected();\n this.selected.set(next);\n this.changed.emit(next);\n this.toggled.emit(next);\n }\n}\n","import {\n Component,\n booleanAttribute,\n computed,\n contentChildren,\n input,\n model,\n output,\n} from '@angular/core';\nimport { BfChipComponent } from '../chip/chip.component';\nimport { BF_CHIP_GROUP, type BfChipGroupHost, type BfChipGroupItem } from './chip-group.token';\n\n/**\n * How a `bf-chip-group` treats its chips: one selected at a time (`single`, a radio group) or\n * independent toggles (`multiple`).\n *\n * @summary Whether a chip group picks exactly one chip or lets each chip toggle alone\n * @since 0.3.0\n */\nexport type BfChipGroupMode = 'single' | 'multiple';\n\nconst NAVIGATION_KEYS = new Set(['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp', 'Home', 'End']);\n\n/**\n * A named row of `bf-chip`s. In `single` mode (the default) the chips are a radio group: the\n * group owns the selected chip's `value`, one chip is the tab stop and the arrow keys move the\n * selection. In `multiple` mode the chips stay independent toggles and the group only names them.\n * Not a Signal Forms control: for a form field use `bf-segmented` or `bf-radio-group`.\n *\n * @example\n * <bf-chip-group label=\"Status\" [(value)]=\"status\">\n * <bf-chip value=\"all\">All</bf-chip>\n * <bf-chip value=\"open\">Open</bf-chip>\n * <bf-chip value=\"done\">Done</bf-chip>\n * </bf-chip-group>\n * @summary Named row of chips that picks one like radios, or groups independent toggles\n * @category Forms\n * @since 0.3.0\n * @slot default The `bf-chip`s of the group, each with its `value`.\n */\n@Component({\n selector: 'bf-chip-group',\n providers: [{ provide: BF_CHIP_GROUP, useExisting: BfChipGroupComponent }],\n // gap-2: wrapping rows keep the 8 px the coarse-pointer hit extension of a chip needs.\n host: {\n class: 'flex flex-wrap items-center gap-2',\n '[attr.role]': \"radio() ? 'radiogroup' : 'group'\",\n '[attr.aria-label]': 'label() || null',\n '[attr.aria-labelledby]': 'label() ? null : ariaLabelledby() || null',\n '(keydown)': 'onKeydown($event)',\n },\n template: `<ng-content />`,\n})\nexport class BfChipGroupComponent<T = string> implements BfChipGroupHost {\n /** `single` (default): one chip selected, radio semantics; `multiple`: independent toggles. */\n readonly mode = input<BfChipGroupMode>('single');\n /** Accessible name of the group (required unless `ariaLabelledby` is set). */\n readonly label = input('');\n /** Id(s) of the element(s) that name the group (e.g. a visible heading) when `label` is not set. */\n readonly ariaLabelledby = input('');\n /** single: the selected chip's value (`null` = none); ignored in multiple mode. Two-way. Every\n * chip of a single-mode group needs a `value` (of type `T`); one without it cannot be selected. */\n readonly value = model<T | null>(null);\n /** Disables every chip of the group. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emitted with the new value after a user change (single mode). */\n readonly changed = output<T | null>();\n\n /** The chips of the group, in document order. */\n private readonly chips = contentChildren(BfChipComponent, { descendants: true });\n\n /**\n * True in `single` mode.\n * @internal\n */\n readonly radio = computed(() => this.mode() === 'single');\n\n /** The enabled chips, in order. */\n private readonly enabled = computed(() =>\n this.disabled() ? [] : this.chips().filter((chip) => !chip.disabled()),\n );\n\n /** The chip matching `value`, else none. A chip without a `value` never matches, so chips\n * that all left it `undefined` cannot all read as selected. */\n private readonly selectedChip = computed(() => {\n const value = this.value();\n return value === null\n ? undefined\n : this.chips().find((chip) => chip.value() !== undefined && Object.is(chip.value(), value));\n });\n\n /** The chip that owns the roving tab stop: the selected enabled chip, else the first enabled. */\n private readonly tabStop = computed(() => {\n const selected = this.selectedChip();\n const enabled = this.enabled();\n return selected && enabled.includes(selected) ? selected : enabled[0];\n });\n\n /**\n * Whether `item` is the selected chip.\n * @internal\n */\n isSelected(item: BfChipGroupItem): boolean {\n return this.selectedChip() === item;\n }\n\n /**\n * Whether `item` owns the roving tab stop.\n * @internal\n */\n isTabStop(item: BfChipGroupItem): boolean {\n return this.tabStop() === item;\n }\n\n /**\n * Selects `item` and emits `changed`, unless it is disabled, already selected or has no\n * `value` (every chip of a single-mode group needs one).\n * @internal\n */\n select(item: BfChipGroupItem): void {\n const chip = this.enabled().find((candidate) => candidate === item);\n if (chip?.value() === undefined || chip === this.selectedChip()) {\n return;\n }\n // The chips' values are the group's values: a template binds both, so the checker cannot\n // tie the chip's `unknown` to `T`; the consumer's `[value]`s are the `T`s of `[(value)]`.\n const next = chip.value() as T;\n this.value.set(next);\n this.changed.emit(next);\n }\n\n /**\n * Single mode: the arrow keys, Home and End move focus and the selection, wrapping and skipping\n * disabled chips.\n * @internal\n */\n onKeydown(event: KeyboardEvent): void {\n if (!this.radio() || !NAVIGATION_KEYS.has(event.key)) {\n return;\n }\n const enabled = this.enabled();\n if (enabled.length === 0) {\n return;\n }\n event.preventDefault();\n const target = event.target instanceof Node ? event.target : null;\n const from = enabled.findIndex((chip) => chip.contains(target));\n const last = enabled.length - 1;\n let index: number;\n switch (event.key) {\n case 'Home':\n index = 0;\n break;\n case 'End':\n index = last;\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n index = from === -1 || from === last ? 0 : from + 1;\n break;\n default:\n index = from <= 0 ? last : from - 1;\n }\n const next = enabled[index];\n if (next) {\n this.select(next);\n next.focus();\n }\n }\n}\n","import {\n Component,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n type ElementRef,\n viewChildren,\n inject,\n} from '@angular/core';\nimport { type FormValueControl, type ValidationError } from '@angular/forms/signals';\nimport { BF_DEFAULTS } from '../../config/defaults';\nimport { BF_LABELS } from '../../config/labels';\nimport { type BfSize } from '../../config/size';\nimport { type BfCompareWith, choiceIndex } from '../_shared/choice';\nimport { COARSE_HIT_BASE } from '../_shared/hit-classes';\nimport { fieldErrorText, fieldShowsError } from '../_shared/field-state';\nimport { heldMessage } from '../_shared/pointer-hold';\nimport { uniqueId } from '../_shared/unique-id';\n\n/**\n * One segment of `bf-segmented`; `value` is any type (a string by default).\n *\n * @summary One segment of a segmented control with its value, its label and a disabled flag\n * @since 0.1.0\n */\nexport interface BfSegmentOption<T = string> {\n /** The value the control's `value` takes when this segment is selected. */\n value: T;\n /** The segment's visible label, also its accessible name. */\n label: string;\n /** Whether this segment cannot be selected. */\n disabled?: boolean;\n}\n\n/**\n * The height step of a `bf-segmented`; the same scale as every sized widget.\n *\n * @deprecated 0.3.0 use BfSize; removed in 1.0.0\n * @summary Former name of the shared size scale for segmented controls, kept until 1.0.0\n * @since 0.1.0\n */\nexport type BfSegmentedSize = BfSize;\n\n/* min-w-min: an item shrinks down to its longest word, never below it, so a label wraps between\n its words (the item grows taller) and never breaks between letters or gets cut. When the\n segments cannot fit even then (the largest text sizes, a long compound word), the track grows\n past the control and the control scrolls sideways (see SCROLLER_CLASSES). */\nconst ITEM_BASE =\n 'relative inline-flex min-w-min items-center justify-center rounded-control py-1 font-bold transition-colors duration-150 select-none ' +\n 'focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface ' +\n `disabled:cursor-not-allowed disabled:text-text-disabled ${COARSE_HIT_BASE}`;\n/* Items are at least 24/32/40 px tall, so with the track's 4 px padding the control is 32/40/48,\n the height of the fields and buttons beside it. Under a coarse pointer the ::after extends each\n item's hit area vertically to 44 px (24 + 2 x 10, 32 + 2 x 6, 40 + 2 x 2) without changing the\n visual; under a fine pointer the item itself is the hit area. */\n/* Horizontal padding in px (12/14/18, the rem values at the default size): it stays put under\n iOS Dynamic Type, which scales rem, so a larger text size spends the segment's width on the\n label, not on its padding. */\nconst ITEM_SIZE: Record<BfSize, string> = {\n sm: 'min-h-6 px-[12px] text-label-xs pointer-coarse:after:-inset-y-2.5',\n md: 'min-h-8 px-[14px] text-label-sm pointer-coarse:after:-inset-y-1.5',\n lg: 'min-h-10 px-[18px] text-label pointer-coarse:after:-inset-y-0.5',\n};\n/* Disabled: the selected item keeps its surface pill (so the value stays readable) without the\n lift; the others take the sunken fill of the track. Text goes to text-disabled in both.\n Forced colours: the selected item opts out of adjustment and paints the system Highlight pair\n itself, because Chromium's Canvas text backplate would otherwise sit under HighlightText and hide\n the label; its transparent focus outline is then drawn in CanvasText. The others keep the\n automatic repaint in ButtonText on a transparent fill.\n The selected item also carries a 1.5 px inset primary-strong outline (>= 3:1 on surface and the\n sunken track), so the state never rests on the pill fill alone (1.18:1 on the track); inset, so\n the box and the hit maths stay. The focus ring sits on a 2 px surface offset, where it reaches\n 3:1, instead of on the track. Opted out of forced-colour adjustment, the selected item would keep\n those authored box-shadow colours, so under forced colours its outline and focus ring are drawn\n in CanvasText on a Canvas offset and the segment shadow is dropped: system colours only.\n Disabled selected: `disabled:inset-ring-text-disabled` and `forced-colors:inset-ring-[CanvasText]`\n both compile to a (0,1,0)+(:disabled) vs (0,2,0) pair, and the plain disabled rule wins, so a\n disabled selected item would otherwise keep the authored `text-disabled` outline under forced\n colours. `forced-colors:disabled:inset-ring-[GrayText]` matches that specificity and repaints it\n in the system's disabled-foreground colour instead. */\nconst ACTIVE =\n 'bg-surface text-text shadow-segment inset-ring-[1.5px] inset-ring-primary-strong disabled:shadow-none disabled:inset-ring-text-disabled forced-colors:forced-color-adjust-none forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] forced-colors:focus-visible:outline-[CanvasText] forced-colors:inset-ring-[CanvasText] forced-colors:disabled:inset-ring-[GrayText] forced-colors:shadow-none forced-colors:focus-visible:ring-[CanvasText] forced-colors:focus-visible:ring-offset-[Canvas]';\nconst INACTIVE =\n 'bg-transparent text-text-muted disabled:bg-surface-sunken forced-colors:bg-transparent forced-colors:text-[ButtonText]';\n/* Pointer affordance: an editable segment shows a pointer and a hover tint (the active one\n `surface-muted`, like the tab-bar active tab, except under forced colours, where its fill stays\n Highlight); a read-only one shows neither. Pressed, an editable segment takes the pressed\n neutral surface (the selected one only outside forced colours, where its fill stays Highlight)\n and an unselected one the `text` label, which holds 4.5:1 there. */\ntype BfSegmentedMode = 'editable' | 'readonly';\nconst ITEM_MODE: Record<BfSegmentedMode, Record<'active' | 'inactive', string>> = {\n editable: {\n active:\n 'cursor-pointer not-forced-colors:enabled:hover:bg-surface-muted not-forced-colors:enabled:active:bg-surface-pressed',\n inactive:\n 'cursor-pointer enabled:hover:text-text enabled:active:bg-surface-pressed enabled:active:text-text',\n },\n readonly: { active: 'cursor-default', inactive: 'cursor-default' },\n};\n/* The track never gets narrower than its segments' longest words (min-w-min), so it can overflow\n the scroller around it. Its horizontal padding and gap are px, like the segments'. */\nconst TRACK_BASE = 'min-w-min gap-[2px] rounded-control px-[4px] py-1';\n/* Track layout: shrink to the segments, or stretch and share the width. */\nconst TRACK_LAYOUT: Record<'fit' | 'full', string> = {\n fit: 'inline-flex',\n full: 'flex w-full',\n};\n/* The scroller around the track: it scrolls sideways only while the segments cannot fit (at the\n largest text sizes). Its 4 px padding, cancelled by a negative margin, keeps the focus ring\n (2 px offset + 4 px, 2 px past the track) inside the clip. */\nconst SCROLLER_CLASSES: Record<'fit' | 'full', string> = {\n fit: '-m-[4px] max-w-[calc(100%+8px)] overflow-x-auto p-[4px]',\n full: '-m-[4px] w-[calc(100%+8px)] overflow-x-auto p-[4px]',\n};\n/* Track fill: `surface-sunken`, or the muted read-only surface of the text fields. */\nconst TRACK_FILL: Record<BfSegmentedMode, string> = {\n editable: 'bg-surface-sunken',\n readonly: 'bg-surface-muted',\n};\n/* The error state outlines the track in `danger-border`, like the other fields' borders. */\nconst TRACK_OUTLINE: Record<'error' | 'none', string> = {\n error: 'ring-[1.5px] ring-danger-border',\n none: '',\n};\nconst NAVIGATION_KEYS = ['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp', 'Home', 'End'];\n\n/**\n * Segmented control for switching between two to four views. Behaves like a radio group for\n * keyboard and assistive tech; implements the Signal Forms value contract. Generic over the option\n * value (a string by default), `null` while nothing is selected.\n *\n * @example\n * <bf-segmented label=\"Range\" [options]=\"ranges\" [(value)]=\"range\" />\n * @summary Segmented control for switching between two to four views, keyboard-navigable like radios\n * @category Forms\n * @since 0.1.0\n */\n@Component({\n selector: 'bf-segmented',\n // A column so the error text sits under the track; items-start keeps the track at its own width.\n host: {\n class: 'inline-flex max-w-full flex-col items-start gap-1.5',\n '[class.w-full]': 'fullWidth()',\n '[attr.id]': 'null',\n },\n template: `\n <div data-bf-segmented-scroller [class]=\"scrollerClasses()\">\n <div\n role=\"radiogroup\"\n tabindex=\"-1\"\n [id]=\"id()\"\n [attr.aria-label]=\"ariaLabelAttr()\"\n [attr.aria-labelledby]=\"ariaLabelledbyAttr()\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"showError() ? 'true' : null\"\n [attr.aria-describedby]=\"errorId()\"\n [attr.aria-errormessage]=\"showError() ? errorId() : null\"\n [class]=\"trackClasses()\"\n (keydown)=\"onKeydown($event)\"\n >\n @for (option of options(); track $index) {\n <button\n #radio\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"$index === selectedIndex() ? 'true' : 'false'\"\n [tabIndex]=\"$index === tabStop() ? 0 : -1\"\n [disabled]=\"disabled() || (option.disabled ?? false)\"\n [class]=\"itemClasses($index)\"\n (click)=\"selectAt($index)\"\n (blur)=\"touch.emit()\"\n >\n <span data-label class=\"text-center\">{{ option.label }}</span>\n </button>\n }\n </div>\n </div>\n @if (message.text(); as text) {\n <p [id]=\"id() + '-error'\" [class.sr-only]=\"message.hidden()\" class=\"text-danger text-micro\">\n {{ text }}\n </p>\n }\n `,\n})\nexport class BfSegmentedComponent<T = string> implements FormValueControl<T | null> {\n /** The selected option's value, `null` while nothing is selected; two-way bindable and bound by\n * `[formField]`. */\n readonly value = model<T | null>(null);\n /** The segments. */\n readonly options = input.required<readonly BfSegmentOption<T>[]>();\n /** Equality for matching `value` to an option (default `Object.is`); pass one for object values. */\n readonly compareWith = input<BfCompareWith<T>>(Object.is);\n /** Height step of the control (track): sm 32, md 40, lg 48 px; unset follows\n * `provideBfDefaults()` (`controlSize`, `md` by default). */\n readonly size = input<BfSize | undefined>(undefined);\n /** Stretch the control and share the width between segments. */\n readonly fullWidth = input(false, { transform: booleanAttribute });\n /** Disables every segment. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * Shows the choice but blocks changes; the tab stop stays focusable and the group exposes\n * `aria-readonly`.\n */\n readonly readonly = input(false, { transform: booleanAttribute });\n /** Marks the choice required (`aria-required` on the group). */\n readonly required = input(false, { transform: booleanAttribute });\n /** Field validity from Signal Forms. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Whether the user has left the field; errors show only once touched. */\n readonly touched = input(false, { transform: booleanAttribute });\n /** Validation errors from Signal Forms; the first message is shown once touched. */\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n /** Explicit error text; takes precedence over Signal Forms errors. */\n readonly errorMessage = input('');\n /** Accessible name of the group (not rendered visibly). */\n readonly label = input('');\n /** Accessible name when `label` is not set. */\n readonly ariaLabel = input('');\n /**\n * Id(s) of the element(s) that name the group (e.g. a visible heading) when `label` is not set.\n */\n readonly ariaLabelledby = input('');\n /**\n * Name of the bound field. Not rendered, because the control has no native form element; kept so\n * Signal Forms can bind it.\n */\n readonly name = input('');\n /** Group id; generated when not set. */\n readonly id = input(uniqueId('bf-segmented'));\n\n /** Emitted with the newly selected value after a user change (never `null`). */\n readonly changed = output<T>();\n /** Emitted on blur so Signal Forms marks the field touched. */\n readonly touch = output<void>();\n\n /** The rendered radio buttons, in option order; used to move focus after keyboard selection. */\n readonly radios = viewChildren<ElementRef<HTMLButtonElement>>('radio');\n\n /** Index of the option matching `value`, `-1` while nothing (or `null`) is selected. */\n readonly selectedIndex = computed(() =>\n choiceIndex(this.options(), this.value(), this.compareWith()),\n );\n\n /** Index of the option that owns the roving tab stop: the selected enabled option, or the first\n * enabled option when nothing valid is selected; `-1` when every option is disabled. */\n readonly tabStop = computed(() => {\n const options = this.options();\n const selected = this.selectedIndex();\n if (selected >= 0 && !options[selected]?.disabled) {\n return selected;\n }\n return options.findIndex((o) => !o.disabled);\n });\n\n private readonly labels = inject(BF_LABELS);\n private readonly defaults = inject(BF_DEFAULTS);\n /** The size in effect: `size`, else the app's `controlSize` default. */\n protected readonly resolvedSize = computed(() => this.size() ?? this.defaults.controlSize);\n\n readonly errorText = computed(() =>\n fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation),\n );\n readonly showError = computed(() =>\n fieldShowsError(this.errorText(), this.invalid(), this.touched()),\n );\n /** The error paragraph: `errorText`, visually hidden while a press elsewhere (that blurred\n * this control) holds the layout, so it never moves under the pointer. */\n protected readonly message = heldMessage(this.errorText);\n /** The id of the error paragraph (`aria-describedby`) while there is an error, else null; the\n * paragraph renders whenever it is named. */\n protected readonly errorId = computed(() => (this.errorText() ? `${this.id()}-error` : null));\n /** `aria-label`: the `label`, else `ariaLabel`. */\n readonly ariaLabelAttr = computed(() => this.label() || this.ariaLabel() || null);\n /** `aria-labelledby`: only while no `label` names the group. */\n readonly ariaLabelledbyAttr = computed(() =>\n this.label() ? null : this.ariaLabelledby() || null,\n );\n private readonly mode = computed<BfSegmentedMode>(() =>\n this.readonly() ? 'readonly' : 'editable',\n );\n /** The classes of the scroller around the track. */\n protected readonly scrollerClasses = computed(\n () => SCROLLER_CLASSES[this.fullWidth() ? 'full' : 'fit'],\n );\n\n readonly trackClasses = computed(() =>\n [\n TRACK_BASE,\n TRACK_LAYOUT[this.fullWidth() ? 'full' : 'fit'],\n TRACK_FILL[this.mode()],\n TRACK_OUTLINE[this.showError() ? 'error' : 'none'],\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n /**\n * The classes of the segment at `index`.\n * @internal\n */\n itemClasses(index: number): string {\n const active = index === this.selectedIndex();\n return [\n ITEM_BASE,\n ITEM_SIZE[this.resolvedSize()],\n active ? ACTIVE : INACTIVE,\n ITEM_MODE[this.mode()][active ? 'active' : 'inactive'],\n this.fullWidth() ? 'flex-1' : '',\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n /**\n * Focuses the segment that owns the tab stop; Signal Forms calls it from `focusBoundControl()`.\n * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.\n */\n focus(options?: FocusOptions): void {\n this.focusRadio(this.tabStop(), options);\n }\n\n /**\n * Selects the option whose value matches `next` under `compareWith`, as a click would.\n * @param next The value of the option to select.\n */\n select(next: T): void {\n this.selectAt(choiceIndex(this.options(), next, this.compareWith()));\n }\n\n /**\n * Selects the option at `index` unless the control is disabled or read-only, the option is\n * missing, or it is already selected.\n * @param index The position of the option in `options`.\n */\n selectAt(index: number): void {\n const option = this.options()[index];\n if (this.disabled() || this.readonly() || !option || index === this.selectedIndex()) {\n return;\n }\n this.value.set(option.value);\n this.changed.emit(option.value);\n }\n\n /**\n * Arrow keys, Home and End move the selection, as in a radio group.\n * @internal\n */\n onKeydown(event: KeyboardEvent): void {\n if (!NAVIGATION_KEYS.includes(event.key)) {\n return;\n }\n event.preventDefault();\n // Read-only: the value and the focused segment stay; Tab still leaves the group.\n if (this.readonly()) {\n return;\n }\n // Indexes of the enabled options, in order.\n const enabled = this.options().flatMap((o, i) => (o.disabled ? [] : [i]));\n if (enabled.length === 0) {\n return;\n }\n const index = enabled.indexOf(this.selectedIndex());\n let next: number | undefined;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = index === -1 ? enabled[0] : enabled[(index + 1) % enabled.length];\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next =\n index === -1\n ? enabled[enabled.length - 1]\n : enabled[(index - 1 + enabled.length) % enabled.length];\n break;\n case 'Home':\n next = enabled[0];\n break;\n case 'End':\n next = enabled[enabled.length - 1];\n break;\n }\n if (next === undefined) {\n return;\n }\n this.selectAt(next);\n if (this.selectedIndex() === next) {\n this.focusRadio(next);\n }\n }\n\n private focusRadio(index: number, options?: FocusOptions): void {\n this.radios()[index]?.nativeElement.focus(options);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Provided by `bf-list` so a `bf-list-item` knows it sits inside a `role=\"list\"` container and may\n * claim `role=\"listitem\"`, without `list-item.component.ts` importing `list.component.ts`.\n */\nexport const BF_LIST = new InjectionToken<true>('BF_LIST');\n","import { Component, booleanAttribute, computed, input } from '@angular/core';\nimport { BF_LIST } from './list.token';\n\n/**\n * Container for `bf-list-item` rows. The inset style (default) wraps the rows in the warm\n * background with rounded corners, as in the design's grouped lists.\n *\n * @example\n * <bf-list>\n * <bf-list-item title=\"Notifications\" subtitle=\"Every Monday at 8:00\" />\n * </bf-list>\n * @summary Container for list rows, inset by default with rounded corners on a warm background\n * @category Data display\n * @since 0.1.0\n * @slot default The rows, each a `bf-list-item`.\n */\n@Component({\n selector: 'bf-list',\n host: { class: 'block' },\n // Tells the projected rows they are inside a list, so each claims role=\"listitem\".\n providers: [{ provide: BF_LIST, useValue: true }],\n template: `<div role=\"list\" [class]=\"classes()\"><ng-content /></div>`,\n})\nexport class BfListComponent {\n /** Grouped look with the warm container; false renders rows on the page background. */\n readonly inset = input(true, { transform: booleanAttribute });\n\n readonly classes = computed(() =>\n this.inset()\n ? 'flex flex-col gap-1 rounded-card bg-bg p-1.5'\n : 'flex flex-col gap-2 bg-transparent p-0',\n );\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Provided by the surfaces a `bfAction` stretches over (`bf-card`, `bf-list-item`), so the nearest\n * one, and only it, shows the clickable cues: a card holding navigation rows is not lit by the\n * rows' links. Kept in its own file so the directive and the surfaces never import each other.\n */\nexport interface BfActionHost {\n /** Called by a `bfAction` inside the surface; returns its unregister function. */\n registerAction(): () => void;\n /** Whether the surface's action has keyboard focus (`:focus-visible`), for the focus ring. */\n setActionFocusVisible(visible: boolean): void;\n}\n\nexport const BF_ACTION_HOST = new InjectionToken<BfActionHost>('BF_ACTION_HOST');\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { BF_ACTION_HOST, type BfActionHost } from '../action/action-host.token';\nimport { BF_LIST } from './list.token';\n\n/* Always `relative`: a bfAction link or button in the title slot stretches its ::after over the\n row. */\nconst ROW =\n 'relative flex w-full items-center gap-3 rounded-field bg-surface p-3.5 text-start text-text transition-colors';\nconst INTERACTIVE =\n 'cursor-pointer enabled:hover:bg-surface-muted enabled:active:bg-surface-pressed enabled:active:after:border-text-muted focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring disabled:cursor-not-allowed disabled:text-text-disabled';\n/* A row holding its own [bfAction] (a navigation row; it registers through BF_ACTION_HOST): the\n pointer, the hover fill and the pressed fill while its action is pressed, plus the focus ring\n while the action has keyboard focus. While pressed the chevron turns `text-muted`, because\n `text-subtle` misses 3:1 on `surface-pressed`. */\ntype BfRowAction = 'none' | 'action' | 'focused';\nconst ACTION: Record<BfRowAction, string> = {\n none: '',\n action:\n 'cursor-pointer hover:bg-surface-muted has-[[data-bf-action]:active]:bg-surface-pressed has-[[data-bf-action]:active]:after:border-text-muted',\n focused:\n 'cursor-pointer hover:bg-surface-muted has-[[data-bf-action]:active]:bg-surface-pressed has-[[data-bf-action]:active]:after:border-text-muted ring-4 ring-ring',\n};\n/* The chevron sits at the inline end and points there: right in LTR, mirrored to the left under\n dir=\"rtl\" (and nudged the other way). */\n/* The title, the title slot and the subtitle wrap (anywhere, for a long word or URL) so no text is\n lost at large text sizes; `truncate` keeps each on one line with an ellipsis. */\ntype BfRowText = 'wrap' | 'truncate';\nconst TEXT: Record<BfRowText, string> = {\n wrap: 'wrap-anywhere',\n truncate: 'truncate',\n};\nconst CHEVRON =\n \"after:ms-auto after:h-2.5 after:w-2.5 after:shrink-0 after:-translate-x-1 after:rotate-45 rtl:after:translate-x-1 rtl:after:-rotate-135 after:border-t-[1.5px] after:border-r-[1.5px] after:border-text-subtle after:content-['']\";\n\n/**\n * One row of a list: leading slot (avatar, icon tile), title and subtitle, trailing slot\n * (time, toggle, badge) and an optional chevron for rows that navigate. A navigation row puts a\n * `bfAction` link in the `title` slot, so the row stays a list item and the link covers it.\n *\n * @example\n * <bf-list-item subtitle=\"lena@studio.ch\" chevron>\n * <bf-avatar bfSlot=\"leading\" initials=\"LM\" />\n * <a bfSlot=\"title\" bfAction routerLink=\"/account\">Account</a>\n * </bf-list-item>\n * @summary List row with leading slot, title, subtitle, trailing slot and an optional chevron\n * @category Data display\n * @since 0.1.0\n * @slot leading Content before the text, such as an avatar or an icon.\n * @slot title Rich title content, instead of or next to the `title` text.\n * @slot default More content under the title and subtitle.\n * @slot trailing Content at the end, such as a toggle, a badge or a button.\n */\n@Component({\n selector: 'bf-list-item',\n // role=\"listitem\" only inside bf-list: a standalone row claiming it would have no list parent.\n host: { class: 'block', '[attr.role]': 'role' },\n providers: [{ provide: BF_ACTION_HOST, useExisting: BfListItemComponent }],\n imports: [NgTemplateOutlet],\n template: `\n @if (interactive()) {\n <button\n type=\"button\"\n [disabled]=\"disabled()\"\n [class]=\"classes()\"\n (click)=\"clicked.emit($event)\"\n >\n <ng-container *ngTemplateOutlet=\"content\" />\n </button>\n } @else {\n <div [class]=\"classes()\"><ng-container *ngTemplateOutlet=\"content\" /></div>\n }\n <ng-template #content>\n <ng-content select=\"[bfSlot=leading]\" />\n <span class=\"flex min-w-0 flex-1 flex-col\">\n @if (title()) {\n <span class=\"text-label font-bold {{ textClasses() }}\">{{ title() }}</span>\n }\n <span class=\"text-label font-bold empty:hidden {{ textClasses() }}\"\n ><ng-content select=\"[bfSlot=title]\"\n /></span>\n @if (subtitle()) {\n <span class=\"text-caption text-text-muted {{ textClasses() }}\">{{ subtitle() }}</span>\n }\n <ng-content />\n </span>\n <!-- Above a stretched bfAction link, so a toggle or button here stays clickable. -->\n <span class=\"relative z-1 flex shrink-0 items-center gap-3 empty:hidden\"\n ><ng-content select=\"[bfSlot=trailing]\"\n /></span>\n </ng-template>\n `,\n})\nexport class BfListItemComponent implements BfActionHost {\n /** Primary text. For a navigation row, project an `<a bfSlot=\"title\" bfAction>` instead. */\n readonly title = input('');\n /** Secondary text under the title. */\n readonly subtitle = input('');\n /** Render the row as a button that emits `clicked` (an action row; a row that navigates puts a\n * `bfAction` link in the `title` slot instead). */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Show a trailing chevron (navigation rows). */\n readonly chevron = input(false, { transform: booleanAttribute });\n /** Disable an interactive row. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * Keep the title, the title slot and the subtitle on one line each, cut with an ellipsis. By\n * default they wrap, so nothing is lost at large text sizes.\n */\n readonly truncate = input(false, { transform: booleanAttribute });\n\n /** Emitted when an interactive row is activated. */\n readonly clicked = output<Event>();\n\n /** `listitem` inside a `bf-list`, else no role. */\n protected readonly role = inject(BF_LIST, { optional: true }) ? 'listitem' : null;\n\n private readonly actions = signal(0);\n private readonly actionFocusVisible = signal(false);\n private readonly actionState = computed<BfRowAction>(() => {\n if (this.actions() === 0) {\n return 'none';\n }\n return this.actionFocusVisible() ? 'focused' : 'action';\n });\n\n /** Wrap or truncate classes of the title, the title slot and the subtitle. */\n protected readonly textClasses = computed(() => TEXT[this.truncate() ? 'truncate' : 'wrap']);\n\n readonly classes = computed(() =>\n [\n ROW,\n this.interactive() ? INTERACTIVE : ACTION[this.actionState()],\n this.chevron() ? CHEVRON : '',\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n /** @internal Called by a `bfAction` in the row. */\n registerAction(): () => void {\n this.actions.update((n) => n + 1);\n return () => this.actions.update((n) => n - 1);\n }\n\n /** @internal Called by the row's `bfAction` on focus and blur. */\n setActionFocusVisible(visible: boolean): void {\n this.actionFocusVisible.set(visible);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, booleanAttribute, computed, input, output, signal } from '@angular/core';\nimport { BF_ACTION_HOST, type BfActionHost } from '../action/action-host.token';\n\n/**\n * The surface of a `bf-card`: raised, tint, ink or flat.\n *\n * @summary The four card surfaces, from a raised panel to a flat outline\n * @since 0.1.0\n */\nexport type BfCardVariant = 'raised' | 'tint' | 'ink' | 'flat';\n/**\n * The inner padding of a `bf-card`: md or lg.\n *\n * @summary The two inner paddings of a card, regular and roomy\n * @since 0.1.0\n */\nexport type BfCardPadding = 'md' | 'lg';\n\n/* Always `relative`: a bfAction link or button inside stretches its ::after over this box. */\nconst BASE = 'relative flex h-full w-full flex-col gap-3 rounded-card text-start';\nconst VARIANT: Record<BfCardVariant, string> = {\n raised: 'bg-surface text-text shadow-raised',\n tint: 'bg-primary-soft text-text',\n ink: 'bg-text text-bg',\n flat: 'bg-surface text-text border-[1.5px] border-border-strong',\n};\nconst PADDING: Record<BfCardPadding, string> = { md: 'p-card', lg: 'p-card-lg' };\n/* Deprecated `interactive`: the whole card is a <button>. */\nconst INTERACTIVE =\n 'cursor-pointer transition-shadow hover:shadow-floating active:shadow-raised focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring';\n/* A card holding its own [bfAction] (it registers through BF_ACTION_HOST): the pointer and the\n hover elevation, dropping back to `raised` while the action is pressed, plus the focus ring\n while the action has keyboard focus. */\ntype BfCardAction = 'none' | 'action' | 'focused';\nconst ACTION: Record<BfCardAction, string> = {\n none: '',\n action:\n 'cursor-pointer transition-shadow hover:shadow-floating has-[[data-bf-action]:active]:shadow-raised',\n focused:\n 'cursor-pointer transition-shadow hover:shadow-floating has-[[data-bf-action]:active]:shadow-raised ring-4 ring-ring',\n};\n\n/**\n * Surface for a piece of content: a project summary, a stat, a focus prompt. Four variants from\n * the design: raised (default), tint, ink and flat. To make the whole card clickable, put a\n * `bfAction` link or button in its heading (the stretched-link pattern).\n *\n * @example\n * <bf-card>\n * <span bfSlot=\"header\" class=\"text-caption text-text-muted\">Project</span>\n * <h3 class=\"text-heading\"><a bfAction routerLink=\"/projects/atlas\">Atlas rebrand</a></h3>\n * <bf-progress [value]=\"68\" label=\"Progress\" />\n * </bf-card>\n * @summary Content surface with an optional header slot, in four visual styles from raised to flat\n * @category Data display\n * @since 0.1.0\n * @slot header Content above the body, such as a title row.\n * @slot default The card body.\n * @slot footer Content below the body, such as its actions.\n */\n@Component({\n selector: 'bf-card',\n imports: [NgTemplateOutlet],\n host: { class: 'block' },\n providers: [{ provide: BF_ACTION_HOST, useExisting: BfCardComponent }],\n template: `\n @if (interactive()) {\n <button type=\"button\" [class]=\"classes()\" (click)=\"clicked.emit($event)\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </button>\n } @else {\n <div [class]=\"classes()\"><ng-container *ngTemplateOutlet=\"content\" /></div>\n }\n <ng-template #content>\n <ng-content select=\"[bfSlot=header]\" />\n <ng-content />\n <ng-content select=\"[bfSlot=footer]\" />\n </ng-template>\n `,\n})\nexport class BfCardComponent implements BfActionHost {\n /** Surface treatment: raised (default), tint, ink, flat. */\n readonly variant = input<BfCardVariant>('raised');\n /** Whole card is a button that emits `clicked`.\n * @deprecated 0.3.0 use a bfAction link or button in the card's heading; removed in 1.0.0 */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Inner padding: md 18 px (`--spacing-card`), lg 24 px (`--spacing-card-lg`). */\n readonly padding = input<BfCardPadding>('md');\n\n /** Emitted when an interactive card is activated.\n * @deprecated 0.3.0 use a bfAction link or button in the card's heading; removed in 1.0.0 */\n readonly clicked = output<Event>();\n\n private readonly actions = signal(0);\n private readonly actionFocusVisible = signal(false);\n\n readonly classes = computed(() =>\n [\n BASE,\n VARIANT[this.variant()],\n PADDING[this.padding()],\n this.interactive() ? INTERACTIVE : ACTION[this.actionState()],\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n private readonly actionState = computed<BfCardAction>(() => {\n if (this.actions() === 0) {\n return 'none';\n }\n return this.actionFocusVisible() ? 'focused' : 'action';\n });\n\n /** @internal Called by a `bfAction` in the card. */\n registerAction(): () => void {\n this.actions.update((n) => n + 1);\n return () => this.actions.update((n) => n - 1);\n }\n\n /** @internal Called by the card's `bfAction` on focus and blur. */\n setActionFocusVisible(visible: boolean): void {\n this.actionFocusVisible.set(visible);\n }\n}\n","import { Component, booleanAttribute, computed, input } from '@angular/core';\n\n/**\n * The track height of a `bf-progress`: sm or md.\n *\n * @summary The two track heights of a progress bar, thin and regular\n * @since 0.1.0\n */\nexport type BfProgressSize = 'sm' | 'md';\n/**\n * The fill colour of a `bf-progress`: primary, success, warning or danger.\n *\n * @summary The four fill colours of a progress bar, from primary to danger\n * @since 0.1.0\n */\nexport type BfProgressTone = 'primary' | 'success' | 'warning' | 'danger';\n\nconst TRACK =\n '[grid-area:1/1] block w-full appearance-none overflow-hidden rounded-full bg-surface-sunken [&::-webkit-progress-bar]:bg-surface-sunken [&::-webkit-progress-bar]:rounded-full [&::-webkit-progress-value]:rounded-full [&::-webkit-progress-value]:transition-[width] motion-reduce:[&::-webkit-progress-value]:transition-none [&::-moz-progress-bar]:rounded-full indeterminate:[&::-moz-progress-bar]:bg-transparent';\nconst SIZE: Record<BfProgressSize, string> = { sm: 'h-2', md: 'h-2.5' };\nconst TONE: Record<BfProgressTone, string> = {\n /* primary-strong: the fill reaches 3:1 on the sunken track for any configured primary. */\n primary: '[&::-webkit-progress-value]:bg-primary-strong [&::-moz-progress-bar]:bg-primary-strong',\n success: '[&::-webkit-progress-value]:bg-success [&::-moz-progress-bar]:bg-success',\n warning: '[&::-webkit-progress-value]:bg-warning [&::-moz-progress-bar]:bg-warning',\n danger: '[&::-webkit-progress-value]:bg-danger [&::-moz-progress-bar]:bg-danger',\n};\n\n/* The indeterminate stripe: 40 % of the track, running across it; under reduced motion it stands\n still at the start, a static 40 % bar. It starts at the inline start and runs to the inline\n end, mirrored under dir=\"rtl\" by its own keyframes. Its fill follows the tone. It shares the track's grid\n cell rather than being positioned, so the host stays unpositioned: a positioned bar would sit\n above a card's stretched bfAction link and take its clicks. */\nconst STRIPE =\n 'pointer-events-none [grid-area:1/1] w-2/5 rounded-full animate-progress-indeterminate rtl:animate-progress-indeterminate-rtl motion-reduce:animate-none rtl:motion-reduce:animate-none forced-colors:bg-[CanvasText]';\nconst STRIPE_TONE: Record<BfProgressTone, string> = {\n primary: 'bg-primary-strong',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n};\n\n/**\n * Progress bar for completion and quotas, determinate by default, or `indeterminate` while the\n * amount of work is unknown.\n *\n * @example\n * <bf-progress [value]=\"68\" label=\"Atlas rebrand\" valueText=\"12 of 18 tasks\" />\n * <bf-progress indeterminate label=\"Uploading\" />\n * @summary Progress bar in two sizes and four tones for completion, quotas and unknown waits\n * @category Data display\n * @since 0.1.0\n */\n@Component({\n selector: 'bf-progress',\n host: { class: 'grid overflow-hidden rounded-full' },\n template: `\n <progress\n max=\"100\"\n [attr.value]=\"indeterminate() ? null : percent()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-valuetext]=\"valueText() || null\"\n [class]=\"classes()\"\n ></progress>\n @if (indeterminate()) {\n <span data-stripe aria-hidden=\"true\" [class]=\"stripeClasses()\"></span>\n }\n `,\n})\nexport class BfProgressComponent {\n /** Completion in percent; clamped to 0–100. Without it (and without `indeterminate`) the bar\n * shows 0 %. Ignored while `indeterminate`. */\n readonly value = input<number | undefined>(undefined);\n /** The amount of work is unknown: the native bar carries no value (assistive tech announces it\n * as busy) and a stripe runs across the track, a static 40 % bar under reduced motion. */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** The value in words for assistive tech (`aria-valuetext`), such as \"12 of 18 tasks\"; the\n * percentage is announced while it is empty. */\n readonly valueText = input('');\n /** Accessible name of the bar (\"Atlas rebrand\"). */\n readonly label = input.required<string>();\n /** Bar height: sm 8 px (default), md 10 px. */\n readonly size = input<BfProgressSize>('sm');\n /** Fill color by meaning. */\n readonly tone = input<BfProgressTone>('primary');\n\n readonly percent = computed(() => {\n const raw = this.value();\n if (raw === undefined || !Number.isFinite(raw)) {\n return 0;\n }\n return Math.min(100, Math.max(0, Math.round(raw)));\n });\n readonly classes = computed(() => `${TRACK} ${SIZE[this.size()]} ${TONE[this.tone()]}`);\n readonly stripeClasses = computed(() => `${STRIPE} ${STRIPE_TONE[this.tone()]}`);\n}\n","import { Component, computed, input } from '@angular/core';\n\n/**\n * The size of a `bf-avatar`: sm, md or lg.\n *\n * @summary The three sizes of an avatar, from a list row to a profile header\n * @since 0.1.0\n */\nexport type BfAvatarSize = 'sm' | 'md' | 'lg';\n/**\n * The colour scheme of a `bf-avatar`: tint, ink, warning or neutral.\n *\n * @summary The four colour schemes of an avatar behind its initials or icon\n * @since 0.1.0\n */\nexport type BfAvatarVariant = 'tint' | 'ink' | 'warning' | 'neutral';\n\n/* min-w/min-h in ex (the initials' x-height, about 5.9 px at 11 px): Android's font scale is a text\n zoom that grows the rendered font but not em, rem or px lengths, and ex follows the rendered\n font, so the circle grows with its initials instead of cutting them off (53 px for the sm\n avatar's 22 px initials at scale 2.0). 4.5ex keeps headroom under every size step: with Manrope\n it is 26.7 px against sm's 30 px, 31.5 against md's 40 and 63 against lg's 84, so the default\n sizes (and iOS Dynamic Type, which scales both sides) are unchanged even with a theme font whose\n x-height is up to 10 % taller. */\nconst BASE =\n 'inline-flex min-h-[4.5ex] min-w-[4.5ex] shrink-0 items-center justify-center overflow-hidden rounded-full font-extrabold uppercase select-none';\nconst SIZE: Record<BfAvatarSize, string> = {\n sm: 'size-7.5 text-nano',\n md: 'h-10 w-10 text-label-xs',\n lg: 'size-21 text-avatar-lg',\n};\nconst VARIANT: Record<BfAvatarVariant, string> = {\n tint: 'bg-primary-soft text-primary-strong',\n ink: 'bg-text text-bg',\n warning: 'bg-warning-soft text-warning',\n neutral: 'bg-neutral-soft text-neutral',\n};\n\n/**\n * Round avatar showing a photo or initials.\n *\n * @example\n * <bf-avatar initials=\"LM\" />\n * <bf-avatar src=\"/lena.jpg\" alt=\"Lena Moser\" size=\"lg\" />\n * @summary Round avatar showing a photo or initials, in three sizes and four color variants\n * @category Data display\n * @since 0.1.0\n */\n@Component({\n selector: 'bf-avatar',\n host: {\n class: 'inline-flex',\n '[attr.role]': \"alt() ? 'img' : null\",\n '[attr.aria-label]': 'alt() || null',\n '[attr.aria-hidden]': \"alt() ? null : 'true'\",\n },\n template: `\n @if (src()) {\n <img [src]=\"src()\" alt=\"\" [class]=\"classes() + ' object-cover'\" />\n } @else {\n <span aria-hidden=\"true\" [class]=\"classes()\">{{ initials() }}</span>\n }\n `,\n})\nexport class BfAvatarComponent {\n /** One or two letters shown when there is no image. */\n readonly initials = input('');\n /** Image URL; when set, the image replaces the initials. */\n readonly src = input('');\n /** Accessible name; when unset the avatar is decorative and hidden from assistive tech. */\n readonly alt = input('');\n /** Diameter: sm 30 px, md 40 px (default), lg 84 px; at least 4.5ex of the initials, so a text\n * zoom (Android font scale) grows the circle with its initials. */\n readonly size = input<BfAvatarSize>('md');\n /** Background treatment for the initials. */\n readonly variant = input<BfAvatarVariant>('tint');\n\n readonly classes = computed(() => `${BASE} ${SIZE[this.size()]} ${VARIANT[this.variant()]}`);\n}\n","import {\n Component,\n DestroyRef,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { BF_LABELS } from '../../config/labels';\n\n/**\n * The tone of a `bf-alert`: neutral, success, warning or danger.\n *\n * @summary The four tones of an alert, from neutral information to a danger message\n * @since 0.1.0\n */\nexport type BfAlertVariant = 'neutral' | 'success' | 'warning' | 'danger';\n\nconst BASE = 'flex items-start gap-3 rounded-field border-[1.5px] p-4 text-label';\nconst VARIANT: Record<BfAlertVariant, string> = {\n neutral: 'bg-surface-sunken border-transparent text-text',\n success: 'bg-success-soft border-transparent text-success',\n warning: 'bg-warning-soft border-transparent text-warning',\n danger: 'bg-danger-soft border-danger-border text-danger',\n};\n/* While dismissible, the text column reserves the dismiss button's width, so a long word never\n runs under the ×. */\nconst CONTENT_BASE = 'flex min-w-0 flex-1 flex-col gap-1';\nconst CONTENT_DISMISS: Record<'dismissible' | 'static', string> = {\n dismissible: 'pe-10',\n static: '',\n};\n\n/**\n * Inline message for the outcome of an action or the state of a screen, in a polite `status`\n * region (`urgent` makes it an assertive `alert`; `announce` makes an inserted alert heard).\n *\n * @example\n * <bf-alert variant=\"success\" title=\"Saved\" announce>Your changes are live.</bf-alert>\n * <bf-alert variant=\"danger\" title=\"Sync failed\" urgent [dismissible]=\"true\" (dismissed)=\"clear()\">Check your connection.</bf-alert>\n * @summary Inline status message in four tones with a title and an optional dismiss button\n * @category Feedback\n * @since 0.1.0\n * @slot icon An icon before the text, such as a `bf-icon`.\n * @slot default The message, under the title.\n * @slot actions Buttons under the message, such as Retry.\n */\n@Component({\n selector: 'bf-alert',\n host: { class: 'block' },\n template: `\n <div class=\"relative\">\n <div [attr.role]=\"urgent() ? 'alert' : 'status'\" [class]=\"classes()\">\n @if (filled()) {\n <ng-content select=\"[bfSlot=icon]\" />\n <div [class]=\"contentClasses()\">\n @if (title()) {\n <p class=\"font-bold wrap-anywhere\">{{ title() }}</p>\n }\n <div class=\"font-medium wrap-anywhere\"><ng-content /></div>\n <ng-content select=\"[bfSlot=actions]\" />\n </div>\n }\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n [attr.aria-label]=\"dismissName()\"\n class=\"focus-visible:ring-ring text-heading rounded-control absolute end-3 top-3 flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center leading-none font-normal text-current transition-opacity after:absolute after:-inset-1.5 after:content-[''] hover:opacity-70 focus-visible:ring-4 focus-visible:outline-hidden\"\n (click)=\"dismissed.emit()\"\n >\n &times;\n </button>\n }\n </div>\n `,\n})\nexport class BfAlertComponent {\n /** Meaning of the message. */\n readonly variant = input<BfAlertVariant>('neutral');\n /** Bold first line. */\n readonly title = input('');\n /** Shows a dismiss button that emits `dismissed`; the host decides whether to hide the alert. */\n readonly dismissible = input(false, { transform: booleanAttribute });\n /** `role=\"alert\"` (assertive) instead of `status`; for errors that need attention now. */\n readonly urgent = input(false, { transform: booleanAttribute });\n /** Renders the live region empty and fills it on the next frame, so an alert inserted after an\n * action is announced; read once, when the alert is created. */\n readonly announce = input(false, { transform: booleanAttribute });\n /** Accessible name of the dismiss button (empty falls back to `provideBfLabels()`'s `dismiss`,\n * \"Dismiss\"); with a `title` it becomes the label, a colon and the title (\"Dismiss: Saved\"). */\n readonly dismissLabel = input('');\n\n /** Emitted when the dismiss button is pressed. */\n readonly dismissed = output<void>();\n\n private readonly labels = inject(BF_LABELS);\n /** `announce` as it was when the alert was created; later changes are ignored. */\n private readonly deferred = linkedSignal<boolean, boolean>({\n source: this.announce,\n computation: (announce, previous) => previous?.value ?? announce,\n });\n private readonly frameReady = signal(false);\n /** Whether the live region holds its content (at once, or a frame later with `announce`). */\n protected readonly filled = computed(() => !this.deferred() || this.frameReady());\n\n /** The dismiss button's rendered name: `dismissLabel` (else the `dismiss` label), then the title. */\n readonly dismissName = computed(() => {\n const label = this.dismissLabel() || this.labels.dismiss;\n return this.title() ? `${label}: ${this.title()}` : label;\n });\n readonly classes = computed(() => `${BASE} ${VARIANT[this.variant()]}`);\n readonly contentClasses = computed(() =>\n [CONTENT_BASE, CONTENT_DISMISS[this.dismissible() ? 'dismissible' : 'static']]\n .filter(Boolean)\n .join(' '),\n );\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n // The empty region is in the accessibility tree by now; fill it a frame later so the change\n // is announced.\n afterNextRender(() => {\n if (!untracked(this.deferred)) {\n return;\n }\n const frame = requestAnimationFrame(() => this.frameReady.set(true));\n destroyRef.onDestroy(() => cancelAnimationFrame(frame));\n });\n }\n}\n","import { Component, input } from '@angular/core';\n\n/**\n * The heading level of a `bf-empty-state` title: `2` for a screen, `3` inside a section.\n *\n * @summary The heading level of an empty state title, two for a screen or three\n * @since 0.3.0\n */\nexport type BfEmptyStateHeadingLevel = 2 | 3;\n\n/**\n * Placeholder for a screen or list with nothing in it yet: an icon tile, a title, one sentence,\n * and the action that fills it.\n *\n * @example\n * <bf-empty-state title=\"No tasks yet\" description=\"Add your first task to get started.\">\n * <bf-icon bfSlot=\"icon\" [icon]=\"ListTodo\" size=\"lg\" />\n * <bf-button bfSlot=\"actions\" (clicked)=\"create()\">New task</bf-button>\n * </bf-empty-state>\n * @summary Placeholder for an empty screen or list with icon, title, message and action\n * @category Feedback\n * @since 0.1.0\n * @slot icon The icon in the tile above the title.\n * @slot actions Buttons under the description, such as Create.\n */\n@Component({\n selector: 'bf-empty-state',\n host: { class: 'block' },\n template: `\n <div class=\"flex flex-col items-center gap-3 px-6 py-12 text-center\">\n <div\n data-tile\n class=\"rounded-tile bg-surface-sunken text-text-muted flex h-16 w-16 items-center justify-center\"\n >\n <ng-content select=\"[bfSlot=icon]\" />\n </div>\n @if (headingLevel() === 3) {\n <h3 class=\"text-heading text-text\">{{ title() }}</h3>\n } @else {\n <h2 class=\"text-heading text-text\">{{ title() }}</h2>\n }\n @if (description()) {\n <p class=\"text-body text-text-muted max-w-sm\">{{ description() }}</p>\n }\n <div class=\"mt-2 flex flex-wrap justify-center gap-2\">\n <ng-content select=\"[bfSlot=actions]\" />\n </div>\n </div>\n `,\n})\nexport class BfEmptyStateComponent {\n /** What is missing, as a short title. */\n readonly title = input.required<string>();\n /** One sentence on how to fill it. */\n readonly description = input('');\n /** Heading level of the title so the empty state fits the page outline. */\n readonly headingLevel = input<BfEmptyStateHeadingLevel>(2);\n}\n","import { Component, input } from '@angular/core';\nimport { uniqueId } from '../_shared/unique-id';\n\n/**\n * Floating pill of actions that appears when items are selected. Position it yourself\n * (bottom-centre, above the safe area on mobile); the bar only styles itself.\n *\n * @example\n * <div class=\"fixed inset-x-0 bottom-6 flex justify-center\">\n * <bf-action-bar [label]=\"selected() + ' selected'\">\n * <bf-button variant=\"text\" size=\"sm\" (clicked)=\"clear()\">Clear</bf-button>\n * <bf-button size=\"sm\" (clicked)=\"complete()\">Mark done</bf-button>\n * </bf-action-bar>\n * </div>\n * @summary Floating pill of contextual actions that appears while items are selected\n * @category Actions\n * @since 0.1.0\n * @slot default The actions: buttons and icon buttons, laid out in the bar.\n */\n@Component({\n selector: 'bf-action-bar',\n host: { class: 'inline-flex max-w-full' },\n template: `\n <div\n role=\"group\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n class=\"bg-surface text-text shadow-floating ps-card text-label-sm rounded-control inline-flex max-w-full min-w-0 flex-wrap items-center gap-1 py-1.5 pe-1.5 font-bold\"\n >\n <!-- The count never truncates: it keeps its width (breaking a long word only past the bar's\n width), and the actions wrap onto a second row when they do not fit beside it. -->\n @if (label()) {\n <span [id]=\"labelId\" class=\"max-w-full shrink-0 pe-2.5 wrap-anywhere\">{{ label() }}</span>\n }\n <ng-content />\n </div>\n `,\n})\nexport class BfActionBarComponent {\n /** Leading text, e.g. \"2 selected\". */\n readonly label = input('');\n\n readonly labelId = uniqueId('bf-action-bar');\n}\n","import { InjectionToken, type Signal } from '@angular/core';\n\n/**\n * What `bf-tab` needs from its enclosing `bf-tab-bar`, provided through an injection token so\n * `tab-bar.component.ts` and `tab.component.ts` never import each other.\n *\n * @summary What each tab reads from its tab bar: the selection, tab stop and link mode\n * @since 0.1.0\n */\nexport interface BfTabBarHost {\n /** The id of the selected tab, the bar's `active` model. */\n readonly active: Signal<string>;\n /** The id of the tab shown as selected: `active`, or the controller's `current()` inside a\n * parent that provides `BF_TAB_BAR_CONTROLLER` (`bf-tabs`). Optional, so a custom `BF_TAB_BAR`\n * provider without it keeps working: `bf-tab` then reads `active`. */\n readonly selected?: Signal<string>;\n /** The id that currently owns the roving tab stop: the active enabled tab, or the first enabled\n * tab when nothing valid is selected. */\n readonly tabStop: Signal<string>;\n /** True when a router-aware parent provides `BF_TAB_LINKS`: the tabs render as links in a\n * `nav`, not as a `tablist`. */\n readonly linkMode: boolean;\n /**\n * The URL of tab `id` in link mode; `null` without `BF_TAB_LINKS`.\n * @param id The `id` of the tab.\n */\n linkHref(id: string): string | null;\n /**\n * Whether the current page is tab `id`'s root page (`aria-current=\"page\"`) rather than a\n * child page of it (`aria-current=\"true\"`); `true` without `BF_TAB_LINKS`.\n * @param id The `id` of the tab.\n */\n linkIsRoot(id: string): boolean;\n /**\n * Selects tab `id`, as a click on it would.\n * @param id The `id` of the tab.\n */\n select(id: string): void;\n}\n\n/**\n * The enclosing `bf-tab-bar`, as its tabs inject it.\n *\n * @summary Injection token through which each tab reaches its enclosing tab bar\n * @since 0.1.0\n */\nexport const BF_TAB_BAR = new InjectionToken<BfTabBarHost>('BF_TAB_BAR');\n\n/**\n * Provided by a router-aware parent (`bf-tabs`) to render the projected bar as a `nav` of links:\n * `href(id)` is the URL of tab `id`, used for the link's `href` (open in a new tab, copy the\n * link, see the URL). A plain click still goes through `bf-tab-bar`'s `select()`.\n *\n * @summary The URLs a router-aware parent gives a tab bar to render its tabs as links\n * @since 0.3.0\n */\nexport interface BfTabLinks {\n /**\n * The URL of tab `id`'s root page, the link's `href`.\n * @param id The `id` of the tab.\n */\n href(id: string): string;\n /**\n * Whether the current page is tab `id`'s root page; read in a reactive context, so back it\n * with signals.\n * @param id The `id` of the tab.\n */\n isRoot(id: string): boolean;\n}\n\n/**\n * The link source of a tab bar in link mode, provided by `bf-tabs`.\n *\n * @summary Injection token that turns a projected tab bar into a navigation of links\n * @since 0.3.0\n */\nexport const BF_TAB_LINKS = new InjectionToken<BfTabLinks>('BF_TAB_LINKS');\n\n/**\n * Provided by a parent that projects the bar and drives it (bf-tabs); the bar derives its state from it.\n *\n * @summary The state a parent that drives a projected tab bar gives it to derive from\n * @since 0.3.0\n */\nexport interface BfTabBarController extends BfTabLinks {\n /** The tab the parent shows: the in-flight navigation's target, else the current URL's; null when unknown. */\n readonly current: Signal<string | null>;\n /** Hide the bar (e.g. while the soft keyboard is open or about to open). */\n readonly hidden: Signal<boolean>;\n /** Animate hiding (iOS) or switch instantly. */\n readonly hideTransition: Signal<boolean>;\n /**\n * Called by the bar on a user selection of another tab.\n * @param id The `id` of the selected tab.\n */\n select(id: string): void;\n /**\n * Called by the bar on a user selection of the active tab.\n * @param id The `id` of the active tab.\n */\n reselect(id: string): void;\n}\n\n/**\n * The controller of a tab bar projected into a parent that drives it, provided by `bf-tabs`.\n *\n * @summary Injection token through which a parent drives the selection and hiding of its tab bar\n * @since 0.3.0\n */\nexport const BF_TAB_BAR_CONTROLLER = new InjectionToken<BfTabBarController>(\n 'BF_TAB_BAR_CONTROLLER',\n);\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n type ElementRef,\n viewChild,\n} from '@angular/core';\nimport { BF_LABELS } from '../../config/labels';\nimport { BF_TAB_BAR } from './tab-bar.token';\n\n/* Disabled uses tokens, never opacity: the capsule takes the sunken fill and the icon and label\n go to text-disabled (group-disabled, since both set their own colours). min-w-0 keeps a long label\n from widening the tab: it wraps to at most two lines, hyphenating a long word where the page's\n `lang` allows it (else breaking it where it must). The\n label's size and line height are capped at 200 % (22/28 px, in px because iOS Dynamic Type scales\n the root and so every rem); the 4 px vertical padding keeps a grown tab off the bar's edge. The\n capsule, the badge, the padding and the gaps are px too, so Dynamic Type grows only the label, up\n to its cap, and the bar tops out near 98 px (a capsule and two label lines), as UITabBar does. At\n compact heights (max-height 500px, phone landscape) the icon and the label sit side by side. The group is named (`group/bf-tab`) so a consumer's own\n `.group` ancestor (e.g. a card) does not also tint or dim it. The same classes serve the <button>\n (standalone, `:disabled`) and the <a> (inside bf-tabs, `aria-disabled=\"true\"`): each form only\n ever matches its own variant. */\nconst BUTTON =\n 'group/bf-tab flex min-w-0 flex-1 cursor-pointer flex-col items-center justify-center gap-[4px] py-[4px] [@media(max-height:500px)]:flex-row [@media(max-height:500px)]:gap-[6px] rounded-control no-underline! focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring disabled:cursor-not-allowed aria-disabled:cursor-not-allowed';\nconst CAPSULE_BASE =\n 'relative flex h-[30px] w-[52px] items-center justify-center rounded-control transition-colors group-disabled/bf-tab:bg-surface-sunken group-disabled/bf-tab:text-text-disabled group-aria-disabled/bf-tab:bg-surface-sunken group-aria-disabled/bf-tab:text-text-disabled';\n/* Hover tints the capsule; group-disabled comes later in the cascade, so a disabled tab keeps its\n sunken fill. A 1.5 px inset primary-strong outline marks the active capsule without relying on\n its fill (1.23:1 on the bar); a disabled active capsule outlines it in text-disabled. */\nconst CAPSULE_ACTIVE =\n 'bg-primary-soft text-primary-strong inset-ring-[1.5px] inset-ring-primary-strong group-hover/bf-tab:bg-primary-soft-hover group-disabled/bf-tab:inset-ring-text-disabled group-aria-disabled/bf-tab:inset-ring-text-disabled forced-colors:bg-[Highlight] forced-colors:text-[HighlightText]';\nconst CAPSULE_INACTIVE =\n 'text-text-muted group-hover/bf-tab:bg-surface-muted group-hover/bf-tab:text-text';\n/* Pressed (the named group is the tab's button or link): the capsule takes the soft pressed tint,\n and an inactive capsule its hover icon colour; added only while the tab is enabled. */\nconst CAPSULE_PRESSED: Record<'active' | 'inactive', string> = {\n active: 'group-active/bf-tab:bg-primary-soft-pressed',\n inactive: 'group-active/bf-tab:bg-primary-soft-pressed group-active/bf-tab:text-text',\n};\nconst LABEL_BASE =\n 'text-nano text-[length:min(var(--text-nano),22px)] leading-[min(var(--text-nano--line-height),28px)] max-w-full line-clamp-2 px-[4px] text-center font-bold wrap-break-word hyphens-auto group-disabled/bf-tab:text-text-disabled group-aria-disabled/bf-tab:text-text-disabled';\nconst LABEL_ACTIVE = 'text-primary-strong';\nconst LABEL_INACTIVE = 'text-text-muted';\n\n/**\n * One destination inside `bf-tab-bar`: icon in the default slot, `label` under it, optional count\n * `badge`. A `button role=\"tab\"` in a standalone bar; inside `bf-tabs`, a link to the tab's URL\n * with `aria-current` while active: `page` on the tab's root page, `true` on a child page of it\n * (the current section, not the current page).\n *\n * @example\n * <bf-tab id=\"today\" label=\"Today\"><bf-icon [icon]=\"Sun\" /></bf-tab>\n * @summary One tab bar destination with an icon, a label and an optional count badge\n * @category Navigation\n * @since 0.1.0\n * @slot default The tab icon, a `bf-icon` above the label.\n */\n@Component({\n selector: 'bf-tab',\n imports: [NgTemplateOutlet],\n host: { class: 'flex min-w-0 flex-1', '[attr.id]': 'null' },\n template: `\n @if (bar.linkMode) {\n <!-- Inside bf-tabs: a link (Tab moves between tabs; Ctrl/Cmd-click opens a new tab). A\n disabled tab keeps the link role without an href, so it is skipped and inert. -->\n <a\n #control\n [id]=\"id()\"\n [attr.href]=\"disabled() ? null : bar.linkHref(id())\"\n [attr.role]=\"disabled() ? 'link' : null\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.aria-current]=\"current()\"\n [attr.aria-label]=\"accessibleName()\"\n [class]=\"buttonClasses()\"\n (click)=\"onLinkClick($event)\"\n ><ng-container *ngTemplateOutlet=\"content\"\n /></a>\n } @else {\n <button\n #control\n type=\"button\"\n role=\"tab\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [attr.aria-selected]=\"active() ? 'true' : 'false'\"\n [attr.aria-label]=\"accessibleName()\"\n [tabIndex]=\"bar.tabStop() === id() ? 0 : -1\"\n [class]=\"buttonClasses()\"\n (click)=\"bar.select(id())\"\n >\n <ng-container *ngTemplateOutlet=\"content\" />\n </button>\n }\n <ng-template #content>\n <span data-capsule [class]=\"capsuleClasses()\">\n <ng-content />\n @if (badge() !== null) {\n <span\n data-badge\n aria-hidden=\"true\"\n class=\"bg-primary text-on-primary text-nano absolute -end-[8px] -top-[4px] flex h-[18px] min-w-[18px] items-center justify-center rounded-full px-[4px] text-[length:min(var(--text-nano),13px)] leading-none font-extrabold\"\n >{{ badge() }}</span\n >\n }\n </span>\n <span [class]=\"labelClasses()\">{{ label() }}</span>\n </ng-template>\n `,\n})\nexport class BfTabComponent {\n /** Stable identifier; matches `bf-tab-bar`'s `active` when this tab is selected. It is a\n * selection key only, never reflected as the DOM `id` of more than the inner `<button>` (or\n * `<a>` inside `bf-tabs`). */\n readonly id = input.required<string>();\n /** Visible label under the icon. */\n readonly label = input.required<string>();\n /** Optional count shown as a badge on the icon capsule; announced to screen readers as part of\n * the tab's accessible name (`aria-label` \"{label}, {announcement}\", with `provideBfLabels()`'s\n * `tabBadge(n)`, `\"{n} new\"`, for a number, the string as-is otherwise) since the badge itself\n * is `aria-hidden`. */\n readonly badge = input<string | number | null>(null);\n /** Disables the tab: skipped by keyboard navigation, cannot be clicked. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** The enclosing `bf-tab-bar`, provided through `BF_TAB_BAR` so the two files don't import each other. */\n readonly bar = inject(BF_TAB_BAR);\n\n private readonly labels = inject(BF_LABELS);\n\n private readonly control = viewChild.required<ElementRef<HTMLElement>>('control');\n\n /** Whether this tab is the bar's current selection. */\n readonly active = computed(() => {\n // `selected` is optional on `BfTabBarHost`: a custom host without it shows `active`.\n const selected = this.bar.selected === undefined ? this.bar.active() : this.bar.selected();\n return selected === this.id();\n });\n\n /** `aria-current` of the link form: `page` while the active tab's root page is shown, `true`\n * while a child page of it is (the tab is the current section, not the current page), else\n * `null`. */\n readonly current = computed(() => {\n if (!this.active()) {\n return null;\n }\n return this.bar.linkIsRoot(this.id()) ? 'page' : 'true';\n });\n\n /** The badge as announced after the label in the accessible name when `badge()` is set. */\n readonly badgeAnnouncement = computed(() => {\n const badge = this.badge();\n if (badge === null) {\n return null;\n }\n return typeof badge === 'number' ? this.labels.tabBadge(badge) : badge;\n });\n\n /**\n * The tab's accessible name while a badge is set, `\"{label}, {announcement}\"` (\"Projects, 3\n * new\"), as `aria-label`: one string, so no browser inserts a pause before the comma (a visually\n * hidden span is block-level, and Chromium and WebKit join block children with a space). `null`\n * without a badge, so the name is the visible label.\n */\n readonly accessibleName = computed(() => {\n const announcement = this.badgeAnnouncement();\n return announcement === null ? null : `${this.label()}, ${announcement}`;\n });\n\n readonly buttonClasses = computed(() => BUTTON);\n readonly capsuleClasses = computed(() => {\n const state = this.active() ? 'active' : 'inactive';\n return [\n CAPSULE_BASE,\n this.active() ? CAPSULE_ACTIVE : CAPSULE_INACTIVE,\n this.disabled() ? '' : CAPSULE_PRESSED[state],\n ]\n .filter(Boolean)\n .join(' ');\n });\n readonly labelClasses = computed(\n () => `${LABEL_BASE} ${this.active() ? LABEL_ACTIVE : LABEL_INACTIVE}`,\n );\n\n /** Moves keyboard focus to this tab's button (or link); called by `bf-tab-bar` after arrow-key\n * selection. */\n focus(): void {\n this.control().nativeElement.focus();\n }\n\n /**\n * A plain primary click on the link selects the tab through the bar (so `bf-tabs` restores the\n * tab's stack, plays its haptic and pops to the root on reselect) instead of following `href`. A\n * modified or non-primary click (Ctrl/Cmd, Shift, Alt, middle) is left to the browser, which\n * opens the tab's URL in a new tab or window.\n * @internal\n */\n onLinkClick(event: MouseEvent): void {\n if (event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return;\n }\n event.preventDefault();\n this.bar.select(this.id());\n }\n}\n","import {\n Component,\n booleanAttribute,\n computed,\n contentChildren,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { BF_LABELS } from '../../config/labels';\nimport {\n BF_TAB_BAR,\n BF_TAB_BAR_CONTROLLER,\n BF_TAB_LINKS,\n type BfTabBarHost,\n} from './tab-bar.token';\nimport { BfTabComponent } from './tab.component';\n\n/**\n * Floating pill tab bar for mobile apps (Meadow Sage): at least 64 px tall (it grows with a label\n * wrapped to two lines at large text sizes; at least 48 px, with icon and label side by side, at\n * compact heights such as phone landscape), inset 14 px from the sides and\n * 8 px above the bottom safe area (at least 12 px, so 20 px from the edge without an inset), one\n * `bf-tab` per destination. On its own it is a pure control with an `active` model and a `hidden`\n * input: a `tablist` whose selection follows focus with the arrow keys. Inside `bf-tabs`, which\n * provides `BF_TAB_LINKS` and `BF_TAB_BAR_CONTROLLER`, it is a `nav` of links with `aria-current`\n * on the active tab (`page` on its root page, `true` on a child page of it) whose selection and\n * hiding derive from the router and the keyboard; `active` is not written there.\n *\n * @example\n * <bf-tab-bar [(active)]=\"tab\" (changed)=\"go($event)\">\n * <bf-tab id=\"today\" label=\"Today\"><bf-icon [icon]=\"Sun\" /></bf-tab>\n * <bf-tab id=\"inbox\" label=\"Inbox\" [badge]=\"3\"><bf-icon [icon]=\"Inbox\" /></bf-tab>\n * </bf-tab-bar>\n * @summary Floating pill tab bar for mobile apps with arrow-key selection and count badges\n * @category Navigation\n * @since 0.1.0\n * @slot default The tabs, each a `bf-tab`.\n */\n@Component({\n selector: 'bf-tab-bar',\n // `hidden` is an input here: drop the static global attribute so the host never becomes\n // `display: none` instead of sliding out.\n host: { class: 'block', '[attr.hidden]': 'null' },\n providers: [{ provide: BF_TAB_BAR, useExisting: BfTabBarComponent }],\n template: `\n <nav\n [attr.aria-label]=\"name()\"\n [attr.aria-hidden]=\"isHidden() ? 'true' : null\"\n [attr.inert]=\"isHidden() ? '' : null\"\n [class]=\"navClasses()\"\n >\n <!-- Standalone: a tablist with a roving tab stop. With BF_TAB_LINKS: a plain group of links.\n At least 64 px, growing with a two-line label; at compact heights at least 48 px. In px,\n so iOS Dynamic Type (which scales the root) never grows the bar itself, as UITabBar. -->\n <div\n [attr.role]=\"linkMode ? null : 'tablist'\"\n [attr.tabindex]=\"linkMode ? null : -1\"\n class=\"flex min-h-[64px] items-stretch [@media(max-height:500px)]:min-h-[48px]\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-content />\n </div>\n </nav>\n `,\n})\nexport class BfTabBarComponent implements BfTabBarHost {\n /** The active tab's id; two-way bindable. */\n readonly active = model('');\n /** Accessible name of the navigation; empty falls back to `provideBfLabels()`'s `tabBar`\n * (\"Main\"). */\n readonly label = input('');\n private readonly labels = inject(BF_LABELS);\n /** The rendered navigation name: `label`, else the `tabBar` label. */\n readonly name = computed(() => this.label() || this.labels.tabBar);\n /** Floats fixed above the safe area with a shadow; false renders it inline in the layout flow. */\n readonly floating = input(true, { transform: booleanAttribute });\n /**\n * Slides the bar down out of view (e.g. while the soft keyboard is open); `aria-hidden` and inert\n * while hidden. Shadows the global `hidden` attribute on purpose: a static `<bf-tab-bar hidden>`\n * sets this input (the slide) and the attribute itself is removed from the host, so it never\n * becomes `display: none`.\n */\n readonly hidden = input(false, { transform: booleanAttribute });\n /** Animates hiding and showing (200 ms `translate-y`/`opacity`); false switches instantly. */\n readonly hideTransition = input(true, { transform: booleanAttribute });\n\n /** Emitted with the newly selected tab's id after a user change. */\n readonly changed = output<string>();\n /** Emitted with the active tab's id when the user selects the tab that is already active. */\n readonly reselected = output<string>();\n /**\n * Emitted with the newly selected tab's id after a user change, together with `changed`.\n * @deprecated 0.3.0 use changed; removed in 0.4.0\n */\n readonly tabChange = output<string>();\n /**\n * Emitted with the active tab's id on a reselect, together with `reselected`.\n * @deprecated 0.3.0 use reselected; removed in 0.4.0\n */\n readonly tabReselect = output<string>();\n\n /* `host`: only a parent in the template that declares this bar (`<bf-tabs><bf-tab-bar>`) turns\n it into links. A bar inside a routed page under `bf-tabs` (an in-page tab bar) is declared in\n the page's own view, so the lookup stops at the page and it stays a tablist. */\n private readonly links = inject(BF_TAB_LINKS, { optional: true, host: true });\n /** True inside a router-aware parent (`bf-tabs`): the tabs are links, not a tablist. */\n readonly linkMode = this.links !== null;\n\n /* `host`, as for `BF_TAB_LINKS`: only the parent that projects this bar drives it. */\n private readonly controller = inject(BF_TAB_BAR_CONTROLLER, { optional: true, host: true });\n\n private readonly hiddenState = signal(false);\n private readonly hideTransitionState = signal<boolean | null>(null);\n\n /** The id of the tab shown as selected: the controller's `current()` inside `bf-tabs` (empty\n * while it is unknown), else `active`. */\n readonly selected = computed(() => {\n const controller = this.controller;\n return controller ? (controller.current() ?? '') : this.active();\n });\n\n /** True while the bar is hidden, through the `hidden` input, `setHidden()` or the controller. */\n readonly isHidden = computed(\n () => this.hidden() || this.hiddenState() || (this.controller?.hidden() ?? false),\n );\n\n /** The `bf-tab` children projected into the bar, in document order. */\n readonly tabs = contentChildren(BfTabComponent);\n\n /** The id that currently owns the roving tab stop: the active enabled tab, or the first enabled\n * tab when nothing valid is selected (empty `active`, before a router binding resolves, or the\n * active tab is disabled). */\n readonly tabStop = computed(() => {\n const enabled = this.tabs().filter((t) => !t.disabled());\n if (enabled.length === 0) {\n return '';\n }\n const selected = enabled.find((t) => t.id() === this.selected());\n return (selected ?? enabled[0]).id();\n });\n\n readonly navClasses = computed(() => {\n const transition =\n this.hideTransitionState() ?? this.controller?.hideTransition() ?? this.hideTransition();\n return (\n 'bg-surface rounded-control' +\n (this.floating()\n ? ' fixed inset-x-3.5 bottom-[calc(max(var(--spacing-safe-bottom),12px)+8px)] z-(--bf-z-tabbar) shadow-floating'\n : ' shadow-raised') +\n (transition\n ? ' transition-[translate,opacity] duration-200 motion-reduce:transition-none'\n : '') +\n // Hidden: its own height plus 64 px, which clears its bottom offset (up to the safe area\n // plus 8 px) and the floating shadow.\n (this.isHidden() ? ' translate-y-[calc(100%+64px)] opacity-0 pointer-events-none' : '')\n );\n });\n\n /**\n * The imperative counterpart of the `hidden` input, for a parent that projects the bar and so\n * cannot bind it (`bf-tabs` provides `BF_TAB_BAR_CONTROLLER` instead). The bar is hidden while\n * the input, this or the controller's `hidden()` is true; `transition` overrides\n * `hideTransition` when given.\n * @param hidden Whether to hide the bar.\n * @param transition Whether the change animates (default: `hideTransition`).\n */\n setHidden(hidden: boolean, transition?: boolean): void {\n this.hiddenState.set(hidden);\n if (transition !== undefined) {\n this.hideTransitionState.set(transition);\n }\n }\n\n /**\n * Selects `id` and emits `changed`, or `reselected` when `id` is already selected; ignores\n * disabled or unknown tab ids. Inside `bf-tabs` it hands the selection to the controller\n * (`select`/`reselect`) instead of writing `active`.\n * @param id The `id` of the tab to select.\n */\n select(id: string): void {\n const tab = this.tabs().find((t) => t.id() === id);\n if (!tab || tab.disabled()) {\n return;\n }\n if (this.selected() !== id) {\n if (this.controller) {\n this.controller.select(id);\n } else {\n this.active.set(id);\n }\n this.changed.emit(id);\n this.tabChange.emit(id);\n } else {\n this.controller?.reselect(id);\n this.reselected.emit(id);\n this.tabReselect.emit(id);\n }\n }\n\n /**\n * The URL of tab `id` in link mode (`BF_TAB_LINKS`); `null` for a standalone bar.\n * @param id The `id` of the tab.\n */\n linkHref(id: string): string | null {\n return this.links ? this.links.href(id) : null;\n }\n\n /**\n * Whether the current page is tab `id`'s root page (link mode); `true` for a standalone bar.\n * @param id The `id` of the tab.\n */\n linkIsRoot(id: string): boolean {\n return this.links ? this.links.isRoot(id) : true;\n }\n\n /**\n * Arrow keys, Home and End move focus and selection along the tabs.\n * @internal\n */\n onKeydown(event: KeyboardEvent): void {\n // A nav of links moves with Tab, as links do; only a tablist has arrow-key selection.\n if (this.linkMode) {\n return;\n }\n const isNavigationKey = ['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key);\n if (!isNavigationKey) {\n return;\n }\n event.preventDefault();\n const enabled = this.tabs().filter((t) => !t.disabled());\n if (enabled.length === 0) {\n return;\n }\n const index = enabled.findIndex((t) => t.id() === this.selected());\n let next: BfTabComponent | undefined;\n switch (event.key) {\n case 'ArrowRight':\n next = index === -1 ? enabled[0] : enabled[(index + 1) % enabled.length];\n break;\n case 'ArrowLeft':\n next =\n index === -1\n ? enabled[enabled.length - 1]\n : enabled[(index - 1 + enabled.length) % enabled.length];\n break;\n case 'Home':\n next = enabled[0];\n break;\n case 'End':\n next = enabled[enabled.length - 1];\n break;\n }\n if (!next) {\n return;\n }\n if (next.id() !== this.selected()) {\n this.select(next.id());\n }\n next.focus();\n }\n}\n","import { DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { BF_ACTION_HOST } from './action-host.token';\n\n/**\n * The one interactive element of a `bf-card` or `bf-list-item` (the stretched-link pattern): put\n * it on the `<a>` (navigation) or `<button>` (an action) that holds the card's heading text or the\n * row's title. Its `::after` stretches the hit area over the nearest positioned ancestor (the card\n * box, the row), so the whole surface is clickable while only the heading's link or button is\n * exposed: the heading stays a heading and the accessible name is the title alone. It registers\n * with the nearest card or row, which then draws the pointer, the hover and, while the action has\n * keyboard focus, the focus ring; a card is never lit by the actions of rows nested in it. Give\n * secondary controls inside the surface `class=\"relative z-1\"` so they stay clickable above the\n * stretched area.\n *\n * @example\n * <bf-card>\n * <h3 class=\"text-heading\"><a bfAction routerLink=\"/projects/atlas\">Atlas rebrand</a></h3>\n * </bf-card>\n * @summary Makes one link or button the click target of a whole card or list row\n * @since 0.3.0\n */\n@Directive({\n selector: 'a[bfAction], button[bfAction]',\n host: {\n 'data-bf-action': '',\n // A button[bfAction] gets the pointer a link has natively. The surface draws the focus ring\n // (a box-shadow); forced colours drop it, and the transparent outline on the ::after (around\n // the whole surface) becomes the visible indicator there.\n class:\n \"cursor-pointer after:absolute after:inset-0 after:content-[''] focus-visible:outline-none focus-visible:after:outline-hidden\",\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n },\n})\nexport class BfActionDirective {\n private readonly host = inject(BF_ACTION_HOST, { optional: true });\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n constructor() {\n const unregister = this.host?.registerAction();\n inject(DestroyRef).onDestroy(() => {\n this.host?.setActionFocusVisible(false);\n unregister?.();\n });\n }\n\n /**\n * Tells the host card or row whether its action has keyboard focus.\n * @internal\n */\n onFocus(): void {\n this.host?.setActionFocusVisible(this.element.matches(':focus-visible'));\n }\n\n /**\n * Tells the host card or row that its action lost focus.\n * @internal\n */\n onBlur(): void {\n this.host?.setActionFocusVisible(false);\n }\n}\n","import {\n DOCUMENT,\n DestroyRef,\n type EnvironmentProviders,\n inject,\n provideEnvironmentInitializer,\n} from '@angular/core';\n\n/**\n * Removes what overlays and themes leave on a document: the `dark` and `cdk-global-scrollblock`\n * classes on `<html>`, `inert` on the children of `<body>`, and every child of a\n * `.cdk-overlay-container`. Internal: shared by `provideBfTesting()` (`@bitforgehq/ui/testing`)\n * and `provideBfShellTesting()` (`@bitforgehq/ui/mobile`).\n */\nexport function resetBfDocument(document: Document): void {\n document.documentElement.classList.remove('dark', 'cdk-global-scrollblock');\n for (const child of Array.from(document.body.children)) {\n child.removeAttribute('inert');\n }\n for (const container of Array.from(document.querySelectorAll('.cdk-overlay-container'))) {\n container.replaceChildren();\n }\n}\n\n/** Runs `resetBfDocument()` when the environment injector that holds it is destroyed. Internal. */\nexport function provideBfDocumentReset(): EnvironmentProviders {\n return provideEnvironmentInitializer(() => {\n const document = inject(DOCUMENT);\n inject(DestroyRef).onDestroy(() => resetBfDocument(document));\n });\n}\n"],"mappings":"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"}