@bitforgehq/ui 0.3.1 → 0.3.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 (49) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +9 -8
  3. package/ai/MANIFEST.index.json +18 -0
  4. package/ai/MANIFEST.json +380 -31
  5. package/ai/REFERENCE.index.json +63 -0
  6. package/ai/REFERENCE.json +265 -7
  7. package/ai/UI_GUIDE.md +59 -33
  8. package/ai/components/app-frame.md +335 -0
  9. package/ai/components/card.md +56 -2
  10. package/ai/components/empty-state.md +99 -6
  11. package/ai/components/header.md +14 -1
  12. package/ai/components/sidebar-toggle.md +287 -0
  13. package/ai/components/sidebar.md +188 -10
  14. package/ai/components/stat.md +74 -10
  15. package/ai/components/table.md +152 -5
  16. package/ai/components/tabs.md +5 -1
  17. package/ai/components/toolbar.md +69 -4
  18. package/ai/reference/bf-app-frame-breakpoint.md +27 -0
  19. package/ai/reference/bf-app-frame-content-width.md +29 -0
  20. package/ai/reference/bf-empty-state-heading-level.md +1 -1
  21. package/ai/reference/bf-empty-state-heading.md +33 -0
  22. package/ai/reference/bf-labels.md +7 -0
  23. package/ai/reference/bf-select-harness.md +4 -0
  24. package/ai/reference/bf-sidebar-state-service.md +21 -0
  25. package/ai/reference/bf-sidebar-toggle-harness.md +32 -0
  26. package/ai/reference/bf-size.md +1 -0
  27. package/ai/reference/bf-stat-appearance.md +33 -0
  28. package/ai/reference/bf-stat-variant.md +1 -1
  29. package/ai/reference/bf-table-harness.md +7 -1
  30. package/ai/reference/bf-table-stack.md +29 -0
  31. package/ai/reference/bf_sidebar_state_storage.md +20 -0
  32. package/ai/reference/provide-bf-labels.md +4 -3
  33. package/ai/reference/provide-bf-sidebar-state.md +20 -0
  34. package/bin/bf-ui.js +433 -3
  35. package/fesm2022/bitforgehq-ui-mobile.mjs +11 -2
  36. package/fesm2022/bitforgehq-ui-mobile.mjs.map +1 -1
  37. package/fesm2022/bitforgehq-ui-overlay.mjs +571 -446
  38. package/fesm2022/bitforgehq-ui-overlay.mjs.map +1 -1
  39. package/fesm2022/bitforgehq-ui-testing.mjs +22 -2
  40. package/fesm2022/bitforgehq-ui-testing.mjs.map +1 -1
  41. package/fesm2022/bitforgehq-ui.mjs +777 -127
  42. package/fesm2022/bitforgehq-ui.mjs.map +1 -1
  43. package/llms-full.txt +1605 -43
  44. package/llms.txt +11 -0
  45. package/package.json +1 -1
  46. package/theme.css +13 -0
  47. package/types/bitforgehq-ui-overlay.d.ts +51 -0
  48. package/types/bitforgehq-ui-testing.d.ts +49 -1
  49. package/types/bitforgehq-ui.d.ts +284 -20
@@ -36,6 +36,13 @@
36
36
  "entryPoint": "@bitforgehq/ui",
37
37
  "summary": "Injection token holding the user-facing strings in effect for an injector"
38
38
  },
39
+ {
40
+ "name": "BF_SIDEBAR_STATE_STORAGE",
41
+ "slug": "bf_sidebar_state_storage",
42
+ "kind": "token",
43
+ "entryPoint": "@bitforgehq/ui",
44
+ "summary": "Injection token for the store that keeps the collapsed sidebar between visits"
45
+ },
39
46
  {
40
47
  "name": "BF_TAB_BAR",
41
48
  "slug": "bf_tab_bar",
@@ -71,6 +78,20 @@
71
78
  "entryPoint": "@bitforgehq/ui",
72
79
  "summary": "The four tones of an alert, from neutral information to a danger message"
73
80
  },
81
+ {
82
+ "name": "BfAppFrameBreakpoint",
83
+ "slug": "bf-app-frame-breakpoint",
84
+ "kind": "type",
85
+ "entryPoint": "@bitforgehq/ui",
86
+ "summary": "The breakpoint where an app frame switches from its header bar to the sidebar"
87
+ },
88
+ {
89
+ "name": "BfAppFrameContentWidth",
90
+ "slug": "bf-app-frame-content-width",
91
+ "kind": "type",
92
+ "entryPoint": "@bitforgehq/ui",
93
+ "summary": "The maximum width of an app frame's content column, from medium to full"
94
+ },
74
95
  {
75
96
  "name": "BfAutocapitalize",
76
97
  "slug": "bf-autocapitalize",
@@ -218,6 +239,13 @@
218
239
  "entryPoint": "@bitforgehq/ui",
219
240
  "summary": "The two description list layouts, divided label-value rows or a grid of tiles"
220
241
  },
