@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
package/theme.css ADDED
@@ -0,0 +1,253 @@
1
+ /*
2
+ * @bitforgehq/ui — Meadow Sage design tokens.
3
+ * Source: docs/design/foundations.md (extracted from docs/design/meadow-sage.dc.html).
4
+ *
5
+ * Usage (web and mobile apps alike):
6
+ * @import 'tailwindcss';
7
+ * @import '@bitforgehq/ui/theme.css';
8
+ * @theme { --color-primary: #123456; } <- optional per-app overrides go AFTER this import
9
+ *
10
+ * An app that overrides --color-primary also overrides --color-primary-text (primary as text, which
11
+ * must keep 4.5:1 on bg and surface) and the rest of the brand set, in both @theme and .dark; the
12
+ * docs site's theme configurator derives all of them, contrast-checked, from one colour.
13
+ *
14
+ * Tailwind v4 skips node_modules, so this file registers the compiled library as a source: the
15
+ * FESM code only, not the source maps beside it (they stay in the package for debugging, but
16
+ * are ~500 kB of redundant scan input). The path is relative to this stylesheet inside the
17
+ * published package (dist/ui/theme.css).
18
+ */
19
+ @source './fesm2022/*.mjs';
20
+
21
+ /* Class-based dark mode: put `dark` on <html>. Components need no `dark:` classes because every
22
+ token below is redefined under .dark and utilities resolve to the CSS variables. */
23
+ @custom-variant dark (&:where(.dark, .dark *));
24
+
25
+ @theme {
26
+ /* Type — Manrope for everything, JetBrains Mono for technical labels. Fonts are loaded by the app. */
27
+ --font-sans: 'Manrope', ui-sans-serif, system-ui, sans-serif;
28
+ --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, monospace;
29
+
30
+ /* Type scale in rem, so a user's font-size preference scales every style together (px at a
31
+ 16 px root in the comments). 8 sizes: display 40, title 28, heading 18, body/label 15,
32
+ label-sm 14, caption/label-xs 13, micro 12, nano 11. */
33
+ --text-display: 2.5rem; /* 40/44 */
34
+ --text-display--line-height: 2.75rem;
35
+ --text-display--font-weight: 800;
36
+ --text-display--letter-spacing: -0.03em;
37
+ --text-title: 1.75rem; /* 28/34 */
38
+ --text-title--line-height: 2.125rem;
39
+ --text-title--font-weight: 800;
40
+ --text-title--letter-spacing: -0.02em;
41
+ --text-heading: 1.125rem; /* 18/26 */
42
+ --text-heading--line-height: 1.625rem;
43
+ --text-heading--font-weight: 700;
44
+ --text-body: 0.9375rem; /* 15/24 */
45
+ --text-body--line-height: 1.5rem;
46
+ --text-body--font-weight: 500;
47
+ --text-caption: 0.8125rem; /* 13/18 */
48
+ --text-caption--line-height: 1.125rem;
49
+ --text-caption--font-weight: 600;
50
+
51
+ /* Control and label sizes. No forced weight (except micro); widgets add font-bold/semibold. */
52
+ --text-label: 0.9375rem; /* 15/20: control labels, list titles */
53
+ --text-label--line-height: 1.25rem;
54
+ --text-label-sm: 0.875rem; /* 14/20: md controls, chips */
55
+ --text-label-sm--line-height: 1.25rem;
56
+ --text-label-xs: 0.8125rem; /* 13/16: sm controls, avatar md */
57
+ --text-label-xs--line-height: 1rem;
58
+ --text-micro: 0.75rem; /* 12/16: badges, help and error text */
59
+ --text-micro--line-height: 1rem;
60
+ --text-micro--font-weight: 600;
61
+ --text-nano: 0.6875rem; /* 11/14: tab labels, avatar sm */
62
+ --text-nano--line-height: 0.875rem;
63
+ --text-avatar-lg: 1.625rem; /* 26: initials of the 84 px avatar (84 x 0.31) */
64
+
65
+ /* Surfaces */
66
+ --color-bg: #f7f5ef;
67
+ --color-surface: #ffffff;
68
+ --color-surface-muted: #efece5; /* dE 1.9 from bg, so hover rows read on bg */
69
+ --color-surface-sunken: #efece3;
70
+ --color-surface-pressed: #e4e0d6; /* pressed neutral surfaces: rows, chips off, segments (text >= 4.5:1) */
71
+ --color-selected: #efeffd;
72
+
73
+ /* Brand */
74
+ --color-primary: #2b26ba;
75
+ --color-primary-hover: #241fa3;
76
+ --color-primary-pressed: #1f1b8c; /* primary filled while pressed */
77
+ --color-primary-soft: #e6e6fb;
78
+ --color-primary-soft-hover: #d9d8f8;
79
+ --color-primary-soft-pressed: #cfcdf6; /* tonal fills and outline/text buttons while pressed */
80
+ --color-primary-strong: #1a1680;
81
+ --color-on-primary: #ffffff;
82
+ --color-primary-text: #2b26ba; /* primary as text (text button, links, focused label): >= 4.5:1 on bg and surface */
83
+
84
+ /* Status */
85
+ --color-success: #1f5a3a;
86
+ --color-success-soft: #ddefe3;
87
+ --color-warning: #7a4a12;
88
+ --color-warning-soft: #fbe6cf;
89
+ --color-danger: #9a2f1f;
90
+ --color-danger-soft: #f8dcd6;
91
+ --color-danger-pressed: #7f2618; /* danger button while pressed, under danger-soft text */
92
+ --color-danger-border: #c8452f;
93
+ --color-neutral: #4a5347;
94
+ --color-neutral-soft: #efece3;
95
+
96
+ /* Lines */
97
+ --color-border: #e4e0d4; /* decorative lines only (dividers, card edges) */
98
+ --color-border-strong: #8e8e82; /* control boundaries: >= 3:1 on surface and bg */
99
+ --color-divider: #efece3;
100
+ /* Toggle off track (>= 3:1), and the border of a read-only off track, where it must hold >= 3:1
101
+ on both surface (3.28:1) and bg (3.01:1): check both before retuning this token or --color-bg. */
102
+ --color-control-off: #8d8f84;
103
+ /* Black in both modes (never the text colour, which is light in dark mode): backdrops, stack dim. */
104
+ --color-scrim: #000000;
105
+
106
+ /* Text */
107
+ --color-text: #1f2a22;
108
+ --color-text-secondary: #4a5347;
109
+ --color-text-muted: #5b6555; /* also placeholders: >= 4.5:1 on surface, surface-sunken, primary-soft, surface-pressed */
110
+ --color-text-subtle: #869181; /* icons and chevrons only (>= 3:1), never text */
111
+ --color-text-disabled: #a5aa9f;
112
+ --color-text-done: #8a9384;
113
+
114
+ /* Focus ring (4 px, primary-tinted, >= 3:1 on bg and surface: WCAG 1.4.11) */
115
+ --color-ring: #8784dc;
116
+
117
+ /* Shape */
118
+ --radius-tile: 12px;
119
+ --radius-field: 16px;
120
+ --radius-card: 24px;
121
+ --radius-checkbox: 7px; /* the design's fixed checkbox radius, not scaled with the others */
122
+ --radius-control: 9999px; /* pills: buttons, chips, badges, segmented, tab bar, action bar, toggle */
123
+
124
+ /* Elevation */
125
+ --shadow-raised: 0 1px 2px rgb(31 42 34 / 0.06), 0 8px 24px rgb(31 42 34 / 0.08);
126
+ --shadow-floating: 0 10px 30px rgb(31 42 34 / 0.18);
127
+ --shadow-segment: 0 1px 3px rgb(31 42 34 / 0.14);
128
+
129
+ /* Spacing: semantic steps on top of --spacing (0.25rem). The declared scale is
130
+ 2 4 6 8 10 12 14 16 18 20 24 32 48 px, written as --spacing multiples (0.5 ... 12, with 3.5
131
+ and 4.5); never arbitrary px. */
132
+ --spacing-gutter: 1rem; /* 16: screen-edge inset (toast, alert dialog) */
133
+ --spacing-card: 1.125rem; /* 18: bf-card md, action-bar start */
134
+ --spacing-card-lg: 1.5rem; /* 24: bf-card lg */
135
+ --spacing-control-sm: 2rem; /* 32: sm control height (h-8) */
136
+ --spacing-control-md: 2.5rem; /* 40: md control height (h-10) */
137
+ --spacing-control-lg: 3rem; /* 48: lg control height (h-12) */
138
+ --spacing-hit: 2.75rem; /* 44: minimum hit area (min-h-hit) */
139
+ --spacing-box: 1.375rem; /* 22: checkbox, radio, toggle knob, count badge (size-box) */
140
+
141
+ /* Motion: mirrors projects/ui/mobile/motion.ts. */
142
+ --ease-ios: cubic-bezier(0.32, 0.72, 0, 1);
143
+ --ease-md: cubic-bezier(0.2, 0, 0, 1);
144
+ --ease-settle: cubic-bezier(0.2, 0.8, 0.3, 1);
145
+
146
+ /* bf-progress indeterminate: a 40 % stripe runs across the track from the inline start (static
147
+ under reduced motion); the -rtl pair runs it the other way under dir="rtl". */
148
+ --animate-progress-indeterminate: bf-progress-indeterminate 1.4s var(--ease-md) infinite;
149
+ --animate-progress-indeterminate-rtl: bf-progress-indeterminate-rtl 1.4s var(--ease-md) infinite;
150
+ @keyframes bf-progress-indeterminate {
151
+ from {
152
+ transform: translateX(-100%);
153
+ }
154
+ to {
155
+ transform: translateX(250%);
156
+ }
157
+ }
158
+ @keyframes bf-progress-indeterminate-rtl {
159
+ from {
160
+ transform: translateX(100%);
161
+ }
162
+ to {
163
+ transform: translateX(-250%);
164
+ }
165
+ }
166
+
167
+ /* Safe areas: Capacitor 8.3+ injects --safe-area-inset-* on Android; env() covers iOS and web. */
168
+ --spacing-safe-top: var(--safe-area-inset-top, env(safe-area-inset-top, 0px));
169
+ --spacing-safe-bottom: var(--safe-area-inset-bottom, env(safe-area-inset-bottom, 0px));
170
+ --spacing-safe-left: var(--safe-area-inset-left, env(safe-area-inset-left, 0px));
171
+ --spacing-safe-right: var(--safe-area-inset-right, env(safe-area-inset-right, 0px));
172
+ }
173
+
174
+ /* Not Tailwind theme namespaces: plain custom properties. Durations mirror mobile/motion.ts;
175
+ Tailwind v4 has no z-index namespace, so layers are used as z-(--bf-z-*). */
176
+ :root {
177
+ color-scheme: light; /* native scrollbars and form controls match the light palette */
178
+ --bf-duration-fast: 150ms; /* colour transitions, reduced-motion fade */
179
+ --bf-duration-overlay: 260ms; /* overlays, modal depth */
180
+ --bf-duration-push: 500ms; /* iOS push/pop */
181
+ --bf-z-sticky: 10; /* translucent header */
182
+ --bf-z-tabbar: 20; /* floating tab bar */
183
+ --bf-z-dim: 2; /* stack-outlet dim layer (frames use 0/1/3 around it) */
184
+ --bf-z-overlay: 1000; /* CDK overlay container (documented, CDK sets it) */
185
+ }
186
+
187
+ /* Dark palette: neutral grays (no brand tint, so any primary fits) with the indigo brand lifted
188
+ for dark backgrounds. Status colors are derived (lighter text, deep soft tints). */
189
+ .dark {
190
+ color-scheme: dark; /* dark scrollbars, form controls and canvas under the dark palette */
191
+ --color-bg: #111214;
192
+ --color-surface: #1e2024;
193
+ --color-surface-muted: #262930;
194
+ --color-surface-sunken: #18191c; /* distinct from bg and surface, so tracks read on the page */
195
+ --color-surface-pressed: #2e3139;
196
+ --color-selected: #1b1c44;
197
+
198
+ --color-primary: #8c88f5;
199
+ --color-primary-hover: #a3a0f8;
200
+ --color-primary-pressed: #b9b7fb;
201
+ --color-primary-soft: #23245a;
202
+ --color-primary-soft-hover: #2d2e6c;
203
+ --color-primary-soft-pressed: #34357a;
204
+ --color-primary-strong: #b3b0ff;
205
+ --color-on-primary: #0c0b3a;
206
+ --color-primary-text: #8c88f5; /* explicit (not var(--color-primary)) so a .dark sub-tree resolves */
207
+
208
+ --color-success: #5cc48a;
209
+ --color-success-soft: #1d3327;
210
+ --color-warning: #f0b562;
211
+ --color-warning-soft: #3a2c16;
212
+ --color-danger: #f0897a;
213
+ --color-danger-soft: #3d1f1a;
214
+ --color-danger-pressed: #f4a497;
215
+ --color-danger-border: #d3563f;
216
+ --color-neutral: #b8bbc2;
217
+ --color-neutral-soft: #24262b;
218
+
219
+ --color-border: #2a2c31;
220
+ --color-border-strong: #686a70;
221
+ --color-divider: #222429;
222
+ --color-control-off: #686a70;
223
+ --color-scrim: #000000;
224
+
225
+ --color-text: #ececee;
226
+ --color-text-secondary: #c9cbd0;
227
+ --color-text-muted: #9a9da5;
228
+ --color-text-subtle: #6f727a;
229
+ --color-text-disabled: #55585f;
230
+ --color-text-done: #7c7f87;
231
+
232
+ --color-ring: #6362af;
233
+
234
+ --shadow-raised: 0 1px 2px rgb(0 0 0 / 0.4), 0 8px 24px rgb(0 0 0 / 0.35);
235
+ --shadow-floating: 0 10px 30px rgb(0 0 0 / 0.5);
236
+ --shadow-segment: 0 1px 3px rgb(0 0 0 / 0.5);
237
+ }
238
+
239
+ /* ---------- Mobile overlays ---------- */
240
+ /*
241
+ * Backdrop of `BfOverlayService` overlays (`backdropClass` default). The CDK overlay container,
242
+ * panes and backdrops render outside every component, so the rule lives here. The structural CDK
243
+ * rules (`.cdk-overlay-container`, `.cdk-overlay-pane`, `.cdk-overlay-backdrop`, …) are not
244
+ * repeated: CDK 22 injects them itself the first time an overlay is created.
245
+ */
246
+ /* The scrim (--color-scrim, black in both modes) at 40 % / 60 %. Literal rgb() because relative
247
+ colour syntax (rgb(from var(--color-scrim) ...)) needs Safari 16.4+. */
248
+ .bf-overlay-backdrop {
249
+ background: rgb(0 0 0 / 0.4);
250
+ }
251
+ .dark .bf-overlay-backdrop {
252
+ background: rgb(0 0 0 / 0.6);
253
+ }
@@ -0,0 +1,50 @@
1
+ import { IconNode } from "lucide";
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * The size of a `bf-icon`: sm 16, md 20 or lg 24 px.
5
+ *
6
+ * @summary The three icon sizes, 16, 20 and 24 pixels, matching the text sizes
7
+ * @since 0.1.0
8
+ */
9
+ type BfIconSize = 'sm' | 'md' | 'lg';
10
+ /**
11
+ * Renders a Lucide icon from its data, tree-shakably and without a registry.
12
+ * Import the icon you need from `lucide` (e.g. `import { Search } from 'lucide'`) and bind it.
13
+ * Decorative by default; pass `label` when the icon carries meaning on its own (e.g. an icon-only
14
+ * control without visible text).
15
+ *
16
+ * @example
17
+ * <bf-icon [icon]="Search" />
18
+ * <bf-icon [icon]="Search" label="Search" size="lg" />
19
+ * @summary Tree-shakable Lucide icon renderer, decorative by default or labelled when meaningful
20
+ * @category Icons
21
+ * @since 0.1.0
22
+ */
23
+ export declare class BfIconComponent {
24
+ /** Lucide icon data, e.g. `Search` from `lucide`. */
25
+ readonly icon: import("@angular/core").InputSignal<IconNode>;
26
+ /** Visual size: 16, 20 or 24 px. */
27
+ readonly size: import("@angular/core").InputSignal<BfIconSize>;
28
+ /** Accessible name. Leave empty for decorative icons next to visible text. */
29
+ readonly label: import("@angular/core").InputSignal<string>;
30
+ readonly px: import("@angular/core").Signal<number>;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfIconComponent, never>;
32
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfIconComponent, "bf-icon", never, {
33
+ "icon": {
34
+ "alias": "icon";
35
+ "required": true;
36
+ "isSignal": true;
37
+ };
38
+ "size": {
39
+ "alias": "size";
40
+ "required": false;
41
+ "isSignal": true;
42
+ };
43
+ "label": {
44
+ "alias": "label";
45
+ "required": false;
46
+ "isSignal": true;
47
+ };
48
+ }, {}, never, never, true, never>;
49
+ }
50
+ export type { BfIconSize };