@bitforgehq/ui 0.3.3 → 0.5.0-next.3

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 (99) hide show
  1. package/CHANGELOG.md +394 -0
  2. package/README.md +14 -14
  3. package/ai/MANIFEST.index.json +101 -2
  4. package/ai/MANIFEST.json +2630 -746
  5. package/ai/REFERENCE.index.json +196 -0
  6. package/ai/REFERENCE.json +1625 -140
  7. package/ai/UI_GUIDE.md +83 -21
  8. package/ai/components/app-frame.md +1 -1
  9. package/ai/components/badge.md +39 -2
  10. package/ai/components/chat-composer.md +357 -0
  11. package/ai/components/chat-message.md +251 -0
  12. package/ai/components/chat-thread.md +521 -0
  13. package/ai/components/checkbox.md +7 -0
  14. package/ai/components/combobox.md +12 -0
  15. package/ai/components/date-input.md +9 -0
  16. package/ai/components/datetime-input.md +2 -0
  17. package/ai/components/field.md +10 -0
  18. package/ai/components/file-input.md +498 -0
  19. package/ai/components/header.md +1 -1
  20. package/ai/components/image-input.md +368 -0
  21. package/ai/components/image-viewer.md +309 -0
  22. package/ai/components/list-item.md +105 -9
  23. package/ai/components/media-card.md +478 -0
  24. package/ai/components/menu-button.md +2 -0
  25. package/ai/components/menu.md +10 -0
  26. package/ai/components/multi-combobox.md +7 -0
  27. package/ai/components/nav-group.md +10 -3
  28. package/ai/components/nav-item.md +11 -2
  29. package/ai/components/number-input.md +2 -7
  30. package/ai/components/popover.md +13 -0
  31. package/ai/components/radio-group.md +6 -0
  32. package/ai/components/segmented.md +14 -2
  33. package/ai/components/select.md +100 -42
  34. package/ai/components/sidebar-toggle.md +16 -9
  35. package/ai/components/sidebar.md +41 -13
  36. package/ai/components/step.md +112 -0
  37. package/ai/components/steps.md +124 -0
  38. package/ai/components/tab-group.md +18 -2
  39. package/ai/components/table.md +115 -4
  40. package/ai/components/theme-menu-button.md +1 -0
  41. package/ai/components/time-input.md +2 -0
  42. package/ai/components/timeline-event.md +144 -0
  43. package/ai/components/timeline.md +201 -0
  44. package/ai/components/toggle.md +11 -1
  45. package/ai/components/toolbar.md +7 -18
  46. package/ai/reference/bf-action-directive.md +3 -1
  47. package/ai/reference/bf-badge-emphasis.md +27 -0
  48. package/ai/reference/bf-chat-composer-harness.md +64 -0
  49. package/ai/reference/bf-chat-message-role.md +27 -0
  50. package/ai/reference/bf-chat-message-status.md +28 -0
  51. package/ai/reference/bf-fade-in-directive.md +18 -0
  52. package/ai/reference/bf-file-input-harness.md +67 -0
  53. package/ai/reference/bf-file-input-variant.md +27 -0
  54. package/ai/reference/bf-image-input-harness.md +67 -0
  55. package/ai/reference/bf-image-input-shape.md +27 -0
  56. package/ai/reference/bf-image-viewer-actions-context.md +29 -0
  57. package/ai/reference/bf-image-viewer-harness.md +87 -0
  58. package/ai/reference/bf-image-viewer-image.md +25 -0
  59. package/ai/reference/bf-image-viewer-options.md +33 -0
  60. package/ai/reference/bf-image-viewer-origin.md +23 -0
  61. package/ai/reference/bf-image-viewer-ref.md +55 -0
  62. package/ai/reference/bf-image-viewer-service.md +32 -0
  63. package/ai/reference/bf-labels.md +105 -74
  64. package/ai/reference/bf-media-card-aspect.md +28 -0
  65. package/ai/reference/bf-media-card-harness.md +66 -0
  66. package/ai/reference/bf-motion-list-directive.md +22 -0
  67. package/ai/reference/bf-prose-directive.md +16 -0
  68. package/ai/reference/bf-rejected-file-reason.md +28 -0
  69. package/ai/reference/bf-rejected-file.md +28 -0
  70. package/ai/reference/bf-select-harness.md +14 -5
  71. package/ai/reference/bf-select-option.md +2 -0
  72. package/ai/reference/bf-size.md +3 -0
  73. package/ai/reference/bf-step-heading-level.md +28 -0
  74. package/ai/reference/bf-table-align.md +1 -1
  75. package/ai/reference/bf-table-column-align.md +33 -0
  76. package/ai/reference/bf-table-column.md +7 -7
  77. package/ai/reference/bf-table-harness.md +12 -0
  78. package/ai/reference/bf-timeline-tone.md +31 -0
  79. package/ai/reference/bf-toggle-harness.md +55 -0
  80. package/ai/reference/bf_table_sort_select.md +23 -0
  81. package/ai/reference/provide-bf-labels.md +10 -3
  82. package/ai/reference/provide-bf-select.md +20 -0
  83. package/bin/bf-ui.js +1 -0
  84. package/dark-ink.css +124 -0
  85. package/fesm2022/bitforgehq-ui-mobile.mjs +2 -1
  86. package/fesm2022/bitforgehq-ui-mobile.mjs.map +1 -1
  87. package/fesm2022/bitforgehq-ui-overlay.mjs +2649 -606
  88. package/fesm2022/bitforgehq-ui-overlay.mjs.map +1 -1
  89. package/fesm2022/bitforgehq-ui-testing.mjs +406 -11
  90. package/fesm2022/bitforgehq-ui-testing.mjs.map +1 -1
  91. package/fesm2022/bitforgehq-ui.mjs +11149 -6957
  92. package/fesm2022/bitforgehq-ui.mjs.map +1 -1
  93. package/llms-full.txt +5219 -141
  94. package/llms.txt +40 -1
  95. package/package.json +2 -1
  96. package/theme.css +84 -0
  97. package/types/bitforgehq-ui-overlay.d.ts +684 -7
  98. package/types/bitforgehq-ui-testing.d.ts +510 -7
  99. package/types/bitforgehq-ui.d.ts +1757 -186
package/llms.txt CHANGED
@@ -35,6 +35,7 @@
35
35
  ### Forms
36
36
 