242
+ {
243
+ "name": "BfEmptyStateHeading",
244
+ "slug": "bf-empty-state-heading",
245
+ "kind": "type",
246
+ "entryPoint": "@bitforgehq/ui",
247
+ "summary": "The heading level of an empty state title, one for a whole page"
248
+ },
221
249
  {
222
250
  "name": "BfEmptyStateHeadingLevel",
223
251
  "slug": "bf-empty-state-heading-level",
@@ -365,6 +393,13 @@
365
393
  "entryPoint": "@bitforgehq/ui",
366
394
  "summary": "One choice of a select with its value, its label and a disabled flag"
367
395
  },
396
+ {
397
+ "name": "BfSidebarStateService",
398
+ "slug": "bf-sidebar-state-service",
399
+ "kind": "service",
400
+ "entryPoint": "@bitforgehq/ui",
401
+ "summary": "The sidebar's collapsed state, kept in storage between visits of the app"
402
+ },
368
403
  {
369
404
  "name": "BfSize",
370
405
  "slug": "bf-size",
@@ -386,6 +421,13 @@
386
421
  "entryPoint": "@bitforgehq/ui",
387
422
  "summary": "The three spinner diameters, from inline text to a page loading state"
388
423
  },
424
+ {
425
+ "name": "BfStatAppearance",
426
+ "slug": "bf-stat-appearance",
427
+ "kind": "type",
428
+ "entryPoint": "@bitforgehq/ui",
429
+ "summary": "The three stat surfaces, plain, an outlined card or a sunken tile"
430
+ },
389
431
  {
390
432
  "name": "BfStatTrend",
391
433
  "slug": "bf-stat-trend",
@@ -470,6 +512,13 @@
470
512
  "entryPoint": "@bitforgehq/ui",
471
513
  "summary": "The direction a sorted table column is in, ascending or descending"
472
514
  },
515
+ {
516
+ "name": "BfTableStack",
517
+ "slug": "bf-table-stack",
518
+ "kind": "type",
519
+ "entryPoint": "@bitforgehq/ui",
520
+ "summary": "When a table stacks its rows into cards: never, when narrow, or under touch"
521
+ },
473
522
  {
474
523
  "name": "BfTabLinks",
475
524
  "slug": "bf-tab-links",
@@ -519,6 +568,13 @@
519
568
  "entryPoint": "@bitforgehq/ui",
520
569
  "summary": "Replaces built-in strings for an app or a sub-tree, such as a translation"
521
570
  },
571
+ {
572
+ "name": "provideBfSidebarState",
573
+ "slug": "provide-bf-sidebar-state",
574
+ "kind": "function",
575
+ "entryPoint": "@bitforgehq/ui",
576
+ "summary": "Remembers the collapsed sidebar between visits, for desktop web apps"
577
+ },
522
578
  {
523
579
  "name": "BF_DESKTOP_TOAST_DEFAULTS",
524
580
  "slug": "bf_desktop_toast_defaults",
@@ -1814,6 +1870,13 @@
1814
1870
  "entryPoint": "@bitforgehq/ui/testing",
1815
1871
  "summary": "Test harness for the select: reads its label and options and picks one"
1816
1872
  },
1873
+ {
1874
+ "name": "BfSidebarToggleHarness",
1875
+ "slug": "bf-sidebar-toggle-harness",
1876
+ "kind": "class",
1877
+ "entryPoint": "@bitforgehq/ui/testing",
1878
+ "summary": "Test harness for a sidebar toggle: reads and flips the collapsed sidebar"
1879
+ },
1817
1880
  {
1818
1881
  "name": "BfSidePanelHarness",
1819
1882
  "slug": "bf-side-panel-harness",
package/ai/REFERENCE.json CHANGED
@@ -81,6 +81,22 @@
81
81
  "since": "0.3.0",
82
82
  "signature": "const BF_LABELS: InjectionToken<BfLabels>"
83
83
  },
84
+ {
85
+ "name": "BF_SIDEBAR_STATE_STORAGE",
86
+ "slug": "bf_sidebar_state_storage",
87
+ "kind": "token",
88
+ "entryPoint": "@bitforgehq/ui",
89
+ "file": "src/config/sidebar-state.ts",
90
+ "summary": "Injection token for the store that keeps the collapsed sidebar between visits",
91
+ "description": "Where `BfSidebarStateService` keeps whether the sidebar is collapsed (the key\n`bf-sidebar-collapsed`, `'true'` or `'false'`): `localStorage` when it is available, otherwise\nan in-memory map. Provide another store (`sessionStorage`, or an in-memory one in tests) to keep\nit elsewhere.",
92
+ "members": [],
93
+ "methods": [],
94
+ "slots": [],
95
+ "references": [],
96
+ "usedBy": [],
97
+ "since": "0.3.2",
98
+ "signature": "const BF_SIDEBAR_STATE_STORAGE: InjectionToken<Pick<Storage, \"getItem\" | \"setItem\">>"
99
+ },
84
100
  {
85
101
  "name": "BF_TAB_BAR",
86
102
  "slug": "bf_tab_bar",
@@ -162,6 +178,40 @@
162
178
  "signature": "type BfAlertVariant = 'neutral' | 'success' | 'warning' | 'danger'",
163
179
  "values": ["neutral", "success", "warning", "danger"]
164
180
  },
181
+ {
182
+ "name": "BfAppFrameBreakpoint",
183
+ "slug": "bf-app-frame-breakpoint",
184
+ "kind": "type",
185
+ "entryPoint": "@bitforgehq/ui",
186
+ "file": "src/components/app-frame/app-frame.component.ts",
187
+ "summary": "The breakpoint where an app frame switches from its header bar to the sidebar",
188
+ "description": "The viewport width from which `bf-app-frame` shows its sidebar column instead of the narrow\nheader bar: Tailwind's `md` (768 px) or `lg` (1024 px).",
189
+ "members": [],
190
+ "methods": [],
191
+ "slots": [],
192
+ "references": [],
193
+ "usedBy": ["bf-app-frame-component"],
194
+ "since": "0.3.2",
195
+ "signature": "type BfAppFrameBreakpoint = 'md' | 'lg'",
196
+ "values": ["md", "lg"]
197
+ },
198
+ {
199
+ "name": "BfAppFrameContentWidth",
200
+ "slug": "bf-app-frame-content-width",
201
+ "kind": "type",
202
+ "entryPoint": "@bitforgehq/ui",
203
+ "file": "src/components/app-frame/app-frame.component.ts",
204
+ "summary": "The maximum width of an app frame's content column, from medium to full",
205
+ "description": "The maximum width of `bf-app-frame`'s content column: `md` 48rem, `lg` 64rem, `xl` 80rem, or\n`full` for no limit.",
206
+ "members": [],
207
+ "methods": [],
208
+ "slots": [],
209
+ "references": [],
210
+ "usedBy": ["bf-app-frame-component"],
211
+ "since": "0.3.2",
212
+ "signature": "type BfAppFrameContentWidth = 'md' | 'lg' | 'xl' | 'full'",
213
+ "values": ["md", "lg", "xl", "full"]
214
+ },
165
215
  {
166
216
  "name": "BfAutocapitalize",
167
217
  "slug": "bf-autocapitalize",
@@ -586,6 +636,23 @@
586
636
  "signature": "type BfDescriptionListLayout = 'rows' | 'grid'",
587
637
  "values": ["rows", "grid"]
588
638
  },
639
+ {
640
+ "name": "BfEmptyStateHeading",
641
+ "slug": "bf-empty-state-heading",
642
+ "kind": "type",
643
+ "entryPoint": "@bitforgehq/ui",
644
+ "file": "src/components/empty-state/empty-state.component.ts",
645
+ "summary": "The heading level of an empty state title, one for a whole page",
646
+ "description": "The heading level a `bf-empty-state` title takes: a `BfEmptyStateHeadingLevel`, or `1` when the\nempty state is the page itself (a not-found or no-access page). A new type, so `Record`s over\nthe released `BfEmptyStateHeadingLevel` keep compiling.",
647
+ "members": [],
648
+ "methods": [],
649
+ "slots": [],
650
+ "references": ["bf-empty-state-heading-level"],
651
+ "usedBy": ["bf-empty-state-component"],
652
+ "since": "0.3.2",
653
+ "signature": "type BfEmptyStateHeading = BfEmptyStateHeadingLevel | 1",
654
+ "values": ["2", "3", "1"]
655
+ },
589
656
  {
590
657
  "name": "BfEmptyStateHeadingLevel",
591
658
  "slug": "bf-empty-state-heading-level",
@@ -598,7 +665,7 @@
598
665
  "methods": [],
599
666
  "slots": [],
600
667
  "references": [],
601
- "usedBy": ["bf-empty-state-component"],
668
+ "usedBy": ["bf-empty-state-heading"],
602
669
  "since": "0.3.0",
603
670
  "signature": "type BfEmptyStateHeadingLevel = 2 | 3",
604
671
  "values": ["2", "3"]
@@ -999,6 +1066,42 @@
999
1066
  "readonly": true,
1000
1067
  "default": "'Select all rows'"
1001
1068
  },