37
37
  - [bf-calendar](https://bitforge-ui.web.app/ai/components/calendar.md): Inline month calendar for picking one date, with month and year jumps ([docs](https://bitforge-ui.web.app/components/calendar))
38
+ - [bf-chat-composer](https://bitforge-ui.web.app/ai/components/chat-composer.md): Chat input that grows with the text and sends on Enter, or stops a reply ([docs](https://bitforge-ui.web.app/components/chat-composer))
38
39
  - [bf-checkbox](https://bitforge-ui.web.app/ai/components/checkbox.md): Rounded checkbox with an optional label that binds to Signal Forms ([docs](https://bitforge-ui.web.app/components/checkbox))
39
40
  - [bf-chip](https://bitforge-ui.web.app/ai/components/chip.md): Toggleable filter chip with a check mark when selected, in tonal or ink style ([docs](https://bitforge-ui.web.app/components/chip))
40
41
  - [bf-chip-group](https://bitforge-ui.web.app/ai/components/chip-group.md): Named row of chips that picks one like radios, or groups independent toggles ([docs](https://bitforge-ui.web.app/components/chip-group))
@@ -42,12 +43,14 @@
42
43
  - [bf-date-input](https://bitforge-ui.web.app/ai/components/date-input.md): Typed date field with a calendar popover, valued as an ISO date string ([docs](https://bitforge-ui.web.app/components/date-input))
43
44
  - [bf-datetime-input](https://bitforge-ui.web.app/ai/components/datetime-input.md): Typed date and time field with a calendar and time list in one popover ([docs](https://bitforge-ui.web.app/components/datetime-input))
44
45
  - [bf-field](https://bitforge-ui.web.app/ai/components/field.md): Label, help text and error text wrapper that wires ids for assistive tech ([docs](https://bitforge-ui.web.app/components/field))
46
+ - [bf-file-input](https://bitforge-ui.web.app/ai/components/file-input.md): File picker field that lists picked or dropped files and checks type, size and count ([docs](https://bitforge-ui.web.app/components/file-input))
47
+ - [bf-image-input](https://bitforge-ui.web.app/ai/components/image-input.md): Single-image picker with a round or square preview tile and replace or remove ([docs](https://bitforge-ui.web.app/components/image-input))
45
48
  - [bf-input](https://bitforge-ui.web.app/ai/components/input.md): Single-line text field with label, help and error text, icon slots and Signal Forms binding ([docs](https://bitforge-ui.web.app/components/input))
46
49
  - [bf-multi-combobox](https://bitforge-ui.web.app/ai/components/multi-combobox.md): Text field that filters options as you type and picks several as tags ([docs](https://bitforge-ui.web.app/components/multi-combobox))
47
50
  - [bf-number-input](https://bitforge-ui.web.app/ai/components/number-input.md): Number field that binds number or null, with native min, max and step ([docs](https://bitforge-ui.web.app/components/number-input))
48
51
  - [bf-radio-group](https://bitforge-ui.web.app/ai/components/radio-group.md): Group of radio buttons for choosing one option, with optional per-option descriptions ([docs](https://bitforge-ui.web.app/components/radio-group))
49
52
  - [bf-segmented](https://bitforge-ui.web.app/ai/components/segmented.md): Segmented control for switching between two to four views, keyboard-navigable like radios ([docs](https://bitforge-ui.web.app/components/segmented))
50
- - [bf-select](https://bitforge-ui.web.app/ai/components/select.md): Native single-choice dropdown styled like the text field, with Signal Forms binding ([docs](https://bitforge-ui.web.app/components/select))
53
+ - [bf-select](https://bitforge-ui.web.app/ai/components/select.md): Single-choice dropdown with a styled list, native under touch, with Signal Forms binding ([docs](https://bitforge-ui.web.app/components/select))
51
54
  - [bf-textarea](https://bitforge-ui.web.app/ai/components/textarea.md): Multi-line text field with label, help and error text, and Signal Forms binding ([docs](https://bitforge-ui.web.app/components/textarea))
52
55
  - [bf-theme-switch](https://bitforge-ui.web.app/ai/components/theme-switch.md): Segmented System, Light and Dark switch bound two-way to the app colour scheme ([docs](https://bitforge-ui.web.app/components/theme-switch))
53
56
  - [bf-time-input](https://bitforge-ui.web.app/ai/components/time-input.md): Typed time-of-day field with a popover list of times, valued as an ISO string ([docs](https://bitforge-ui.web.app/components/time-input))
@@ -60,16 +63,23 @@
60
63
  - [bf-bar-chart](https://bitforge-ui.web.app/ai/components/bar-chart.md): Bar chart of series over categories, grouped or stacked, vertical or horizontal ([docs](https://bitforge-ui.web.app/components/bar-chart))
61
64
  - [bf-card](https://bitforge-ui.web.app/ai/components/card.md): Content surface with an optional header slot, in four visual styles from raised to flat ([docs](https://bitforge-ui.web.app/components/card))
62
65
  - [bf-chart-card](https://bitforge-ui.web.app/ai/components/chart-card.md): Card around one chart with a title, period control and loading, empty and error states ([docs](https://bitforge-ui.web.app/components/chart-card))
66
+ - [bf-chat-message](https://bitforge-ui.web.app/ai/components/chat-message.md): One chat message, a user bubble or a full-width assistant reply that can stream ([docs](https://bitforge-ui.web.app/components/chat-message))
67
+ - [bf-chat-thread](https://bitforge-ui.web.app/ai/components/chat-thread.md): Scrolling chat message log that follows new text and offers a jump to latest ([docs](https://bitforge-ui.web.app/components/chat-thread))
63
68
  - [div[bfDescriptionItem]](https://bitforge-ui.web.app/ai/components/description-item.md): One label and value pair of a description list, label as term, content as value ([docs](https://bitforge-ui.web.app/components/description-item))
64
69
  - [bf-description-list](https://bitforge-ui.web.app/ai/components/description-list.md): Native description list of label-value pairs, as divided rows or a tile grid ([docs](https://bitforge-ui.web.app/components/description-list))
65
70
  - [bf-donut-chart](https://bitforge-ui.web.app/ai/components/donut-chart.md): Donut chart of the parts of a whole, with a legend, tooltip and centre slot ([docs](https://bitforge-ui.web.app/components/donut-chart))
66
71
  - [bf-line-chart](https://bitforge-ui.web.app/ai/components/line-chart.md): Line chart of series over categories, with tooltip, legend and data table ([docs](https://bitforge-ui.web.app/components/line-chart))
67
72
  - [bf-list](https://bitforge-ui.web.app/ai/components/list.md): Container for list rows, inset by default with rounded corners on a warm background ([docs](https://bitforge-ui.web.app/components/list))
68
73
  - [bf-list-item](https://bitforge-ui.web.app/ai/components/list-item.md): List row with leading slot, title, subtitle, trailing slot and an optional chevron ([docs](https://bitforge-ui.web.app/components/list-item))
74
+ - [bf-media-card](https://bitforge-ui.web.app/ai/components/media-card.md): Card with an image that loads, fades in or fails, plus a body and actions ([docs](https://bitforge-ui.web.app/components/media-card))
69
75
  - [bf-progress](https://bitforge-ui.web.app/ai/components/progress.md): Progress bar in two sizes and four tones for completion, quotas and unknown waits ([docs](https://bitforge-ui.web.app/components/progress))
70
76
  - [bf-sparkline](https://bitforge-ui.web.app/ai/components/sparkline.md): Tiny trend line with no axes or legend, for stats and table cells ([docs](https://bitforge-ui.web.app/components/sparkline))
71
77
  - [bf-stat](https://bitforge-ui.web.app/ai/components/stat.md): One labelled figure with an optional icon tile and a supporting line ([docs](https://bitforge-ui.web.app/components/stat))
78
+ - [bf-step](https://bitforge-ui.web.app/ai/components/step.md): One numbered step of an instruction list, with a title and its details ([docs](https://bitforge-ui.web.app/components/step))
79
+ - [bf-steps](https://bitforge-ui.web.app/ai/components/steps.md): Numbered instruction steps a user follows in order, with joined markers ([docs](https://bitforge-ui.web.app/components/steps))
72
80
  - [bf-table](https://bitforge-ui.web.app/ai/components/table.md): Desktop data table with sortable headers, row selection, custom cells and an empty slot ([docs](https://bitforge-ui.web.app/components/table))
81
+ - [bf-timeline](https://bitforge-ui.web.app/ai/components/timeline.md): Dated list of events with who did what and when, on a vertical line ([docs](https://bitforge-ui.web.app/components/timeline))
82
+ - [bf-timeline-event](https://bitforge-ui.web.app/ai/components/timeline-event.md): One timeline event with a coloured marker, its text, actor and time ([docs](https://bitforge-ui.web.app/components/timeline-event))
73
83
 
74
84
  ### Feedback
75
85
 
@@ -108,6 +118,7 @@
108
118
  - [bf-alert-dialog](https://bitforge-ui.web.app/ai/components/alert-dialog.md): Centred confirmation dialog with a title, message and a row of role-styled buttons ([docs](https://bitforge-ui.web.app/components/alert-dialog))
109
119
  - [bf-desktop-toast](https://bitforge-ui.web.app/ai/components/desktop-toast.md): Desktop notification card in a bottom corner stack of up to three ([docs](https://bitforge-ui.web.app/components/desktop-toast))
110
120
  - [bf-dialog](https://bitforge-ui.web.app/ai/components/dialog.md): Desktop modal dialog with a title, scrolling body, footer actions and focus trap ([docs](https://bitforge-ui.web.app/components/dialog))
121
+ - [bf-image-viewer](https://bitforge-ui.web.app/ai/components/image-viewer.md): Full-screen image viewer that zooms from a thumbnail and steps through a set ([docs](https://bitforge-ui.web.app/components/image-viewer))
111
122
  - [bf-menu](https://bitforge-ui.web.app/ai/components/menu.md): Keyboard-operable menu panel with items, checkbox and radio items, groups and submenus ([docs](https://bitforge-ui.web.app/components/menu))
112
123
  - [bf-menu-button](https://bitforge-ui.web.app/ai/components/menu-button.md): Styled button that opens a menu, with outline, text, tonal and icon-only looks ([docs](https://bitforge-ui.web.app/components/menu-button))
113
124
  - [bf-modal](https://bitforge-ui.web.app/ai/components/modal.md): Modal overlay shown as an inset card over the scaled-down page, or full screen ([docs](https://bitforge-ui.web.app/components/modal))
@@ -143,6 +154,7 @@
143
154
  - [BF_TAB_BAR](https://bitforge-ui.web.app/ai/reference/bf_tab_bar.md): Injection token through which each tab reaches its enclosing tab bar ([docs](https://bitforge-ui.web.app/api/bf_tab_bar))
144
155
  - [BF_TAB_BAR_CONTROLLER](https://bitforge-ui.web.app/ai/reference/bf_tab_bar_controller.md): Injection token through which a parent drives the selection and hiding of its tab bar ([docs](https://bitforge-ui.web.app/api/bf_tab_bar_controller))
145
156
  - [BF_TAB_LINKS](https://bitforge-ui.web.app/ai/reference/bf_tab_links.md): Injection token that turns a projected tab bar into a navigation of links ([docs](https://bitforge-ui.web.app/api/bf_tab_links))
157
+ - [BF_TABLE_SORT_SELECT](https://bitforge-ui.web.app/ai/reference/bf_table_sort_select.md): The component a stacked table renders as its Sort by select ([docs](https://bitforge-ui.web.app/api/bf_table_sort_select))
146
158
  - [BfActionDirective](https://bitforge-ui.web.app/ai/reference/bf-action-directive.md): Makes one link or button the click target of a whole card or list row ([docs](https://bitforge-ui.web.app/api/bf-action-directive))
147
159
  - [BfAlertVariant](https://bitforge-ui.web.app/ai/reference/bf-alert-variant.md): The four tones of an alert, from neutral information to a danger message ([docs](https://bitforge-ui.web.app/api/bf-alert-variant))
148
160
  - [BfAppFrameBreakpoint](https://bitforge-ui.web.app/ai/reference/bf-app-frame-breakpoint.md): The breakpoint where an app frame switches from its header bar to the sidebar ([docs](https://bitforge-ui.web.app/api/bf-app-frame-breakpoint))
@@ -151,6 +163,7 @@
151
163
  - [BfAvatarSize](https://bitforge-ui.web.app/ai/reference/bf-avatar-size.md): The three sizes of an avatar, from a list row to a profile header ([docs](https://bitforge-ui.web.app/api/bf-avatar-size))
152
164
  - [BfAvatarVariant](https://bitforge-ui.web.app/ai/reference/bf-avatar-variant.md): The four colour schemes of an avatar behind its initials or icon ([docs](https://bitforge-ui.web.app/api/bf-avatar-variant))
153
165
  - [BfBadgeAppearance](https://bitforge-ui.web.app/ai/reference/bf-badge-appearance.md): Every badge tone, the five variants plus the informational info tone ([docs](https://bitforge-ui.web.app/api/bf-badge-appearance))
166
+ - [BfBadgeEmphasis](https://bitforge-ui.web.app/ai/reference/bf-badge-emphasis.md): The two badge emphases, the soft tint or the solid strong fill ([docs](https://bitforge-ui.web.app/api/bf-badge-emphasis))
154
167
  - [BfBadgeVariant](https://bitforge-ui.web.app/ai/reference/bf-badge-variant.md): The five tones of a badge, from neutral counts to danger states ([docs](https://bitforge-ui.web.app/api/bf-badge-variant))
155
168
  - [BfButtonAppearance](https://bitforge-ui.web.app/ai/reference/bf-button-appearance.md): Every button style, the five variants plus the quiet neutral ghost ([docs](https://bitforge-ui.web.app/api/bf-button-appearance))
156
169
  - [BfButtonSize](https://bitforge-ui.web.app/ai/reference/bf-button-size.md): Former name of the shared size scale for buttons, kept until 1.0.0 ([docs](https://bitforge-ui.web.app/api/bf-button-size))
@@ -160,6 +173,8 @@
160
173
  - [BfCalendarWeekday](https://bitforge-ui.web.app/ai/reference/bf-calendar-weekday.md): A weekday number from 0 for Sunday to 6 for Saturday, as Date counts ([docs](https://bitforge-ui.web.app/api/bf-calendar-weekday))
161
174
  - [BfCardPadding](https://bitforge-ui.web.app/ai/reference/bf-card-padding.md): The two inner paddings of a card, regular and roomy ([docs](https://bitforge-ui.web.app/api/bf-card-padding))
162
175
  - [BfCardVariant](https://bitforge-ui.web.app/ai/reference/bf-card-variant.md): The four card surfaces, from a raised panel to a flat outline ([docs](https://bitforge-ui.web.app/api/bf-card-variant))
176
+ - [BfChatMessageRole](https://bitforge-ui.web.app/ai/reference/bf-chat-message-role.md): Who wrote a chat message, the user or the assistant ([docs](https://bitforge-ui.web.app/api/bf-chat-message-role))
177
+ - [BfChatMessageStatus](https://bitforge-ui.web.app/ai/reference/bf-chat-message-status.md): How a chat message ended: done, stopped by the user, or failed ([docs](https://bitforge-ui.web.app/api/bf-chat-message-status))
163
178
  - [BfChipGroupMode](https://bitforge-ui.web.app/ai/reference/bf-chip-group-mode.md): Whether a chip group picks exactly one chip or lets each chip toggle alone ([docs](https://bitforge-ui.web.app/api/bf-chip-group-mode))
164
179
  - [BfChipVariant](https://bitforge-ui.web.app/ai/reference/bf-chip-variant.md): The two chip colours, a soft tonal tint or a dark ink fill ([docs](https://bitforge-ui.web.app/api/bf-chip-variant))
165
180
  - [BfColorScheme](https://bitforge-ui.web.app/ai/reference/bf-color-scheme.md): The colour scheme choice, following the system or forcing light or dark ([docs](https://bitforge-ui.web.app/api/bf-color-scheme))
@@ -171,10 +186,13 @@
171
186
  - [BfEmptyStateHeading](https://bitforge-ui.web.app/ai/reference/bf-empty-state-heading.md): The heading level of an empty state title, one for a whole page ([docs](https://bitforge-ui.web.app/api/bf-empty-state-heading))
172
187
  - [BfEmptyStateHeadingLevel](https://bitforge-ui.web.app/ai/reference/bf-empty-state-heading-level.md): The heading level of an empty state title, two for a screen or three ([docs](https://bitforge-ui.web.app/api/bf-empty-state-heading-level))
173
188
  - [BfEnterKeyHint](https://bitforge-ui.web.app/ai/reference/bf-enter-key-hint.md): The labels a phone keyboard can put on its Enter key ([docs](https://bitforge-ui.web.app/api/bf-enter-key-hint))
189
+ - [BfFadeInDirective](https://bitforge-ui.web.app/ai/reference/bf-fade-in-directive.md): Fades an image in once it has loaded instead of popping in ([docs](https://bitforge-ui.web.app/api/bf-fade-in-directive))
174
190
  - [bfFieldControlClass](https://bitforge-ui.web.app/ai/reference/bf-field-control-class.md): The class list that makes a custom control look like a library text field ([docs](https://bitforge-ui.web.app/api/bf-field-control-class))
175
191
  - [BfFieldControlState](https://bitforge-ui.web.app/ai/reference/bf-field-control-state.md): The size and state a custom field control is styled for by bfFieldControlClass ([docs](https://bitforge-ui.web.app/api/bf-field-control-state))
176
192
  - [BfFieldSize](https://bitforge-ui.web.app/ai/reference/bf-field-size.md): Former name of the shared size scale for text fields, kept until 1.0.0 ([docs](https://bitforge-ui.web.app/api/bf-field-size))
193
+ - [BfFileInputVariant](https://bitforge-ui.web.app/ai/reference/bf-file-input-variant.md): The two looks of a file picker, a compact field or a drop zone ([docs](https://bitforge-ui.web.app/api/bf-file-input-variant))
177
194
  - [BfIconButtonVariant](https://bitforge-ui.web.app/ai/reference/bf-icon-button-variant.md): The four visual styles of an icon button, from tonal to plain text ([docs](https://bitforge-ui.web.app/api/bf-icon-button-variant))
195
+ - [BfImageInputShape](https://bitforge-ui.web.app/ai/reference/bf-image-input-shape.md): The two tile shapes of an image picker, a circle or a rounded square ([docs](https://bitforge-ui.web.app/api/bf-image-input-shape))
178
196
  - [BfInputAutocapitalize](https://bitforge-ui.web.app/ai/reference/bf-input-autocapitalize.md): A text field's capitalisation setting, a mode or empty to leave it off ([docs](https://bitforge-ui.web.app/api/bf-input-autocapitalize))
179
197
  - [BfInputEnterKeyHint](https://bitforge-ui.web.app/ai/reference/bf-input-enter-key-hint.md): A field's Enter key label setting, a label or empty to leave it off ([docs](https://bitforge-ui.web.app/api/bf-input-enter-key-hint))
180
198
  - [BfInputInputMode](https://bitforge-ui.web.app/ai/reference/bf-input-input-mode.md): A text field's virtual keyboard setting, a keyboard or empty to leave it off ([docs](https://bitforge-ui.web.app/api/bf-input-input-mode))
@@ -182,11 +200,16 @@
182
200
  - [BfInputType](https://bitforge-ui.web.app/ai/reference/bf-input-type.md): The native input types a text field supports, all bound as strings ([docs](https://bitforge-ui.web.app/api/bf-input-type))
183
201
  - [BfLabels](https://bitforge-ui.web.app/ai/reference/bf-labels.md): Every built-in user-facing string of the library, one key per string ([docs](https://bitforge-ui.web.app/api/bf-labels))
184
202
  - [BfLabelsOverrides](https://bitforge-ui.web.app/ai/reference/bf-labels-overrides.md): The strings provideBfLabels replaces, each one falling back to the parent ([docs](https://bitforge-ui.web.app/api/bf-labels-overrides))
203
+ - [BfMediaCardAspect](https://bitforge-ui.web.app/ai/reference/bf-media-card-aspect.md): The four aspect ratios of a media card's image area, wide to portrait ([docs](https://bitforge-ui.web.app/api/bf-media-card-aspect))
204
+ - [BfMotionListDirective](https://bitforge-ui.web.app/ai/reference/bf-motion-list-directive.md): Glides the items of a list or grid to their new place when it changes ([docs](https://bitforge-ui.web.app/api/bf-motion-list-directive))
185
205
  - [BfPageHeaderHeadingLevel](https://bitforge-ui.web.app/ai/reference/bf-page-header-heading-level.md): The heading level of a page header title, one for a page or two ([docs](https://bitforge-ui.web.app/api/bf-page-header-heading-level))
186
206
  - [BfProgressSize](https://bitforge-ui.web.app/ai/reference/bf-progress-size.md): The two track heights of a progress bar, thin and regular ([docs](https://bitforge-ui.web.app/api/bf-progress-size))
187
207
  - [BfProgressTone](https://bitforge-ui.web.app/ai/reference/bf-progress-tone.md): The four fill colours of a progress bar, from primary to danger ([docs](https://bitforge-ui.web.app/api/bf-progress-tone))
208
+ - [BfProseDirective](https://bitforge-ui.web.app/ai/reference/bf-prose-directive.md): Styles rendered markdown with the library tokens: headings, lists, code and quotes ([docs](https://bitforge-ui.web.app/api/bf-prose-directive))
188
209
  - [BfRadioGroupOrientation](https://bitforge-ui.web.app/ai/reference/bf-radio-group-orientation.md): Whether a radio group stacks its options or sets them in a row ([docs](https://bitforge-ui.web.app/api/bf-radio-group-orientation))
189
210
  - [BfRadioOption](https://bitforge-ui.web.app/ai/reference/bf-radio-option.md): One choice of a radio group with its value, label and optional description ([docs](https://bitforge-ui.web.app/api/bf-radio-option))
211
+ - [BfRejectedFile](https://bitforge-ui.web.app/ai/reference/bf-rejected-file.md): A picked or dropped file that broke a rule, with the rule and its message ([docs](https://bitforge-ui.web.app/api/bf-rejected-file))
212
+ - [BfRejectedFileReason](https://bitforge-ui.web.app/ai/reference/bf-rejected-file-reason.md): The rule a refused file broke, its type, its size or the file count ([docs](https://bitforge-ui.web.app/api/bf-rejected-file-reason))
190
213
  - [BfSegmentedSize](https://bitforge-ui.web.app/ai/reference/bf-segmented-size.md): Former name of the shared size scale for segmented controls, kept until 1.0.0 ([docs](https://bitforge-ui.web.app/api/bf-segmented-size))
191
214
  - [BfSegmentOption](https://bitforge-ui.web.app/ai/reference/bf-segment-option.md): One segment of a segmented control with its value, its label and a disabled flag ([docs](https://bitforge-ui.web.app/api/bf-segment-option))
192
215
  - [BfSelectOption](https://bitforge-ui.web.app/ai/reference/bf-select-option.md): One choice of a select with its value, its label and a disabled flag ([docs](https://bitforge-ui.web.app/api/bf-select-option))
@@ -198,17 +221,20 @@
198
221
  - [BfStatTrend](https://bitforge-ui.web.app/ai/reference/bf-stat-trend.md): The three directions of a stat's delta pill, up, down or no change ([docs](https://bitforge-ui.web.app/api/bf-stat-trend))
199
222
  - [BfStatTrendIntent](https://bitforge-ui.web.app/ai/reference/bf-stat-trend-intent.md): Whether a rising or a falling figure is the good news for a stat ([docs](https://bitforge-ui.web.app/api/bf-stat-trend-intent))
200
223
  - [BfStatVariant](https://bitforge-ui.web.app/ai/reference/bf-stat-variant.md): The two stat surfaces, plain on its container or an outlined card tile ([docs](https://bitforge-ui.web.app/api/bf-stat-variant))
224
+ - [BfStepHeadingLevel](https://bitforge-ui.web.app/ai/reference/bf-step-heading-level.md): The heading level a step title can take, two, three or four ([docs](https://bitforge-ui.web.app/api/bf-step-heading-level))
201
225
  - [BfTabBarController](https://bitforge-ui.web.app/ai/reference/bf-tab-bar-controller.md): The state a parent that drives a projected tab bar gives it to derive from ([docs](https://bitforge-ui.web.app/api/bf-tab-bar-controller))
202
226
  - [BfTabBarHost](https://bitforge-ui.web.app/ai/reference/bf-tab-bar-host.md): What each tab reads from its tab bar: the selection, tab stop and link mode ([docs](https://bitforge-ui.web.app/api/bf-tab-bar-host))
203
227
  - [BfTableAlign](https://bitforge-ui.web.app/ai/reference/bf-table-align.md): The inline alignment of a table column, start for text or end for numbers ([docs](https://bitforge-ui.web.app/api/bf-table-align))
204
228
  - [BfTableCellContext](https://bitforge-ui.web.app/ai/reference/bf-table-cell-context.md): The row and its index that a custom table cell template receives ([docs](https://bitforge-ui.web.app/api/bf-table-cell-context))
205
229
  - [BfTableCellDirective](https://bitforge-ui.web.app/ai/reference/bf-table-cell-directive.md): Custom template for the cells of one table column, with the row typed ([docs](https://bitforge-ui.web.app/api/bf-table-cell-directive))
206
230
  - [BfTableColumn](https://bitforge-ui.web.app/ai/reference/bf-table-column.md): One table column with its row key, header label, sorting and alignment ([docs](https://bitforge-ui.web.app/api/bf-table-column))
231
+ - [BfTableColumnAlign](https://bitforge-ui.web.app/ai/reference/bf-table-column-align.md): The inline alignment of a table column: start, end, or centred for controls ([docs](https://bitforge-ui.web.app/api/bf-table-column-align))
207
232
  - [BfTableRowKey](https://bitforge-ui.web.app/ai/reference/bf-table-row-key.md): Function that returns the unique string key of one table row ([docs](https://bitforge-ui.web.app/api/bf-table-row-key))
208
233
  - [BfTableSort](https://bitforge-ui.web.app/ai/reference/bf-table-sort.md): The column key and direction a table is sorted by, set by its headers ([docs](https://bitforge-ui.web.app/api/bf-table-sort))
209
234
  - [BfTableSortDirection](https://bitforge-ui.web.app/ai/reference/bf-table-sort-direction.md): The direction a sorted table column is in, ascending or descending ([docs](https://bitforge-ui.web.app/api/bf-table-sort-direction))
210
235
  - [BfTableStack](https://bitforge-ui.web.app/ai/reference/bf-table-stack.md): When a table stacks its rows into cards: never, when narrow, or under touch ([docs](https://bitforge-ui.web.app/api/bf-table-stack))
211
236
  - [BfTabLinks](https://bitforge-ui.web.app/ai/reference/bf-tab-links.md): The URLs a router-aware parent gives a tab bar to render its tabs as links ([docs](https://bitforge-ui.web.app/api/bf-tab-links))
237
+ - [BfTimelineTone](https://bitforge-ui.web.app/ai/reference/bf-timeline-tone.md): The marker colour of a timeline event, neutral, primary or a status ([docs](https://bitforge-ui.web.app/api/bf-timeline-tone))
212
238
  - [BfToggleLabelPosition](https://bitforge-ui.web.app/ai/reference/bf-toggle-label-position.md): Whether a toggle's label sits after or before its switch ([docs](https://bitforge-ui.web.app/api/bf-toggle-label-position))
213
239
  - [bfValidationMessage](https://bitforge-ui.web.app/ai/reference/bf-validation-message.md): Turns one validation error into the text a form field shows under it ([docs](https://bitforge-ui.web.app/api/bf-validation-message))
214
240
  - [BfValidationMessages](https://bitforge-ui.web.app/ai/reference/bf-validation-messages.md): The default error text of each validator kind, shown under a form field ([docs](https://bitforge-ui.web.app/api/bf-validation-messages))
@@ -243,6 +269,12 @@
243
269
  - [BfDialogService](https://bitforge-ui.web.app/ai/reference/bf-dialog-service.md): Opens modal dialogs and confirm prompts, centred over the page with focus trapped ([docs](https://bitforge-ui.web.app/api/bf-dialog-service))
244
270
  - [BfDialogSize](https://bitforge-ui.web.app/ai/reference/bf-dialog-size.md): The dialog width scale from a 24 rem confirm to an edge-to-edge fullscreen dialog ([docs](https://bitforge-ui.web.app/api/bf-dialog-size))
245
271
  - [BfDialogTemplateContext](https://bitforge-ui.web.app/ai/reference/bf-dialog-template-context.md): The context a template opened as a dialog receives: its ref and its data ([docs](https://bitforge-ui.web.app/api/bf-dialog-template-context))
272
+ - [BfImageViewerActionsContext](https://bitforge-ui.web.app/ai/reference/bf-image-viewer-actions-context.md): What the viewer's actions template receives: the shown image, its index and the ref ([docs](https://bitforge-ui.web.app/api/bf-image-viewer-actions-context))
273
+ - [BfImageViewerImage](https://bitforge-ui.web.app/ai/reference/bf-image-viewer-image.md): One image the viewer shows: its URL, its name as alternative text and a caption ([docs](https://bitforge-ui.web.app/api/bf-image-viewer-image))
274
+ - [BfImageViewerOptions](https://bitforge-ui.web.app/ai/reference/bf-image-viewer-options.md): Options of an image viewer: its images, the first one, its thumbnail and actions ([docs](https://bitforge-ui.web.app/api/bf-image-viewer-options))
275
+ - [BfImageViewerOrigin](https://bitforge-ui.web.app/ai/reference/bf-image-viewer-origin.md): The thumbnail an image viewer zooms from and back into, or a lookup per image ([docs](https://bitforge-ui.web.app/api/bf-image-viewer-origin))
276
+ - [BfImageViewerRef](https://bitforge-ui.web.app/ai/reference/bf-image-viewer-ref.md): Handle on an open image viewer that steps through its images and closes it ([docs](https://bitforge-ui.web.app/api/bf-image-viewer-ref))
277
+ - [BfImageViewerService](https://bitforge-ui.web.app/ai/reference/bf-image-viewer-service.md): Opens a full-screen image viewer that zooms from a thumbnail and steps through a set ([docs](https://bitforge-ui.web.app/api/bf-image-viewer-service))
246
278
  - [BfMenuButtonVariant](https://bitforge-ui.web.app/ai/reference/bf-menu-button-variant.md): The three visual styles of a menu button, matching the button styles ([docs](https://bitforge-ui.web.app/api/bf-menu-button-variant))
247
279
  - [BfMenuDividerDirective](https://bitforge-ui.web.app/ai/reference/bf-menu-divider-directive.md): A line between groups of menu items that keyboard focus never lands on ([docs](https://bitforge-ui.web.app/api/bf-menu-divider-directive))
248
280
  - [BfMenuGroupDirective](https://bitforge-ui.web.app/ai/reference/bf-menu-group-directive.md): Groups related menu items; radio items in one group exclude each other ([docs](https://bitforge-ui.web.app/api/bf-menu-group-directive))
@@ -288,6 +320,7 @@
288
320
  - [OVERLAY_REDUCED_DURATION](https://bitforge-ui.web.app/ai/reference/overlay_reduced_duration.md): The duration of the fade that replaces overlay motion under reduced motion ([docs](https://bitforge-ui.web.app/api/overlay_reduced_duration))
289
321
  - [prefersReducedMotion](https://bitforge-ui.web.app/ai/reference/prefers-reduced-motion.md): Tells whether the user asked the system to minimise motion ([docs](https://bitforge-ui.web.app/api/prefers-reduced-motion))
290
322
  - [provideBfDesktopToast](https://bitforge-ui.web.app/ai/reference/provide-bf-desktop-toast.md): Sets where desktop toasts appear and how many show at once, app-wide ([docs](https://bitforge-ui.web.app/api/provide-bf-desktop-toast))
323
+ - [provideBfSelect](https://bitforge-ui.web.app/ai/reference/provide-bf-select.md): Makes a stacked table's Sort by select the styled bf-select, app-wide ([docs](https://bitforge-ui.web.app/api/provide-bf-select))
291
324
  - [scaleIn](https://bitforge-ui.web.app/ai/reference/scale-in.md): Scales an element up while fading it in, the enter animation of centred dialogs ([docs](https://bitforge-ui.web.app/api/scale-in))
292
325
  - [slideDown](https://bitforge-ui.web.app/ai/reference/slide-down.md): Slides an element down out of place, the exit animation of a bottom sheet ([docs](https://bitforge-ui.web.app/api/slide-down))
293
326
  - [slideInFromEnd](https://bitforge-ui.web.app/ai/reference/slide-in-from-end.md): Slides an element in from the inline end, the enter animation of a side panel ([docs](https://bitforge-ui.web.app/api/slide-in-from-end))
@@ -404,13 +437,18 @@
404
437
 
405
438
  - [BfCalendarHarness](https://bitforge-ui.web.app/ai/reference/bf-calendar-harness.md): Test harness for the calendar: reads the month and picks a date by ISO string ([docs](https://bitforge-ui.web.app/api/bf-calendar-harness))
406
439
  - [BfChartHarness](https://bitforge-ui.web.app/ai/reference/bf-chart-harness.md): Test harness for the charts: reads the series, toggles one and reads the data table ([docs](https://bitforge-ui.web.app/api/bf-chart-harness))
440
+ - [BfChatComposerHarness](https://bitforge-ui.web.app/ai/reference/bf-chat-composer-harness.md): Test harness for the chat composer: types, sends, stops and reads its state ([docs](https://bitforge-ui.web.app/api/bf-chat-composer-harness))
407
441
  - [BfComboboxHarness](https://bitforge-ui.web.app/ai/reference/bf-combobox-harness.md): Test harness for the comboboxes: types, reads and picks options and tags ([docs](https://bitforge-ui.web.app/api/bf-combobox-harness))
408
442
  - [BfDateInputHarness](https://bitforge-ui.web.app/ai/reference/bf-date-input-harness.md): Test harness for the date input: types a date or picks one in its calendar ([docs](https://bitforge-ui.web.app/api/bf-date-input-harness))
409
443
  - [BfDateTimeInputHarness](https://bitforge-ui.web.app/ai/reference/bf-date-time-input-harness.md): Test harness for the date and time input: types or picks a date and time ([docs](https://bitforge-ui.web.app/api/bf-date-time-input-harness))
410
444
  - [BfDesktopToastHarness](https://bitforge-ui.web.app/ai/reference/bf-desktop-toast-harness.md): Test harness for a desktop toast: its message, its action and Escape ([docs](https://bitforge-ui.web.app/api/bf-desktop-toast-harness))
411
445
  - [BfDialogHarness](https://bitforge-ui.web.app/ai/reference/bf-dialog-harness.md): Test harness for a dialog: its title, text and role, its buttons and Escape ([docs](https://bitforge-ui.web.app/api/bf-dialog-harness))
446
+ - [BfFileInputHarness](https://bitforge-ui.web.app/ai/reference/bf-file-input-harness.md): Test harness for the file input: drops files and reads the list and rejections ([docs](https://bitforge-ui.web.app/api/bf-file-input-harness))
412
447
  - [BfHarnessFilters](https://bitforge-ui.web.app/ai/reference/bf-harness-filters.md): Filters a library harness query by selector, ancestor and the widget label ([docs](https://bitforge-ui.web.app/api/bf-harness-filters))
448
+ - [BfImageInputHarness](https://bitforge-ui.web.app/ai/reference/bf-image-input-harness.md): Test harness for the image input: drops an image on it and reads the preview ([docs](https://bitforge-ui.web.app/api/bf-image-input-harness))
449
+ - [BfImageViewerHarness](https://bitforge-ui.web.app/ai/reference/bf-image-viewer-harness.md): Test harness for an image viewer: its image, index, caption, steps and close ([docs](https://bitforge-ui.web.app/api/bf-image-viewer-harness))
413
450
  - [BfJsdomShimOptions](https://bitforge-ui.web.app/ai/reference/bf-jsdom-shim-options.md): Options of the jsdom shims: the matchMedia stub and its reduced-motion answer ([docs](https://bitforge-ui.web.app/api/bf-jsdom-shim-options))
451
+ - [BfMediaCardHarness](https://bitforge-ui.web.app/ai/reference/bf-media-card-harness.md): Test harness for a media card: its image state, its messages and its selection ([docs](https://bitforge-ui.web.app/api/bf-media-card-harness))
414
452
  - [BfMenuButtonHarness](https://bitforge-ui.web.app/ai/reference/bf-menu-button-harness.md): Test harness for a menu button: opens it and hands out the menu it opened ([docs](https://bitforge-ui.web.app/api/bf-menu-button-harness))
415
453
  - [BfMenuHarness](https://bitforge-ui.web.app/ai/reference/bf-menu-harness.md): Test harness for a menu: lists its items and clicks one, through submenus ([docs](https://bitforge-ui.web.app/api/bf-menu-harness))
416
454
  - [BfMenuItemHarness](https://bitforge-ui.web.app/ai/reference/bf-menu-item-harness.md): Test harness for a menu row: its text, disabled, checked and submenu state ([docs](https://bitforge-ui.web.app/api/bf-menu-item-harness))
@@ -425,6 +463,7 @@
425
463
  - [BfTableHarness](https://bitforge-ui.web.app/ai/reference/bf-table-harness.md): Test harness for the data table: reads rows and cells, sorts and selects rows ([docs](https://bitforge-ui.web.app/api/bf-table-harness))
426
464
  - [BfTestingOptions](https://bitforge-ui.web.app/ai/reference/bf-testing-options.md): Options of the test providers: the size defaults and labels a spec runs with ([docs](https://bitforge-ui.web.app/api/bf-testing-options))
427
465
  - [BfTimeInputHarness](https://bitforge-ui.web.app/ai/reference/bf-time-input-harness.md): Test harness for the time input: types a time or picks one from its list ([docs](https://bitforge-ui.web.app/api/bf-time-input-harness))
466
+ - [BfToggleHarness](https://bitforge-ui.web.app/ai/reference/bf-toggle-harness.md): Test harness for the toggle: reads its name and state and switches it ([docs](https://bitforge-ui.web.app/api/bf-toggle-harness))
428
467
  - [BfTooltipHarness](https://bitforge-ui.web.app/ai/reference/bf-tooltip-harness.md): Test harness for a tooltip: shows it, reads its text and whether it shows ([docs](https://bitforge-ui.web.app/api/bf-tooltip-harness))
429
468
  - [installBfJsdomShims](https://bitforge-ui.web.app/ai/reference/install-bf-jsdom-shims.md): Installs the browser APIs jsdom lacks and the library needs, only where missing ([docs](https://bitforge-ui.web.app/api/install-bf-jsdom-shims))
430
469
  - [provideBfTesting](https://bitforge-ui.web.app/ai/reference/provide-bf-testing.md): Test providers for the widgets and overlays, with document cleanup after each test ([docs](https://bitforge-ui.web.app/api/provide-bf-testing))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitforgehq/ui",
3
- "version": "0.3.3",
3
+ "version": "0.5.0-next.3",
4
4
  "description": "Bitforge UI: Angular 22 widgets (Meadow Sage palette with an indigo default primary to override, Tailwind v4, signals-first) and, from v0.2, a Capacitor app shell.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -56,6 +56,7 @@
56
56
  "sideEffects": false,
57
57
  "exports": {
58
58
  "./theme.css": "./theme.css",
59
+ "./dark-ink.css": "./dark-ink.css",
59
60
  "./ai/*": "./ai/*",
60
61
  "./llms.txt": "./llms.txt",
61
62
  "./llms-full.txt": "./llms-full.txt",
package/theme.css CHANGED
@@ -98,6 +98,18 @@
98
98
  --color-neutral-soft: #efece3;
99
99
  --color-info: #0f4c6b; /* informational badge: 7.7:1 on info-soft */
100
100
  --color-info-soft: #dcecf5;
101
+ /* Strong status fills (badge emphasis="strong"): the family's deep tone, white text >= 6:1,
102
+ the fill >= 3:1 on bg, surface and surface-sunken. Primary's strong fill is primary itself. */
103
+ --color-neutral-strong: #4a5347;
104
+ --color-on-neutral-strong: #ffffff; /* 8.0:1 */
105
+ --color-success-strong: #1f6b43;
106
+ --color-on-success-strong: #ffffff; /* 6.5:1 */
107
+ --color-warning-strong: #8a520f;
108
+ --color-on-warning-strong: #ffffff; /* 6.4:1 */
109
+ --color-danger-strong: #b3261e;
110
+ --color-on-danger-strong: #ffffff; /* 6.5:1 */
111
+ --color-info-strong: #0f5a80;
112
+ --color-on-info-strong: #ffffff; /* 7.5:1 */
101
113
 
102
114
  /* Tooltip: a dark pill in light mode, inverted (light) in dark mode */
103
115
  --color-tooltip: #1f2a22;
@@ -166,6 +178,14 @@
166
178
  --ease-ios: cubic-bezier(0.32, 0.72, 0, 1);
167
179
  --ease-md: cubic-bezier(0.2, 0, 0, 1);
168
180
  --ease-settle: cubic-bezier(0.2, 0.8, 0.3, 1);
181
+ /* Durations as utilities (duration-fast, duration-base, duration-slow), the same timings the
182
+ widgets use, so an app's own motion matches the library: fast 150 ms (colours, small
183
+ state changes, the reduced-motion fade), base 200 ms (size and position: the sidebar,
184
+ selection indicators, list items), slow 260 ms (overlays enter and leave). They read the
185
+ :root --bf-duration-* properties below, so redefining those retimes both. */
186
+ --transition-duration-fast: var(--bf-duration-fast);
187
+ --transition-duration-base: var(--bf-duration-layout);
188
+ --transition-duration-slow: var(--bf-duration-overlay);
169
189
 
170
190
  /* bf-progress indeterminate: a 40 % stripe runs across the track from the inline start (static
171
191
  under reduced motion); the -rtl pair runs it the other way under dir="rtl". */
@@ -209,6 +229,57 @@
209
229
  }
210
230
  }
211
231
 
232
+ /* App lists and grids, with Angular's animate.enter / animate.leave: an item fades and rises in
233
+ (`animate.enter="motion-safe:animate-item-enter"`) and fades out while it shrinks a little
234
+ (`animate.leave="motion-safe:animate-item-leave"`); `bfMotionList` on the container glides
235
+ the others into place. motion-safe: leaves both out under reduced motion. */
236
+ --animate-item-enter: bf-item-enter var(--bf-duration-layout) var(--ease-settle) both;
237
+ --animate-item-leave: bf-item-leave var(--bf-duration-fast) var(--ease-md) both;
238
+ @keyframes bf-item-enter {
239
+ from {
240
+ opacity: 0;
241
+ transform: translateY(8px) scale(0.98);
242
+ }
243
+ }
244
+ @keyframes bf-item-leave {
245
+ to {
246
+ opacity: 0;
247
+ transform: scale(0.96);
248
+ }
249
+ }
250
+
251
+ /* A field's error message fades in when it appears (and when a held message is revealed after
252
+ the press ends: `not-[.sr-only]:animate-message-in`). An opacity fade only, so it stays under
253
+ reduced motion, like the overlays' reduced fade. */
254
+ --animate-message-in: bf-message-in 150ms var(--ease-md) both;
255
+ /* bf-tab-panel: the panel a user switches to fades in over the old one's place (behind
256
+ motion-safe:, so not under reduced motion); never the first panel on load. */
257
+ --animate-panel-in: bf-message-in 200ms var(--ease-md) both;
258
+ @keyframes bf-message-in {
259
+ from {
260
+ opacity: 0;
261
+ }
262
+ to {
263
+ opacity: 1;
264
+ }
265
+ }
266
+
267
+ /* bf-chat-message: a message added after the thread's first render rises 4 px and fades in
268
+ (motion-safe: only), and a streaming reply's caret pulses (static under reduced motion). */
269
+ --animate-chat-message-in: bf-chat-message-in var(--bf-duration-layout) var(--ease-settle) both;
270
+ --animate-chat-caret: bf-chat-caret 1s ease-in-out infinite alternate;
271
+ @keyframes bf-chat-message-in {
272
+ from {
273
+ opacity: 0;
274
+ transform: translateY(4px);
275
+ }
276
+ }
277
+ @keyframes bf-chat-caret {
278
+ to {
279
+ opacity: 0.2;
280
+ }
281
+ }
282
+
212
283
  /* @bitforgehq/ui/charts enter motion, on the first render and on every data change (the marks
213
284
  are re-created): a line draws along its path (pathLength 1, so the dash is the whole line),
214
285
  bars grow from the baseline (scale on the fill box, origin at the baseline), areas and
@@ -262,6 +333,7 @@
262
333
  :root {
263
334
  color-scheme: light; /* native scrollbars and form controls match the light palette */
264
335
  --bf-duration-fast: 150ms; /* colour transitions, reduced-motion fade */
336
+ --bf-duration-layout: 200ms; /* size and position: sidebar width, selection indicators */
265
337
  --bf-duration-overlay: 260ms; /* overlays, modal depth */
266
338
  --bf-duration-push: 500ms; /* iOS push/pop */
267
339
  --bf-z-sticky: 10; /* translucent header */
@@ -301,6 +373,18 @@
301
373
  --color-danger-border: #d3563f;
302
374
  --color-info: #7cc4ea; /* 7.2:1 on info-soft */
303
375
  --color-info-soft: #14303e;
376
+ /* Strong fills: a saturated mid tone (>= 3:1 on bg, surface and surface-sunken); white text on
377
+ the deep ones, dark text on the light neutral and amber ones. */
378
+ --color-neutral-strong: #9a9da5;
379
+ --color-on-neutral-strong: #111214; /* 6.9:1 */
380
+ --color-success-strong: #26804f;
381
+ --color-on-success-strong: #ffffff; /* 4.9:1 */
382
+ --color-warning-strong: #d99a3c;
383
+ --color-on-warning-strong: #1a1206; /* 7.6:1 */
384
+ --color-danger-strong: #c9372c;
385
+ --color-on-danger-strong: #ffffff; /* 5.2:1 */
386
+ --color-info-strong: #2a7aa8;
387
+ --color-on-info-strong: #ffffff; /* 4.7:1 */
304
388
  --color-tooltip: #ececee;
305
389
  --color-on-tooltip: #1e2024; /* 13.8:1 on tooltip */
306
390