1069
+ {
1070
+ "name": "tableSortBy",
1071
+ "kind": "property",
1072
+ "type": "string",
1073
+ "required": true,
1074
+ "doc": "The label of a stacked bf-table's sort select.",
1075
+ "readonly": true,
1076
+ "default": "'Sort by'"
1077
+ },
1078
+ {
1079
+ "name": "tableSortNone",
1080
+ "kind": "property",
1081
+ "type": "string",
1082
+ "required": true,
1083
+ "doc": "A stacked bf-table's first sort option: rows in the order given, no column sorted.",
1084
+ "readonly": true,
1085
+ "default": "'Not sorted'"
1086
+ },
1087
+ {
1088
+ "name": "tableSortAscending",
1089
+ "kind": "property",
1090
+ "type": "(column: string) => string",
1091
+ "required": true,
1092
+ "doc": "A stacked bf-table's sort option for a column in ascending order.",
1093
+ "readonly": true,
1094
+ "default": "(column) => `${column}, ascending`"
1095
+ },
1096
+ {
1097
+ "name": "tableSortDescending",
1098
+ "kind": "property",
1099
+ "type": "(column: string) => string",
1100
+ "required": true,
1101
+ "doc": "A stacked bf-table's sort option for a column in descending order.",
1102
+ "readonly": true,
1103
+ "default": "(column) => `${column}, descending`"
1104
+ },
1002
1105
  {
1003
1106
  "name": "theme",
1004
1107
  "kind": "property",
@@ -1071,6 +1174,33 @@
1071
1174
  "readonly": true,
1072
1175
  "default": "(count) => `${count} new`"
1073
1176
  },
1177
+ {
1178
+ "name": "sidebarCollapse",
1179
+ "kind": "property",
1180
+ "type": "string",
1181
+ "required": true,
1182
+ "doc": "bf-sidebar-toggle's name and tooltip while the sidebar is expanded.",
1183
+ "readonly": true,
1184
+ "default": "'Collapse sidebar'"
1185
+ },
1186
+ {
1187
+ "name": "sidebarExpand",
1188
+ "kind": "property",
1189
+ "type": "string",
1190
+ "required": true,
1191
+ "doc": "bf-sidebar-toggle's name and tooltip while the sidebar is an icon rail.",
1192
+ "readonly": true,
1193
+ "default": "'Expand sidebar'"
1194
+ },
1195
+ {
1196
+ "name": "skipToContent",
1197
+ "kind": "property",
1198
+ "type": "string",
1199
+ "required": true,
1200
+ "doc": "bf-app-frame's skip link, the first stop of the tab order, which moves focus to the content.",
1201
+ "readonly": true,
1202
+ "default": "'Skip to main content'"
1203
+ },
1074
1204
  {
1075
1205
  "name": "pagination",
1076
1206
  "kind": "property",
@@ -1655,6 +1785,30 @@
1655
1785
  "since": "0.1.0",
1656
1786
  "signature": "interface BfSelectOption<T = string>"
1657
1787
  },
1788
+ {
1789
+ "name": "BfSidebarStateService",
1790
+ "slug": "bf-sidebar-state-service",
1791
+ "kind": "service",
1792
+ "entryPoint": "@bitforgehq/ui",
1793
+ "file": "src/config/sidebar-state.ts",
1794
+ "summary": "The sidebar's collapsed state, kept in storage between visits of the app",
1795
+ "description": "Whether the app's `bf-sidebar` is collapsed to an icon rail, remembered between visits: the app\nbinds the sidebar's `[(collapsed)]` to `sidebarState.collapsed`. With `provideBfSidebarState()`\nevery change is stored in `BF_SIDEBAR_STATE_STORAGE` under `bf-sidebar-collapsed`; without it\nthe signal still holds the state but nothing is written. Storage is read in the browser only, so a\nserver render starts expanded and writes nothing. The widgets never inject it.",
1796
+ "members": [
1797
+ {
1798
+ "name": "collapsed",
1799
+ "kind": "property",
1800
+ "type": "WritableSignal<boolean>",
1801
+ "required": false,
1802
+ "doc": "Whether the sidebar is collapsed: the stored state in the browser, else false. Bind it two-way to `bf-sidebar`'s `collapsed`.",
1803
+ "readonly": true
1804
+ }
1805
+ ],
1806
+ "methods": [],
1807
+ "slots": [],
1808
+ "references": [],
1809
+ "usedBy": [],
1810
+ "since": "0.3.2"
1811
+ },
1658
1812
  {
1659
1813
  "name": "BfSize",
1660
1814
  "slug": "bf-size",
@@ -1692,6 +1846,7 @@
1692
1846
  "bf-segmented-component",
1693
1847
  "bf-segmented-size",
1694
1848
  "bf-select-component",
1849
+ "bf-sidebar-toggle-component",
1695
1850
  "bf-tab-group-component",
1696
1851
  "bf-table-component",
1697
1852
  "bf-textarea-component",
@@ -1738,6 +1893,23 @@
1738
1893
  "signature": "type BfSpinnerSize = 'sm' | 'md' | 'lg'",
1739
1894
  "values": ["sm", "md", "lg"]
1740
1895
  },
1896
+ {
1897
+ "name": "BfStatAppearance",
1898
+ "slug": "bf-stat-appearance",
1899
+ "kind": "type",
1900
+ "entryPoint": "@bitforgehq/ui",
1901
+ "file": "src/components/stat/stat.component.ts",
1902
+ "summary": "The three stat surfaces, plain, an outlined card or a sunken tile",
1903
+ "description": "The surface of a `bf-stat`, as its `variant` input takes it: a `BfStatVariant` or tile (a\nsunken, borderless tile for a stats row inside a raised card). A new type, so `Record`s over\nthe released `BfStatVariant` keep compiling.",
1904
+ "members": [],
1905
+ "methods": [],
1906
+ "slots": [],
1907
+ "references": ["bf-stat-variant"],
1908
+ "usedBy": ["bf-stat-component"],
1909
+ "since": "0.3.2",
1910
+ "signature": "type BfStatAppearance = BfStatVariant | 'tile'",
1911
+ "values": ["plain", "card", "tile"]
1912
+ },
1741
1913
  {
1742
1914
  "name": "BfStatTrend",
1743
1915
  "slug": "bf-stat-trend",
@@ -1784,7 +1956,7 @@
1784
1956
  "methods": [],
1785
1957
  "slots": [],
1786
1958
  "references": [],
1787
- "usedBy": ["bf-stat-component"],
1959
+ "usedBy": ["bf-stat-appearance"],
1788
1960
  "since": "0.3.1",
1789
1961
  "signature": "type BfStatVariant = 'plain' | 'card'",
1790
1962
  "values": ["plain", "card"]
@@ -2144,6 +2316,23 @@
2144
2316
  "signature": "type BfTableSortDirection = 'ascending' | 'descending'",
2145
2317
  "values": ["ascending", "descending"]
2146
2318
  },
2319
+ {
2320
+ "name": "BfTableStack",
2321
+ "slug": "bf-table-stack",
2322
+ "kind": "type",
2323
+ "entryPoint": "@bitforgehq/ui",
2324
+ "file": "src/components/table/table.component.ts",
2325
+ "summary": "When a table stacks its rows into cards: never, when narrow, or under touch",
2326
+ "description": "When a `bf-table` renders each row as a card of label/value pairs: `never` (the default),\n`narrow` while the table is narrower than 36rem (a container query), or `coarse` under a coarse\npointer at any width.",
2327
+ "members": [],
2328
+ "methods": [],
2329
+ "slots": [],
2330
+ "references": [],
2331
+ "usedBy": ["bf-table-component"],
2332
+ "since": "0.3.2",
2333
+ "signature": "type BfTableStack = 'never' | 'narrow' | 'coarse'",
2334
+ "values": ["never", "narrow", "coarse"]
2335
+ },
2147
2336
  {
2148
2337
  "name": "BfTabLinks",
2149
2338
  "slug": "bf-tab-links",
@@ -2419,7 +2608,7 @@
2419
2608
  "entryPoint": "@bitforgehq/ui",
2420
2609
  "file": "src/config/labels.ts",
2421
2610
  "summary": "Replaces built-in strings for an app or a sub-tree, such as a translation",
2422
- "description": "Replaces built-in strings, merged over the parent's (validation merged key by key); a key left\nout or set to `undefined` keeps the parent's string. In `ApplicationConfig.providers` it covers\nevery string. In a component's `providers` it covers that sub-tree's widgets and form controls\n(`loading`, `dismiss`, `tabBar`, `tabBadge`, `back`, `refreshing`, `tableSelectAll`, `theme`,\n`themeSystem`, `themeLight`, `themeDark`, `breadcrumb`, `breadcrumbExpand`, `navigation`,\n`navBadge`, `pagination`, `previousPage`, `nextPage`, `pageOf`, `goToPage`, `tabGroup`,\n`calendarPreviousMonth`, `calendarNextMonth`, `calendarChooseMonth`, `calendarChooseYear`,\n`statTrendUp`, `statTrendDown`, `statTrendFlat`, `comboboxEmpty`, `comboboxRemove`,\n`dateInputDay`, `dateInputMonth`, `dateInputYear`, `dateInputOpenCalendar`, `dateInputInvalid`,\n`dateInputUnavailable`, `timeInputHour`, `timeInputMinute`, `timeInputSecond`,\n`timeInputDayPeriod`, `timeInputOpenList`, `timeInputInvalid`, `timeInputMin`, `timeInputMax`,\n`chart`, `chartLegend`, `chartValues`, `chartShowData`, `chartHideData`, `chartCategory`,\n`chartValue`, `chartEmpty`, `chartError`, `validation`); the overlay services (`ok`, `cancel`,\n`actions`, `sheet`, `modal`, `close`, `expand`, `collapse`, `sheetPosition`, `dialog`,\n`notifications`) are root singletons and pick it up only when the caller passes its injector:\n`open(…, { injector: inject(Injector) })`.",
2611
+ "description": "Replaces built-in strings, merged over the parent's (validation merged key by key); a key left\nout or set to `undefined` keeps the parent's string. In `ApplicationConfig.providers` it covers\nevery string. In a component's `providers` it covers that sub-tree's widgets and form controls\n(`loading`, `dismiss`, `tabBar`, `tabBadge`, `back`, `refreshing`, `tableSelectAll`, `tableSortBy`,\n`tableSortNone`, `tableSortAscending`, `tableSortDescending`, `theme`, `themeSystem`, `themeLight`, `themeDark`,\n`breadcrumb`, `breadcrumbExpand`, `navigation`, `navBadge`, `sidebarCollapse`, `sidebarExpand`,\n`skipToContent`, `pagination`, `previousPage`, `nextPage`, `pageOf`, `goToPage`, `tabGroup`,\n`calendarPreviousMonth`, `calendarNextMonth`, `calendarChooseMonth`, `calendarChooseYear`,\n`statTrendUp`, `statTrendDown`, `statTrendFlat`, `comboboxEmpty`, `comboboxRemove`,\n`dateInputDay`, `dateInputMonth`, `dateInputYear`, `dateInputOpenCalendar`, `dateInputInvalid`,\n`dateInputUnavailable`, `timeInputHour`, `timeInputMinute`, `timeInputSecond`,\n`timeInputDayPeriod`, `timeInputOpenList`, `timeInputInvalid`, `timeInputMin`, `timeInputMax`,\n`chart`, `chartLegend`, `chartValues`, `chartShowData`, `chartHideData`, `chartCategory`,\n`chartValue`, `chartEmpty`, `chartError`, `validation`); the overlay services (`ok`, `cancel`,\n`actions`, `sheet`, `modal`, `close`, `expand`, `collapse`, `sheetPosition`, `dialog`,\n`notifications`) are root singletons and pick it up only when the caller passes its injector:\n`open(…, { injector: inject(Injector) })`.",
2423
2612
  "members": [],
2424
2613
  "methods": [
2425
2614
  {
@@ -2434,7 +2623,7 @@
2434
2623
  }
2435
2624
  ],
2436
2625
  "returns": "Provider",
2437
- "doc": "Replaces built-in strings, merged over the parent's (validation merged key by key); a key left\nout or set to `undefined` keeps the parent's string. In `ApplicationConfig.providers` it covers\nevery string. In a component's `providers` it covers that sub-tree's widgets and form controls\n(`loading`, `dismiss`, `tabBar`, `tabBadge`, `back`, `refreshing`, `tableSelectAll`, `theme`,\n`themeSystem`, `themeLight`, `themeDark`, `breadcrumb`, `breadcrumbExpand`, `navigation`,\n`navBadge`, `pagination`, `previousPage`, `nextPage`, `pageOf`, `goToPage`, `tabGroup`,\n`calendarPreviousMonth`, `calendarNextMonth`, `calendarChooseMonth`, `calendarChooseYear`,\n`statTrendUp`, `statTrendDown`, `statTrendFlat`, `comboboxEmpty`, `comboboxRemove`,\n`dateInputDay`, `dateInputMonth`, `dateInputYear`, `dateInputOpenCalendar`, `dateInputInvalid`,\n`dateInputUnavailable`, `timeInputHour`, `timeInputMinute`, `timeInputSecond`,\n`timeInputDayPeriod`, `timeInputOpenList`, `timeInputInvalid`, `timeInputMin`, `timeInputMax`,\n`chart`, `chartLegend`, `chartValues`, `chartShowData`, `chartHideData`, `chartCategory`,\n`chartValue`, `chartEmpty`, `chartError`, `validation`); the overlay services (`ok`, `cancel`,\n`actions`, `sheet`, `modal`, `close`, `expand`, `collapse`, `sheetPosition`, `dialog`,\n`notifications`) are root singletons and pick it up only when the caller passes its injector:\n`open(…, { injector: inject(Injector) })`."
2626
+ "doc": "Replaces built-in strings, merged over the parent's (validation merged key by key); a key left\nout or set to `undefined` keeps the parent's string. In `ApplicationConfig.providers` it covers\nevery string. In a component's `providers` it covers that sub-tree's widgets and form controls\n(`loading`, `dismiss`, `tabBar`, `tabBadge`, `back`, `refreshing`, `tableSelectAll`, `tableSortBy`,\n`tableSortNone`, `tableSortAscending`, `tableSortDescending`, `theme`, `themeSystem`, `themeLight`, `themeDark`,\n`breadcrumb`, `breadcrumbExpand`, `navigation`, `navBadge`, `sidebarCollapse`, `sidebarExpand`,\n`skipToContent`, `pagination`, `previousPage`, `nextPage`, `pageOf`, `goToPage`, `tabGroup`,\n`calendarPreviousMonth`, `calendarNextMonth`, `calendarChooseMonth`, `calendarChooseYear`,\n`statTrendUp`, `statTrendDown`, `statTrendFlat`, `comboboxEmpty`, `comboboxRemove`,\n`dateInputDay`, `dateInputMonth`, `dateInputYear`, `dateInputOpenCalendar`, `dateInputInvalid`,\n`dateInputUnavailable`, `timeInputHour`, `timeInputMinute`, `timeInputSecond`,\n`timeInputDayPeriod`, `timeInputOpenList`, `timeInputInvalid`, `timeInputMin`, `timeInputMax`,\n`chart`, `chartLegend`, `chartValues`, `chartShowData`, `chartHideData`, `chartCategory`,\n`chartValue`, `chartEmpty`, `chartError`, `validation`); the overlay services (`ok`, `cancel`,\n`actions`, `sheet`, `modal`, `close`, `expand`, `collapse`, `sheetPosition`, `dialog`,\n`notifications`) are root singletons and pick it up only when the caller passes its injector:\n`open(…, { injector: inject(Injector) })`."
2438
2627
  }
2439
2628
  ],
2440
2629
  "slots": [],
@@ -2443,6 +2632,30 @@
2443
2632
  "since": "0.3.0",
2444
2633
  "signature": "function provideBfLabels(overrides: BfLabelsOverrides): Provider"
2445
2634
  },
2635
+ {
2636
+ "name": "provideBfSidebarState",
2637
+ "slug": "provide-bf-sidebar-state",
2638
+ "kind": "function",
2639
+ "entryPoint": "@bitforgehq/ui",
2640
+ "file": "src/config/sidebar-state.ts",
2641
+ "summary": "Remembers the collapsed sidebar between visits, for desktop web apps",
2642
+ "description": "Lets `BfSidebarStateService` remember the collapsed sidebar: it stores every change of its\n`collapsed` signal (key `bf-sidebar-collapsed`, `localStorage` in the browser), so the app opens\nwith the sidebar as the user left it. Add it to `ApplicationConfig.providers` and bind the\nsidebar's `[(collapsed)]` to `sidebarState.collapsed`.",
2643
+ "members": [],
2644
+ "methods": [
2645
+ {
2646
+ "name": "provideBfSidebarState",
2647
+ "signature": "provideBfSidebarState(): EnvironmentProviders",
2648
+ "params": [],
2649
+ "returns": "EnvironmentProviders",
2650
+ "doc": "Lets `BfSidebarStateService` remember the collapsed sidebar: it stores every change of its\n`collapsed` signal (key `bf-sidebar-collapsed`, `localStorage` in the browser), so the app opens\nwith the sidebar as the user left it. Add it to `ApplicationConfig.providers` and bind the\nsidebar's `[(collapsed)]` to `sidebarState.collapsed`."
2651
+ }
2652
+ ],
2653
+ "slots": [],
2654
+ "references": [],
2655
+ "usedBy": [],
2656
+ "since": "0.3.2",
2657
+ "signature": "function provideBfSidebarState(): EnvironmentProviders"
2658
+ },
2446
2659
  {
2447
2660
  "name": "BF_DESKTOP_TOAST_DEFAULTS",
2448
2661
  "slug": "bf_desktop_toast_defaults",
@@ -9424,10 +9637,48 @@
9424
9637
  ],
9425
9638
  "slots": [],
9426
9639
  "references": [],
9427
- "usedBy": [],
9640
+ "usedBy": ["bf-table-harness"],
9428
9641
  "since": "0.3.0",
9429
9642
  "signature": "class BfSelectHarness extends ComponentHarness"
9430
9643
  },
9644
+ {
9645
+ "name": "BfSidebarToggleHarness",
9646
+ "slug": "bf-sidebar-toggle-harness",
9647
+ "kind": "class",
9648
+ "entryPoint": "@bitforgehq/ui/testing",
9649
+ "file": "testing/harnesses/sidebar-toggle.harness.ts",
9650
+ "summary": "Test harness for a sidebar toggle: reads and flips the collapsed sidebar",
9651
+ "description": "Harness for `bf-sidebar-toggle`, the button that collapses a `bf-sidebar` to an icon rail. Its\n`label` filter matches the button's name (\"Collapse sidebar\" or \"Expand sidebar\").",
9652
+ "members": [],
9653
+ "methods": [
9654
+ {
9655
+ "name": "getLabel",
9656
+ "signature": "getLabel(): Promise<string>",
9657
+ "params": [],
9658
+ "returns": "Promise<string>",
9659
+ "doc": "The button's name, which says what the next press does."
9660
+ },
9661
+ {
9662
+ "name": "isExpanded",
9663
+ "signature": "isExpanded(): Promise<boolean>",
9664
+ "params": [],
9665
+ "returns": "Promise<boolean>",
9666
+ "doc": "Whether the sidebar is at full width (`aria-expanded`)."
9667
+ },
9668
+ {
9669
+ "name": "toggle",
9670
+ "signature": "toggle(): Promise<void>",
9671
+ "params": [],
9672
+ "returns": "Promise<void>",
9673
+ "doc": "Flips the sidebar with a click."
9674
+ }
9675
+ ],
9676
+ "slots": [],
9677
+ "references": [],
9678
+ "usedBy": [],
9679
+ "since": "0.3.2",
9680
+ "signature": "class BfSidebarToggleHarness extends ComponentHarness"
9681
+ },
9431
9682
  {
9432
9683
  "name": "BfSidePanelHarness",
9433
9684
  "slug": "bf-side-panel-harness",
@@ -9532,7 +9783,7 @@
9532
9783
  "entryPoint": "@bitforgehq/ui/testing",
9533
9784
  "file": "testing/harnesses/table.harness.ts",
9534
9785
  "summary": "Test harness for the data table: reads rows and cells, sorts and selects rows",
9535
- "description": "Harness for `bf-table`. It works by column header text and row position, so a test never needs\nthe column keys or the row keys (except `getSort()`, which returns the column's `key`, as the\n`sort` model holds it).",
9786
+ "description": "Harness for `bf-table`. It works by column header text and row position, so a test never needs\nthe column keys or the row keys (except `getSort()`, which returns the column's `key`, as the\n`sort` model holds it). It reads and drives a stacked table (`stack`) the same way.",
9536
9787
  "members": [],
9537
9788
  "methods": [
9538
9789
  {
@@ -9597,6 +9848,13 @@
9597
9848
  "returns": "Promise<BfTableSort | null>",
9598
9849
  "doc": "The sorted column (its `key`) and direction, from `aria-sort`."
9599
9850
  },
9851
+ {
9852
+ "name": "getSortSelect",
9853
+ "signature": "getSortSelect(): Promise<BfSelectHarness | null>",
9854
+ "params": [],
9855
+ "returns": "Promise<BfSelectHarness | null>",
9856
+ "doc": "The Sort by select in a stacked table's bar: its first option, Not sorted (`tableSortNone`),\nsets `sort` to null and shows while it is; then each sortable column ascending and descending."
9857
+ },
9600
9858
  {
9601
9859
  "name": "selectRow",
9602
9860
  "signature": "selectRow(index: number): Promise<void>",
@@ -9627,7 +9885,7 @@
9627
9885
  }
9628
9886
  ],
9629
9887
  "slots": [],
9630
- "references": ["bf-table-sort"],
9888
+ "references": ["bf-select-harness", "bf-table-sort"],
9631
9889
  "usedBy": [],
9632
9890
  "since": "0.3.1",
9633
9891
  "signature": "class BfTableHarness extends ComponentHarness"