@lumeo-ui/mcp-server 3.13.2 → 3.15.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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "$schema": "https://lumeo.nativ.sh/components-api-schema.json",
3
- "version": "3.13.2",
4
- "generated": "2026-06-12T12:33:36.1716217Z",
3
+ "version": "3.15.0",
4
+ "generated": "2026-06-18T08:02:42.3248717Z",
5
5
  "stats": {
6
6
  "componentCount": 163,
7
- "totalParameters": 3965,
8
- "totalEnums": 71,
9
- "totalRecords": 64,
7
+ "totalParameters": 4070,
8
+ "totalEnums": 74,
9
+ "totalRecords": 70,
10
10
  "serviceCount": 33,
11
11
  "thinFallbacks": []
12
12
  },
@@ -609,6 +609,12 @@
609
609
  "signature": "GetMenuItemCount(string containerId)",
610
610
  "summary": null
611
611
  },
612
+ {
613
+ "name": "FocusMenuItemByTypeahead",
614
+ "returnType": "ValueTask<int>",
615
+ "signature": "FocusMenuItemByTypeahead(string containerId, string query, int currentIndex)",
616
+ "summary": null
617
+ },
612
618
  {
613
619
  "name": "LockScroll",
614
620
  "returnType": "ValueTask",
@@ -717,6 +723,30 @@
717
723
  "signature": "UnpositionFixed(string contentId)",
718
724
  "summary": null
719
725
  },
726
+ {
727
+ "name": "PositionAtPoint",
728
+ "returnType": "ValueTask",
729
+ "signature": "PositionAtPoint(string contentId, double x, double y)",
730
+ "summary": null
731
+ },
732
+ {
733
+ "name": "InitToolbarRoving",
734
+ "returnType": "ValueTask",
735
+ "signature": "InitToolbarRoving(string toolbarId)",
736
+ "summary": null
737
+ },
738
+ {
739
+ "name": "MoveToolbarFocus",
740
+ "returnType": "ValueTask",
741
+ "signature": "MoveToolbarFocus(string toolbarId, int delta)",
742
+ "summary": null
743
+ },
744
+ {
745
+ "name": "FocusToolbarEdge",
746
+ "returnType": "ValueTask",
747
+ "signature": "FocusToolbarEdge(string toolbarId, bool last)",
748
+ "summary": null
749
+ },
720
750
  {
721
751
  "name": "GetElementRect",
722
752
  "returnType": "ValueTask<ElementRect?>",
@@ -735,6 +765,18 @@
735
765
  "signature": "GetScrollTop(string elementId)",
736
766
  "summary": null
737
767
  },
768
+ {
769
+ "name": "RegisterPullToRefresh",
770
+ "returnType": "ValueTask",
771
+ "signature": "RegisterPullToRefresh(string elementId)",
772
+ "summary": null
773
+ },
774
+ {
775
+ "name": "UnregisterPullToRefresh",
776
+ "returnType": "ValueTask",
777
+ "signature": "UnregisterPullToRefresh(string elementId)",
778
+ "summary": null
779
+ },
738
780
  {
739
781
  "name": "WheelScrollTop",
740
782
  "returnType": "ValueTask<double>",
@@ -957,12 +999,42 @@
957
999
  "signature": "ScrollspyScrollTo(string containerId, string sectionId, bool smooth)",
958
1000
  "summary": null
959
1001
  },
1002
+ {
1003
+ "name": "ScrollspyScrollTo",
1004
+ "returnType": "ValueTask",
1005
+ "signature": "ScrollspyScrollTo(string containerId, string sectionId, bool smooth, int offset)",
1006
+ "summary": null
1007
+ },
960
1008
  {
961
1009
  "name": "OnScrollspyUpdate",
962
1010
  "returnType": "Task",
963
1011
  "signature": "OnScrollspyUpdate(string containerId, string? activeId)",
964
1012
  "summary": null
965
1013
  },
1014
+ {
1015
+ "name": "RegisterTabsOverflow",
1016
+ "returnType": "ValueTask",
1017
+ "signature": "RegisterTabsOverflow(string listId, Func<bool, bool, Task> handler)",
1018
+ "summary": null
1019
+ },
1020
+ {
1021
+ "name": "UnregisterTabsOverflow",
1022
+ "returnType": "ValueTask",
1023
+ "signature": "UnregisterTabsOverflow(string listId)",
1024
+ "summary": null
1025
+ },
1026
+ {
1027
+ "name": "TabsScrollBy",
1028
+ "returnType": "ValueTask",
1029
+ "signature": "TabsScrollBy(string listId, double delta, bool horizontal)",
1030
+ "summary": null
1031
+ },
1032
+ {
1033
+ "name": "OnTabsOverflowChange",
1034
+ "returnType": "Task",
1035
+ "signature": "OnTabsOverflowChange(string listId, bool canScrollStart, bool canScrollEnd)",
1036
+ "summary": null
1037
+ },
966
1038
  {
967
1039
  "name": "RegisterToastSwipe",
968
1040
  "returnType": "ValueTask",
@@ -1077,6 +1149,12 @@
1077
1149
  "signature": "ScrollSelectorIntoView(string selector)",
1078
1150
  "summary": null
1079
1151
  },
1152
+ {
1153
+ "name": "ScrollIntoView",
1154
+ "returnType": "ValueTask",
1155
+ "signature": "ScrollIntoView(string elementId, string block = \"nearest\")",
1156
+ "summary": null
1157
+ },
1080
1158
  {
1081
1159
  "name": "RegisterAffix",
1082
1160
  "returnType": "ValueTask",
@@ -1101,6 +1179,18 @@
1101
1179
  "signature": "GetTextareaCaretPosition(string elementId)",
1102
1180
  "summary": null
1103
1181
  },
1182
+ {
1183
+ "name": "GetInputCaret",
1184
+ "returnType": "ValueTask<int>",
1185
+ "signature": "GetInputCaret(string elementId)",
1186
+ "summary": null
1187
+ },
1188
+ {
1189
+ "name": "SetInputCaret",
1190
+ "returnType": "ValueTask",
1191
+ "signature": "SetInputCaret(string elementId, int position)",
1192
+ "summary": null
1193
+ },
1104
1194
  {
1105
1195
  "name": "RegisterBackToTop",
1106
1196
  "returnType": "ValueTask",
@@ -1149,6 +1239,18 @@
1149
1239
  "signature": "RippleDetachAsync(Microsoft.AspNetCore.Components.ElementReference element)",
1150
1240
  "summary": null
1151
1241
  },
1242
+ {
1243
+ "name": "PrefersReducedMotion",
1244
+ "returnType": "ValueTask<bool>",
1245
+ "signature": "PrefersReducedMotion()",
1246
+ "summary": null
1247
+ },
1248
+ {
1249
+ "name": "TouchRippleCoords",
1250
+ "returnType": "ValueTask<RipplePoint>",
1251
+ "signature": "TouchRippleCoords(string hostElementId, double clientX, double clientY)",
1252
+ "summary": null
1253
+ },
1152
1254
  {
1153
1255
  "name": "PlayMedia",
1154
1256
  "returnType": "ValueTask",
@@ -1173,6 +1275,12 @@
1173
1275
  "signature": "SeekMedia(Microsoft.AspNetCore.Components.ElementReference element, double seconds)",
1174
1276
  "summary": null
1175
1277
  },
1278
+ {
1279
+ "name": "SetPlaybackRate",
1280
+ "returnType": "ValueTask",
1281
+ "signature": "SetPlaybackRate(Microsoft.AspNetCore.Components.ElementReference element, double rate)",
1282
+ "summary": null
1283
+ },
1176
1284
  {
1177
1285
  "name": "GetMediaState",
1178
1286
  "returnType": "ValueTask<MediaState>",
@@ -1206,7 +1314,7 @@
1206
1314
  {
1207
1315
  "name": "MotionTickNumber",
1208
1316
  "returnType": "ValueTask",
1209
- "signature": "MotionTickNumber(string elementId, double from, double to, int durationMs, int decimals, string separator = \",\")",
1317
+ "signature": "MotionTickNumber(string elementId, double from, double to, int durationMs, int decimals, string separator = \",\", string decimalSeparator = \".\")",
1210
1318
  "summary": null
1211
1319
  },
1212
1320
  {
@@ -1233,6 +1341,12 @@
1233
1341
  "signature": "MotionDisposeObserver(string elementId)",
1234
1342
  "summary": null
1235
1343
  },
1344
+ {
1345
+ "name": "MotionPrefersReducedMotion",
1346
+ "returnType": "ValueTask<bool>",
1347
+ "signature": "MotionPrefersReducedMotion()",
1348
+ "summary": null
1349
+ },
1236
1350
  {
1237
1351
  "name": "MotionAnimatedBeam",
1238
1352
  "returnType": "ValueTask",
@@ -1745,6 +1859,12 @@
1745
1859
  "signature": "GetMenuItemCount(string containerId)",
1746
1860
  "summary": null
1747
1861
  },
1862
+ {
1863
+ "name": "FocusMenuItemByTypeahead",
1864
+ "returnType": "ValueTask<int>",
1865
+ "signature": "FocusMenuItemByTypeahead(string containerId, string query, int currentIndex)",
1866
+ "summary": "Type-to-focus (Radix menu typeahead). Focuses the first enabled menu item in whose text content starts with (case-insensitive), searching after first then wrapping, and returns its index (or -1 when nothing matches). Shared by DropdownMenu / Menubar / MegaMenu via the MenuTypeahead buffer helper. Default implementation returns -1 so existing implementers / test doubles keep compiling."
1867
+ },
1748
1868
  {
1749
1869
  "name": "LockScroll",
1750
1870
  "returnType": "ValueTask",
@@ -1841,6 +1961,30 @@
1841
1961
  "signature": "UnpositionFixed(string contentId)",
1842
1962
  "summary": null
1843
1963
  },
1964
+ {
1965
+ "name": "PositionAtPoint",
1966
+ "returnType": "ValueTask",
1967
+ "signature": "PositionAtPoint(string contentId, double x, double y)",
1968
+ "summary": "Positions a fixed-position element at the viewport point (, ) and clamps it inside the viewport (flipping up/left of the point if it would overflow). Used by ContextMenu, which opens at raw click coordinates with no anchor element. Default implementation is a no-op so existing implementers (and test doubles) keep compiling."
1969
+ },
1970
+ {
1971
+ "name": "InitToolbarRoving",
1972
+ "returnType": "ValueTask",
1973
+ "signature": "InitToolbarRoving(string toolbarId)",
1974
+ "summary": "Initialise a single-tab-stop roving tabindex over the toolbar's items."
1975
+ },
1976
+ {
1977
+ "name": "MoveToolbarFocus",
1978
+ "returnType": "ValueTask",
1979
+ "signature": "MoveToolbarFocus(string toolbarId, int delta)",
1980
+ "summary": "Move focus items from the focused toolbar item (clamped, no wrap)."
1981
+ },
1982
+ {
1983
+ "name": "FocusToolbarEdge",
1984
+ "returnType": "ValueTask",
1985
+ "signature": "FocusToolbarEdge(string toolbarId, bool last)",
1986
+ "summary": "Focus the first (=false) or last toolbar item."
1987
+ },
1844
1988
  {
1845
1989
  "name": "GetElementRect",
1846
1990
  "returnType": "ValueTask<ElementRect?>",
@@ -1859,6 +2003,18 @@
1859
2003
  "signature": "GetScrollTop(string elementId)",
1860
2004
  "summary": null
1861
2005
  },
2006
+ {
2007
+ "name": "RegisterPullToRefresh",
2008
+ "returnType": "ValueTask",
2009
+ "signature": "RegisterPullToRefresh(string elementId)",
2010
+ "summary": "Attaches a non-passive touchmove guard so PullToRefresh can claim a downward drag at scrollTop 0 instead of the browser consuming it as native overscroll. No-op off touch devices. See registerPullToRefresh."
2011
+ },
2012
+ {
2013
+ "name": "UnregisterPullToRefresh",
2014
+ "returnType": "ValueTask",
2015
+ "signature": "UnregisterPullToRefresh(string elementId)",
2016
+ "summary": null
2017
+ },
1862
2018
  {
1863
2019
  "name": "WheelScrollTop",
1864
2020
  "returnType": "ValueTask<double>",
@@ -2027,6 +2183,30 @@
2027
2183
  "signature": "ScrollspyScrollTo(string containerId, string sectionId, bool smooth)",
2028
2184
  "summary": null
2029
2185
  },
2186
+ {
2187
+ "name": "ScrollspyScrollTo",
2188
+ "returnType": "ValueTask",
2189
+ "signature": "ScrollspyScrollTo(string containerId, string sectionId, bool smooth, int offset)",
2190
+ "summary": "Click-scroll overload that honours the Scrollspy Offset (#246) so a programmatic jump lands at the same scroll position the observer treats as \"active\" (e.g. clearing a sticky header). The default implementation ignores the offset and forwards to the 3-arg overload so existing implementers / test doubles keep compiling unchanged."
2191
+ },
2192
+ {
2193
+ "name": "RegisterTabsOverflow",
2194
+ "returnType": "ValueTask",
2195
+ "signature": "RegisterTabsOverflow(string listId, Func<bool, bool, Task> handler)",
2196
+ "summary": null
2197
+ },
2198
+ {
2199
+ "name": "UnregisterTabsOverflow",
2200
+ "returnType": "ValueTask",
2201
+ "signature": "UnregisterTabsOverflow(string listId)",
2202
+ "summary": null
2203
+ },
2204
+ {
2205
+ "name": "TabsScrollBy",
2206
+ "returnType": "ValueTask",
2207
+ "signature": "TabsScrollBy(string listId, double delta, bool horizontal)",
2208
+ "summary": "Scrolls the tablist by px (smooth). Horizontal scrolls scrollLeft; vertical scrolls scrollTop."
2209
+ },
2030
2210
  {
2031
2211
  "name": "RegisterToastSwipe",
2032
2212
  "returnType": "ValueTask",
@@ -2111,6 +2291,12 @@
2111
2291
  "signature": "ScrollSelectorIntoView(string selector)",
2112
2292
  "summary": "Instantly scrolls the first element matching into the viewport (block: center). Call BEFORE LockScroll — a locked body can't be scrolled, programmatically or otherwise."
2113
2293
  },
2294
+ {
2295
+ "name": "ScrollIntoView",
2296
+ "returnType": "ValueTask",
2297
+ "signature": "ScrollIntoView(string elementId, string block = \"nearest\")",
2298
+ "summary": "Scrolls the element with id into view within its nearest scroll container. Used by keyboard-navigated lists (e.g. the Command palette active item) to keep the highlighted row visible. maps to scrollIntoView's block option (\"nearest\" by default so already-visible rows don't jump). Default implementation is a no-op so existing implementers / test doubles keep compiling."
2299
+ },
2114
2300
  {
2115
2301
  "name": "RegisterAffix",
2116
2302
  "returnType": "ValueTask",
@@ -2129,6 +2315,18 @@
2129
2315
  "signature": "GetTextareaCaretPosition(string elementId)",
2130
2316
  "summary": null
2131
2317
  },
2318
+ {
2319
+ "name": "GetInputCaret",
2320
+ "returnType": "ValueTask<int>",
2321
+ "signature": "GetInputCaret(string elementId)",
2322
+ "summary": null
2323
+ },
2324
+ {
2325
+ "name": "SetInputCaret",
2326
+ "returnType": "ValueTask",
2327
+ "signature": "SetInputCaret(string elementId, int position)",
2328
+ "summary": null
2329
+ },
2132
2330
  {
2133
2331
  "name": "TabsMeasure",
2134
2332
  "returnType": "ValueTask<ComponentInteropService.TabMeasurement?>",
@@ -2177,6 +2375,18 @@
2177
2375
  "signature": "RippleDetachAsync(Microsoft.AspNetCore.Components.ElementReference element)",
2178
2376
  "summary": null
2179
2377
  },
2378
+ {
2379
+ "name": "PrefersReducedMotion",
2380
+ "returnType": "ValueTask<bool>",
2381
+ "signature": "PrefersReducedMotion()",
2382
+ "summary": "Core-side prefers-reduced-motion: reduce query (mirrors the Lumeo.Motion helper) for core components that animate via Blazor/JS and can't be fully neutralised by a CSS @media block alone. Default returns false (motion allowed) so existing implementers/test doubles keep compiling unchanged."
2383
+ },
2384
+ {
2385
+ "name": "TouchRippleCoords",
2386
+ "returnType": "ValueTask<RipplePoint>",
2387
+ "signature": "TouchRippleCoords(string hostElementId, double clientX, double clientY)",
2388
+ "summary": "Resolves a pointer's viewport coordinates (, ) into coordinates relative to the element identified by . Used by TouchRipple so a ripple is centred on the click point even when the pointer lands on a nested child (where OffsetX/OffsetY would be relative to the child, not the ripple host). Default returns (0,0) for test doubles."
2389
+ },
2180
2390
  {
2181
2391
  "name": "PlayMedia",
2182
2392
  "returnType": "ValueTask",
@@ -2201,6 +2411,12 @@
2201
2411
  "signature": "SeekMedia(Microsoft.AspNetCore.Components.ElementReference element, double seconds)",
2202
2412
  "summary": null
2203
2413
  },
2414
+ {
2415
+ "name": "SetPlaybackRate",
2416
+ "returnType": "ValueTask",
2417
+ "signature": "SetPlaybackRate(Microsoft.AspNetCore.Components.ElementReference element, double rate)",
2418
+ "summary": "Sets the media element's playbackRate (clamped 0.25–4×)."
2419
+ },
2204
2420
  {
2205
2421
  "name": "GetMediaState",
2206
2422
  "returnType": "ValueTask<MediaState>",
@@ -2231,10 +2447,16 @@
2231
2447
  "signature": "RemoveFromLocalStorage(string key)",
2232
2448
  "summary": null
2233
2449
  },
2450
+ {
2451
+ "name": "MotionPrefersReducedMotion",
2452
+ "returnType": "ValueTask<bool>",
2453
+ "signature": "MotionPrefersReducedMotion()",
2454
+ "summary": "Queries the browser's prefers-reduced-motion: reduce media query via the Lumeo.Motion JS module. Lets a component branch in C# (skip a burst, snap to the end value) before scheduling any JS-driven animation that a CSS @media block can't reach. The default implementation returns false (motion allowed) so existing implementers and test doubles keep compiling and behave exactly as before."
2455
+ },
2234
2456
  {
2235
2457
  "name": "MotionTickNumber",
2236
2458
  "returnType": "ValueTask",
2237
- "signature": "MotionTickNumber(string elementId, double from, double to, int durationMs, int decimals, string separator = \",\")",
2459
+ "signature": "MotionTickNumber(string elementId, double from, double to, int durationMs, int decimals, string separator = \",\", string decimalSeparator = \".\")",
2238
2460
  "summary": null
2239
2461
  },
2240
2462
  {
@@ -3300,7 +3522,7 @@
3300
3522
  "name": "TextareaCaretInfo",
3301
3523
  "kind": "record",
3302
3524
  "namespace": "Lumeo.Services",
3303
- "summary": null,
3525
+ "summary": "Top/Left are viewport-relative (legacy). OffsetTop/OffsetLeft are relative to the textarea's offset parent (its position: relative wrapper) so a caret-anchored dropdown can be positioned absolutely and track the textarea on scroll. LineHeight is the computed line height so callers can drop the dropdown one line below the caret.",
3304
3526
  "properties": [
3305
3527
  {
3306
3528
  "name": "Top",
@@ -3319,6 +3541,24 @@
3319
3541
  "type": "int",
3320
3542
  "default": null,
3321
3543
  "summary": null
3544
+ },
3545
+ {
3546
+ "name": "OffsetTop",
3547
+ "type": "double",
3548
+ "default": "0",
3549
+ "summary": null
3550
+ },
3551
+ {
3552
+ "name": "OffsetLeft",
3553
+ "type": "double",
3554
+ "default": "0",
3555
+ "summary": null
3556
+ },
3557
+ {
3558
+ "name": "LineHeight",
3559
+ "type": "double",
3560
+ "default": "20",
3561
+ "summary": null
3322
3562
  }
3323
3563
  ],
3324
3564
  "methods": [],
@@ -3557,6 +3797,12 @@
3557
3797
  "signature": "InitializeAsync()",
3558
3798
  "summary": null
3559
3799
  },
3800
+ {
3801
+ "name": "OnExternalThemeChange",
3802
+ "returnType": "Task",
3803
+ "signature": "OnExternalThemeChange()",
3804
+ "summary": "Invoked from JS when the OS color scheme changes (in System mode) or another tab updates the theme. Re-reads the live state and raises OnThemeChanged so subscribed components repaint."
3805
+ },
3560
3806
  {
3561
3807
  "name": "SetModeAsync",
3562
3808
  "returnType": "Task",
@@ -3586,6 +3832,18 @@
3586
3832
  "returnType": "Task<LayoutDirection>",
3587
3833
  "signature": "GetDirectionAsync()",
3588
3834
  "summary": null
3835
+ },
3836
+ {
3837
+ "name": "DisposeAsync",
3838
+ "returnType": "ValueTask",
3839
+ "signature": "DisposeAsync()",
3840
+ "summary": null
3841
+ },
3842
+ {
3843
+ "name": "Dispose",
3844
+ "returnType": "void",
3845
+ "signature": "Dispose()",
3846
+ "summary": null
3589
3847
  }
3590
3848
  ],
3591
3849
  "events": [
@@ -3671,7 +3929,39 @@
3671
3929
  "name": "DefaultValues",
3672
3930
  "type": "List<string>?",
3673
3931
  "default": null,
3674
- "description": null,
3932
+ "description": "Initial open items for the uncontrolled usage. Ignored once Value / Values drive the component.",
3933
+ "isCascading": false,
3934
+ "captureUnmatched": false
3935
+ },
3936
+ {
3937
+ "name": "Value",
3938
+ "type": "string?",
3939
+ "default": null,
3940
+ "description": "Controlled open item for Single. When non-null the accordion is controlled — its open state comes entirely from this parameter and toggles are reported via ValueChanged (the consumer owns the state). Pair with @bind-Value. An empty string means \"all collapsed\". Leave null for the uncontrolled behaviour seeded by DefaultValues.",
3941
+ "isCascading": false,
3942
+ "captureUnmatched": false
3943
+ },
3944
+ {
3945
+ "name": "ValueChanged",
3946
+ "type": "EventCallback<string>",
3947
+ "default": null,
3948
+ "description": "Two-way callback for Value (Single mode).",
3949
+ "isCascading": false,
3950
+ "captureUnmatched": false
3951
+ },
3952
+ {
3953
+ "name": "Values",
3954
+ "type": "IReadOnlyList<string>?",
3955
+ "default": null,
3956
+ "description": "Controlled open items for Multiple. When non-null the accordion is controlled. Pair with @bind-Values. Leave null for the uncontrolled behaviour seeded by DefaultValues.",
3957
+ "isCascading": false,
3958
+ "captureUnmatched": false
3959
+ },
3960
+ {
3961
+ "name": "ValuesChanged",
3962
+ "type": "EventCallback<IReadOnlyList<string>>",
3963
+ "default": null,
3964
+ "description": "Two-way callback for Values (Multiple mode).",
3675
3965
  "isCascading": false,
3676
3966
  "captureUnmatched": false
3677
3967
  },
@@ -3692,7 +3982,18 @@
3692
3982
  "captureUnmatched": true
3693
3983
  }
3694
3984
  ],
3695
- "events": [],
3985
+ "events": [
3986
+ {
3987
+ "name": "ValueChanged",
3988
+ "type": "EventCallback<string>",
3989
+ "description": "Two-way callback for Value (Single mode)."
3990
+ },
3991
+ {
3992
+ "name": "ValuesChanged",
3993
+ "type": "EventCallback<IReadOnlyList<string>>",
3994
+ "description": "Two-way callback for Values (Multiple mode)."
3995
+ }
3996
+ ],
3696
3997
  "enums": [
3697
3998
  {
3698
3999
  "name": "AccordionType",
@@ -3706,7 +4007,7 @@
3706
4007
  "records": [
3707
4008
  {
3708
4009
  "name": "AccordionContext",
3709
- "signature": "AccordionContext(AccordionType Type, HashSet<string> OpenItems, EventCallback<string> Toggle)",
4010
+ "signature": "AccordionContext(\n AccordionType Type,\n HashSet<string> OpenItems,\n EventCallback<string> Toggle,\n Action<string, string, bool> RegisterTrigger,\n Action<string> UnregisterTrigger,\n EventCallback<(string Value, int Delta, bool ToEdge, bool Last)> MoveFocus)",
3710
4011
  "description": null
3711
4012
  }
3712
4013
  ],
@@ -3866,7 +4167,9 @@
3866
4167
  "fileName": "AccordionTrigger.razor",
3867
4168
  "namespace": "Lumeo",
3868
4169
  "inheritsFrom": null,
3869
- "implements": [],
4170
+ "implements": [
4171
+ "IAsyncDisposable"
4172
+ ],
3870
4173
  "parameters": [
3871
4174
  {
3872
4175
  "name": "Context",
@@ -4051,6 +4354,38 @@
4051
4354
  "isCascading": false,
4052
4355
  "captureUnmatched": false
4053
4356
  },
4357
+ {
4358
+ "name": "Virtualize",
4359
+ "type": "bool",
4360
+ "default": null,
4361
+ "description": "Opt-in virtualization for long threads. When true AND Items is supplied, messages render through Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize{TItem} so only the rows near the viewport are in the DOM. Leave false to use the simple ChildContent path (unchanged default).",
4362
+ "isCascading": false,
4363
+ "captureUnmatched": false
4364
+ },
4365
+ {
4366
+ "name": "Items",
4367
+ "type": "IReadOnlyList<RenderFragment>?",
4368
+ "default": null,
4369
+ "description": "The per-message render fragments to virtualize. Each entry is rendered as one row (typically an AgentMessage). Only used when Virtualize is true; ignored otherwise.",
4370
+ "isCascading": false,
4371
+ "captureUnmatched": false
4372
+ },
4373
+ {
4374
+ "name": "ItemSize",
4375
+ "type": "float",
4376
+ "default": "80f",
4377
+ "description": "Estimated row height in pixels for the virtualizer (default 80).",
4378
+ "isCascading": false,
4379
+ "captureUnmatched": false
4380
+ },
4381
+ {
4382
+ "name": "OverscanCount",
4383
+ "type": "int",
4384
+ "default": "4",
4385
+ "description": "Extra rows to render above/below the viewport to smooth scrolling (default 4).",
4386
+ "isCascading": false,
4387
+ "captureUnmatched": false
4388
+ },
4054
4389
  {
4055
4390
  "name": "Class",
4056
4391
  "type": "string?",
@@ -4121,6 +4456,30 @@
4121
4456
  "isCascading": false,
4122
4457
  "captureUnmatched": false
4123
4458
  },
4459
+ {
4460
+ "name": "TimeZone",
4461
+ "type": "TimeZoneInfo?",
4462
+ "default": null,
4463
+ "description": "Time zone to render Timestamp in. When set, the timestamp is converted to this zone — pass the END USER'S zone here (in Blazor Server the component runs on the server, so the previous ToLocalTime() showed the SERVER'S zone, which is the bug #303 fixed). When null, the timestamp is rendered in the offset it already carries (a DateTimeOffset knows its own offset), so it is deterministic and server-independent.",
4464
+ "isCascading": false,
4465
+ "captureUnmatched": false
4466
+ },
4467
+ {
4468
+ "name": "TimestampFormat",
4469
+ "type": "string",
4470
+ "default": "\"HH:mm\"",
4471
+ "description": "Custom format string for the visible timestamp (default \"HH:mm\").",
4472
+ "isCascading": false,
4473
+ "captureUnmatched": false
4474
+ },
4475
+ {
4476
+ "name": "TimestampCulture",
4477
+ "type": "System.Globalization.CultureInfo?",
4478
+ "default": null,
4479
+ "description": "Culture used to format the timestamp (defaults to CurrentCulture).",
4480
+ "isCascading": false,
4481
+ "captureUnmatched": false
4482
+ },
4124
4483
  {
4125
4484
  "name": "IsStreaming",
4126
4485
  "type": "bool",
@@ -4402,6 +4761,14 @@
4402
4761
  "isCascading": false,
4403
4762
  "captureUnmatched": false
4404
4763
  },
4764
+ {
4765
+ "name": "DefaultOpen",
4766
+ "type": "bool",
4767
+ "default": null,
4768
+ "description": "Uncontrolled initial open state (Radix defaultOpen). Used only when the consumer does NOT bind Open: the dialog then owns its open state internally, seeded from this value. Ignored when Open is supplied (controlled mode).",
4769
+ "isCascading": false,
4770
+ "captureUnmatched": false
4771
+ },
4405
4772
  {
4406
4773
  "name": "OnBeforeClose",
4407
4774
  "type": "EventCallback<DismissEventArgs>",
@@ -5298,6 +5665,46 @@
5298
5665
  "isCascading": false,
5299
5666
  "captureUnmatched": false
5300
5667
  },
5668
+ {
5669
+ "name": "ShowSkipButtons",
5670
+ "type": "bool",
5671
+ "default": "true",
5672
+ "description": "Show skip-back / skip-forward buttons (±SkipSeconds).",
5673
+ "isCascading": false,
5674
+ "captureUnmatched": false
5675
+ },
5676
+ {
5677
+ "name": "SkipSeconds",
5678
+ "type": "int",
5679
+ "default": "10",
5680
+ "description": "Seconds to jump per skip-button press / arrow key. Defaults to 10.",
5681
+ "isCascading": false,
5682
+ "captureUnmatched": false
5683
+ },
5684
+ {
5685
+ "name": "ShowPlaybackRate",
5686
+ "type": "bool",
5687
+ "default": "true",
5688
+ "description": "Show the playback-rate cycle button (0.5× → 2×).",
5689
+ "isCascading": false,
5690
+ "captureUnmatched": false
5691
+ },
5692
+ {
5693
+ "name": "PlaybackRates",
5694
+ "type": "double[]",
5695
+ "default": "{ 0.5, 1.0, 1.25, 1.5, 2.0 }",
5696
+ "description": "Selectable playback rates, cycled by the rate button. Defaults to 0.5×, 1×, 1.25×, 1.5×, 2×.",
5697
+ "isCascading": false,
5698
+ "captureUnmatched": false
5699
+ },
5700
+ {
5701
+ "name": "ShowVolume",
5702
+ "type": "bool",
5703
+ "default": "true",
5704
+ "description": "Show the volume slider next to the mute toggle.",
5705
+ "isCascading": false,
5706
+ "captureUnmatched": false
5707
+ },
5301
5708
  {
5302
5709
  "name": "OnTimeUpdate",
5303
5710
  "type": "EventCallback<double>",
@@ -5420,8 +5827,18 @@
5420
5827
  ],
5421
5828
  "namespace": "Lumeo",
5422
5829
  "inheritsFrom": null,
5423
- "implements": [],
5830
+ "implements": [
5831
+ "IDisposable"
5832
+ ],
5424
5833
  "parameters": [
5834
+ {
5835
+ "name": "GroupContext",
5836
+ "type": "AvatarGroup.AvatarGroupContext?",
5837
+ "default": null,
5838
+ "description": null,
5839
+ "isCascading": true,
5840
+ "captureUnmatched": false
5841
+ },
5425
5842
  {
5426
5843
  "name": "ChildContent",
5427
5844
  "type": "RenderFragment?",
@@ -5533,8 +5950,18 @@
5533
5950
  "fileName": "AvatarFallback.razor",
5534
5951
  "namespace": "Lumeo",
5535
5952
  "inheritsFrom": null,
5536
- "implements": [],
5953
+ "implements": [
5954
+ "IDisposable"
5955
+ ],
5537
5956
  "parameters": [
5957
+ {
5958
+ "name": "ImageContext",
5959
+ "type": "Avatar.AvatarImageContext?",
5960
+ "default": null,
5961
+ "description": null,
5962
+ "isCascading": true,
5963
+ "captureUnmatched": false
5964
+ },
5538
5965
  {
5539
5966
  "name": "ChildContent",
5540
5967
  "type": "RenderFragment?",
@@ -5586,7 +6013,7 @@
5586
6013
  "name": "Max",
5587
6014
  "type": "int",
5588
6015
  "default": null,
5589
- "description": null,
6016
+ "description": "Maximum number of avatars to show before collapsing the rest into a single \"+N\" overflow chip. 0 (default) shows them all.",
5590
6017
  "isCascading": false,
5591
6018
  "captureUnmatched": false
5592
6019
  },
@@ -5594,7 +6021,7 @@
5594
6021
  "name": "Total",
5595
6022
  "type": "int",
5596
6023
  "default": null,
5597
- "description": null,
6024
+ "description": "Optional explicit total used to compute \"+N\". Set this when the group represents more people than the avatars actually rendered (e.g. \"show 3 of 50\"): the chip then reads Total - Max. When left at 0 the overflow is computed from the number of child avatars instead, so a plain group of N children with Max set \"just works\".",
5598
6025
  "isCascading": false,
5599
6026
  "captureUnmatched": false
5600
6027
  },
@@ -5617,7 +6044,13 @@
5617
6044
  ],
5618
6045
  "events": [],
5619
6046
  "enums": [],
5620
- "records": [],
6047
+ "records": [
6048
+ {
6049
+ "name": "AvatarGroupContext",
6050
+ "signature": "AvatarGroupContext(AvatarGroupRegistrar Registrar, int Max)",
6051
+ "description": "Cascaded to child Avatars so the group can cap how many are visible. Tokens at an ordinal index &gt;= Max report IsHidden true and collapse, leaving room for the \"+N\" chip."
6052
+ }
6053
+ ],
5621
6054
  "gotchas": [],
5622
6055
  "parseFailed": false,
5623
6056
  "parseError": null
@@ -5629,6 +6062,14 @@
5629
6062
  "inheritsFrom": null,
5630
6063
  "implements": [],
5631
6064
  "parameters": [
6065
+ {
6066
+ "name": "ImageContext",
6067
+ "type": "Avatar.AvatarImageContext?",
6068
+ "default": null,
6069
+ "description": null,
6070
+ "isCascading": true,
6071
+ "captureUnmatched": false
6072
+ },
5632
6073
  {
5633
6074
  "name": "Src",
5634
6075
  "type": "string?",
@@ -7480,6 +7921,30 @@
7480
7921
  "isCascading": false,
7481
7922
  "captureUnmatched": false
7482
7923
  },
7924
+ {
7925
+ "name": "IsMultiple",
7926
+ "type": "bool",
7927
+ "default": null,
7928
+ "description": "When true the grid selects a set of independent days: clicking a day (or Enter/Space on it) toggles it in/out of Values. Takes precedence over single Value selection; ignored when IsRange is set.",
7929
+ "isCascading": false,
7930
+ "captureUnmatched": false
7931
+ },
7932
+ {
7933
+ "name": "Values",
7934
+ "type": "List<DateOnly>?",
7935
+ "default": null,
7936
+ "description": "The selected days in multiple-selection mode. Pair with ValuesChanged for two-way binding.",
7937
+ "isCascading": false,
7938
+ "captureUnmatched": false
7939
+ },
7940
+ {
7941
+ "name": "ValuesChanged",
7942
+ "type": "EventCallback<List<DateOnly>?>",
7943
+ "default": null,
7944
+ "description": null,
7945
+ "isCascading": false,
7946
+ "captureUnmatched": false
7947
+ },
7483
7948
  {
7484
7949
  "name": "NumberOfMonths",
7485
7950
  "type": "int",
@@ -7592,6 +8057,11 @@
7592
8057
  "name": "RangeEndChanged",
7593
8058
  "type": "EventCallback<DateOnly?>",
7594
8059
  "description": null
8060
+ },
8061
+ {
8062
+ "name": "ValuesChanged",
8063
+ "type": "EventCallback<List<DateOnly>?>",
8064
+ "description": null
7595
8065
  }
7596
8066
  ],
7597
8067
  "enums": [],
@@ -7946,6 +8416,38 @@
7946
8416
  "isCascading": false,
7947
8417
  "captureUnmatched": false
7948
8418
  },
8419
+ {
8420
+ "name": "Autoplay",
8421
+ "type": "bool",
8422
+ "default": null,
8423
+ "description": "Advance slides automatically on a timer. Pairs well with Loop so the deck wraps instead of stopping at the end.",
8424
+ "isCascading": false,
8425
+ "captureUnmatched": false
8426
+ },
8427
+ {
8428
+ "name": "AutoplayInterval",
8429
+ "type": "int",
8430
+ "default": "4000",
8431
+ "description": "Autoplay tick interval in milliseconds. Defaults to 4000.",
8432
+ "isCascading": false,
8433
+ "captureUnmatched": false
8434
+ },
8435
+ {
8436
+ "name": "PauseOnHover",
8437
+ "type": "bool",
8438
+ "default": "true",
8439
+ "description": "Pause autoplay while the pointer is over the carousel or focus is inside it (so users can read / interact). Defaults to true.",
8440
+ "isCascading": false,
8441
+ "captureUnmatched": false
8442
+ },
8443
+ {
8444
+ "name": "ShowIndicators",
8445
+ "type": "bool",
8446
+ "default": null,
8447
+ "description": "Render clickable indicator dots (one per slide) below the deck.",
8448
+ "isCascading": false,
8449
+ "captureUnmatched": false
8450
+ },
7949
8451
  {
7950
8452
  "name": "ChildContent",
7951
8453
  "type": "RenderFragment?",
@@ -7985,6 +8487,7 @@
7985
8487
  "--color-accent",
7986
8488
  "--color-accent-foreground",
7987
8489
  "--color-background",
8490
+ "--color-primary",
7988
8491
  "--color-ring",
7989
8492
  "--radius"
7990
8493
  ],
@@ -16943,7 +17446,15 @@
16943
17446
  "name": "ShowMinimap",
16944
17447
  "type": "bool",
16945
17448
  "default": null,
16946
- "description": "CodeMirror 6 does not ship a native minimap. Kept for API symmetry with Monaco-style wrappers; today this is a no-op. A future revision may render a custom minimap using the scrollDOM viewport API.",
17449
+ "description": "Shows a scrollbar-side minimap of the document. CodeMirror 6 has no built-in minimap, so this lazily loads the @@replit/codemirror-minimap extension from EsmBase on first enable. If that import fails (e.g. offline with no self-hosted copy of the package) the editor degrades gracefully the rest of the editor keeps working, just without a minimap. Toggling at runtime adds/removes the extension without losing selection or scroll position.",
17450
+ "isCascading": false,
17451
+ "captureUnmatched": false
17452
+ },
17453
+ {
17454
+ "name": "EsmBase",
17455
+ "type": "string?",
17456
+ "default": null,
17457
+ "description": "Base URL the CodeMirror core, language packs, theme, and minimap are imported from. Defaults to the public esm.sh CDN. Point this at a self-hosted ESM mirror (or a path served by your own app) for air-gapped / offline / strict-CSP deployments — e.g. EsmBase=\"/_content/MyApp/esm\" or EsmBase=\"https://esm.myco.internal\". A trailing slash is optional. When null, falls back to the global window.lumeoCdn.codeMirrorBase override (if set) and then esm.sh.",
16947
17458
  "isCascading": false,
16948
17459
  "captureUnmatched": false
16949
17460
  },
@@ -18233,6 +18744,14 @@
18233
18744
  "isCascading": false,
18234
18745
  "captureUnmatched": false
18235
18746
  },
18747
+ {
18748
+ "name": "Disabled",
18749
+ "type": "bool",
18750
+ "default": null,
18751
+ "description": "When true, the item renders muted/non-interactive, announces aria-disabled and cannot be selected by click — mirrors SelectItem.Disabled.",
18752
+ "isCascading": false,
18753
+ "captureUnmatched": false
18754
+ },
18236
18755
  {
18237
18756
  "name": "Class",
18238
18757
  "type": "string?",
@@ -18960,7 +19479,7 @@
18960
19479
  "namespace": "Lumeo",
18961
19480
  "inheritsFrom": null,
18962
19481
  "implements": [
18963
- "IDisposable"
19482
+ "IAsyncDisposable"
18964
19483
  ],
18965
19484
  "parameters": [
18966
19485
  {
@@ -19355,6 +19874,14 @@
19355
19874
  "isCascading": false,
19356
19875
  "captureUnmatched": false
19357
19876
  },
19877
+ {
19878
+ "name": "Disabled",
19879
+ "type": "bool",
19880
+ "default": null,
19881
+ "description": null,
19882
+ "isCascading": false,
19883
+ "captureUnmatched": false
19884
+ },
19358
19885
  {
19359
19886
  "name": "Class",
19360
19887
  "type": "string?",
@@ -22761,6 +23288,14 @@
22761
23288
  "isCascading": false,
22762
23289
  "captureUnmatched": false
22763
23290
  },
23291
+ {
23292
+ "name": "AriaColCount",
23293
+ "type": "int",
23294
+ "default": null,
23295
+ "description": "Total column count reported via aria-colcount on the grid (including the selection column when Selectable is on). Set this when the header/row templates render a fixed number of columns so assistive tech can announce \"column X of N\". 0 (default) omits the attribute since the count can't be inferred from consumer templates.",
23296
+ "isCascading": false,
23297
+ "captureUnmatched": false
23298
+ },
22764
23299
  {
22765
23300
  "name": "Virtualize",
22766
23301
  "type": "bool",
@@ -23153,6 +23688,22 @@
23153
23688
  "isCascading": false,
23154
23689
  "captureUnmatched": false
23155
23690
  },
23691
+ {
23692
+ "name": "Values",
23693
+ "type": "List<DateOnly>?",
23694
+ "default": null,
23695
+ "description": "The selected days for Multiple. Clicking a day (or Enter/Space on it) toggles it in/out of the set; the popover stays open so several days can be picked in one session. Pair with ValuesChanged for two-way binding.",
23696
+ "isCascading": false,
23697
+ "captureUnmatched": false
23698
+ },
23699
+ {
23700
+ "name": "ValuesChanged",
23701
+ "type": "EventCallback<List<DateOnly>?>",
23702
+ "default": null,
23703
+ "description": null,
23704
+ "isCascading": false,
23705
+ "captureUnmatched": false
23706
+ },
23156
23707
  {
23157
23708
  "name": "ShowTimePicker",
23158
23709
  "type": "bool",
@@ -23311,6 +23862,11 @@
23311
23862
  "type": "EventCallback<DateOnly?>",
23312
23863
  "description": null
23313
23864
  },
23865
+ {
23866
+ "name": "ValuesChanged",
23867
+ "type": "EventCallback<List<DateOnly>?>",
23868
+ "description": null
23869
+ },
23314
23870
  {
23315
23871
  "name": "TimeChanged",
23316
23872
  "type": "EventCallback<TimeSpan?>",
@@ -23334,7 +23890,8 @@
23334
23890
  "Single",
23335
23891
  "Range",
23336
23892
  "Month",
23337
- "Year"
23893
+ "Year",
23894
+ "Multiple"
23338
23895
  ],
23339
23896
  "description": null
23340
23897
  },
@@ -23781,6 +24338,22 @@
23781
24338
  "isCascading": false,
23782
24339
  "captureUnmatched": false
23783
24340
  },
24341
+ {
24342
+ "name": "MinuteStep",
24343
+ "type": "int",
24344
+ "default": "1",
24345
+ "description": "Minute column increment. 1 (default) lists every minute; 5/15 etc. list only multiples of the step.",
24346
+ "isCascading": false,
24347
+ "captureUnmatched": false
24348
+ },
24349
+ {
24350
+ "name": "SecondStep",
24351
+ "type": "int",
24352
+ "default": "1",
24353
+ "description": "Second column increment (only relevant when ShowSeconds is true). Defaults to 1.",
24354
+ "isCascading": false,
24355
+ "captureUnmatched": false
24356
+ },
23784
24357
  {
23785
24358
  "name": "DateFormat",
23786
24359
  "type": "string?",
@@ -24279,6 +24852,14 @@
24279
24852
  "isCascading": false,
24280
24853
  "captureUnmatched": false
24281
24854
  },
24855
+ {
24856
+ "name": "DefaultOpen",
24857
+ "type": "bool",
24858
+ "default": null,
24859
+ "description": "Uncontrolled initial open state. Used only when the consumer does NOT bind Open (Radix defaultOpen): the dialog then owns its open state internally, seeded from this value. When Open is supplied the component is controlled and this is ignored.",
24860
+ "isCascading": false,
24861
+ "captureUnmatched": false
24862
+ },
24282
24863
  {
24283
24864
  "name": "OnBeforeClose",
24284
24865
  "type": "EventCallback<DismissEventArgs>",
@@ -26177,6 +26758,14 @@
26177
26758
  "isCascading": false,
26178
26759
  "captureUnmatched": false
26179
26760
  },
26761
+ {
26762
+ "name": "Disabled",
26763
+ "type": "bool",
26764
+ "default": null,
26765
+ "description": "When true the trigger ignores clicks and is marked aria-disabled. The live @onclick sits on this outer role=\"button\" element, not the wrapped Button, so disabling only the inner button (as DropdownButton/SplitButton do) previously still let a click on the trigger padding open the menu — this gates that.",
26766
+ "isCascading": false,
26767
+ "captureUnmatched": false
26768
+ },
26180
26769
  {
26181
26770
  "name": "Class",
26182
26771
  "type": "string?",
@@ -26375,7 +26964,7 @@
26375
26964
  "examples": [
26376
26965
  {
26377
26966
  "title": "Basic Feature Grid",
26378
- "code": "<FeatureGrid Title=\"Everything in the box\"\n Subtitle=\"A focused set of primitives that compose into anything.\">\n <FeatureItem Title=\"Theming\" Description=\"Every color is a CSS variable.\">\n <Icon><Blazicon Svg=\"Lucide.Palette\" class=\"h-5 w-5\" /></Icon>\n </FeatureItem>\n <FeatureItem Title=\"Accessible\" Description=\"WAI-ARIA roles and keyboard navigation.\">\n <Icon><Blazicon Svg=\"Lucide.Accessibility\" class=\"h-5 w-5\" /></Icon>\n </FeatureItem>\n <FeatureItem Title=\"Density\" Description=\"Flip a panel between compact and spacious.\">\n <Icon><Blazicon Svg=\"Lucide.Rows3\" class=\"h-5 w-5\" /></Icon>\n </FeatureItem>\n</FeatureGrid>"
26967
+ "code": "<FeatureGrid Title=\"Everything in the box\"\n Subtitle=\"A focused set of primitives that compose into anything.\">\n <FeatureItem Title=\"Theming\" Description=\"Every color is a CSS variable.\">\n <IconContent><Blazicon Svg=\"Lucide.Palette\" class=\"h-5 w-5\" /></IconContent>\n </FeatureItem>\n <FeatureItem Title=\"Accessible\" Description=\"WAI-ARIA roles and keyboard navigation.\">\n <IconContent><Blazicon Svg=\"Lucide.Accessibility\" class=\"h-5 w-5\" /></IconContent>\n </FeatureItem>\n <FeatureItem Title=\"Density\" Description=\"Flip a panel between compact and spacious.\">\n <IconContent><Blazicon Svg=\"Lucide.Rows3\" class=\"h-5 w-5\" /></IconContent>\n </FeatureItem>\n</FeatureGrid>"
26379
26968
  },
26380
26969
  {
26381
26970
  "title": "Two Columns",
@@ -26383,7 +26972,7 @@
26383
26972
  },
26384
26973
  {
26385
26974
  "title": "Standalone Feature Item",
26386
- "code": "<FeatureItem Title=\"Fast by default\" Description=\"A small CSS bundle keeps your app lean.\">\n <Icon><Blazicon Svg=\"Lucide.Zap\" class=\"h-5 w-5\" /></Icon>\n</FeatureItem>"
26975
+ "code": "<FeatureItem Title=\"Fast by default\" Description=\"A small CSS bundle keeps your app lean.\">\n <IconContent><Blazicon Svg=\"Lucide.Zap\" class=\"h-5 w-5\" /></IconContent>\n</FeatureItem>"
26387
26976
  }
26388
26977
  ],
26389
26978
  "subComponents": {},
@@ -26420,10 +27009,10 @@
26420
27009
  "captureUnmatched": false
26421
27010
  },
26422
27011
  {
26423
- "name": "Icon",
27012
+ "name": "IconContent",
26424
27013
  "type": "RenderFragment?",
26425
27014
  "default": null,
26426
- "description": null,
27015
+ "description": "The icon slot rendered in the leading badge. Named IconContent (not Icon) so the Icon component can be used freely inside it — a parameter called Icon shadowed the component type, turning &lt;Icon&gt; into the slot rather than the icon (#300).",
26427
27016
  "isCascading": false,
26428
27017
  "captureUnmatched": false
26429
27018
  },
@@ -27136,7 +27725,23 @@
27136
27725
  "name": "HttpClient",
27137
27726
  "type": "HttpClient?",
27138
27727
  "default": null,
27139
- "description": "Plug a custom HttpClient for the text fetches. Use this to attach a pre-configured Authorization handler instead of mutating the default client. Wins over ConfigureRequest.",
27728
+ "description": "Plug a custom HttpClient for the text fetches. Use this to attach a pre-configured Authorization handler instead of mutating the default client. Highest precedence — wins over HttpClientName, DI, and the factory.",
27729
+ "isCascading": false,
27730
+ "captureUnmatched": false
27731
+ },
27732
+ {
27733
+ "name": "HttpClientName",
27734
+ "type": "string?",
27735
+ "default": null,
27736
+ "description": "Name of the client to pull from a DI-registered IHttpClientFactory for the text fetches (Markdown/Code/JSON/CSV/Text). When the factory is registered (the common case once AddHttpClient() has been called) this is the recommended way to get a correctly-pooled client and avoid socket exhaustion. Ignored when an explicit HttpClient is supplied. Null/empty uses the factory's default client.",
27737
+ "isCascading": false,
27738
+ "captureUnmatched": false
27739
+ },
27740
+ {
27741
+ "name": "EnableOfficeOnlineViewer",
27742
+ "type": "bool",
27743
+ "default": null,
27744
+ "description": "Show an \"Open in viewer\" action on the Office-document fallback panel that opens the file in the Microsoft Office web viewer. Off by default because it sends the document URL to a Microsoft endpoint and only works for publicly reachable absolute http(s) URLs.",
27140
27745
  "isCascading": false,
27141
27746
  "captureUnmatched": false
27142
27747
  },
@@ -27243,6 +27848,7 @@
27243
27848
  "--color-border",
27244
27849
  "--color-card",
27245
27850
  "--color-foreground",
27851
+ "--color-input",
27246
27852
  "--color-muted",
27247
27853
  "--color-muted-foreground",
27248
27854
  "--color-primary",
@@ -29087,6 +29693,14 @@
29087
29693
  "isCascading": false,
29088
29694
  "captureUnmatched": false
29089
29695
  },
29696
+ {
29697
+ "name": "Title",
29698
+ "type": "string?",
29699
+ "default": null,
29700
+ "description": "Accessible name for the icon. When set, the icon is exposed to assistive technology as role=\"img\" with this string as its aria-label (and a &lt;title&gt; for tooltip/hover parity). When left null the icon is treated as decorative and hidden from screen readers via aria-hidden=\"true\" — the correct default for icons that sit beside a visible text label (a button's own text already conveys the meaning). A consumer-supplied role/aria-label/aria-hidden/ aria-labelledby in attributes always wins over these defaults.",
29701
+ "isCascading": false,
29702
+ "captureUnmatched": false
29703
+ },
29090
29704
  {
29091
29705
  "name": "Class",
29092
29706
  "type": "string?",
@@ -30160,6 +30774,22 @@
30160
30774
  "isCascading": false,
30161
30775
  "captureUnmatched": false
30162
30776
  },
30777
+ {
30778
+ "name": "OnCardDrop",
30779
+ "type": "EventCallback<DropEventArgs>",
30780
+ "default": null,
30781
+ "description": "Raised when a card is dropped onto a column (mouse/touch drag) and the board can resolve which card moved, from which column, to which column and at what index. Fires only when cards carry a CardId and columns a ColumnId; otherwise the per-column OnDrop still fires with the raw event for fully-manual boards.",
30782
+ "isCascading": false,
30783
+ "captureUnmatched": false
30784
+ },
30785
+ {
30786
+ "name": "OnCardMove",
30787
+ "type": "EventCallback<MoveEventArgs>",
30788
+ "default": null,
30789
+ "description": "Raised when a card is moved via the keyboard (arrow keys on a focused card): Left/Right move it to the previous/next column, Up/Down reorder it within its column. Provides the keyboard-accessible alternative to drag-and-drop. Requires CardId on cards and ColumnId on columns so the board can resolve the move.",
30790
+ "isCascading": false,
30791
+ "captureUnmatched": false
30792
+ },
30163
30793
  {
30164
30794
  "name": "Class",
30165
30795
  "type": "string?",
@@ -30177,9 +30807,47 @@
30177
30807
  "captureUnmatched": true
30178
30808
  }
30179
30809
  ],
30180
- "events": [],
30181
- "enums": [],
30182
- "records": [],
30810
+ "events": [
30811
+ {
30812
+ "name": "OnCardDrop",
30813
+ "type": "EventCallback<DropEventArgs>",
30814
+ "description": "Raised when a card is dropped onto a column (mouse/touch drag) and the board can resolve which card moved, from which column, to which column and at what index. Fires only when cards carry a CardId and columns a ColumnId; otherwise the per-column OnDrop still fires with the raw event for fully-manual boards."
30815
+ },
30816
+ {
30817
+ "name": "OnCardMove",
30818
+ "type": "EventCallback<MoveEventArgs>",
30819
+ "description": "Raised when a card is moved via the keyboard (arrow keys on a focused card): Left/Right move it to the previous/next column, Up/Down reorder it within its column. Provides the keyboard-accessible alternative to drag-and-drop. Requires CardId on cards and ColumnId on columns so the board can resolve the move."
30820
+ }
30821
+ ],
30822
+ "enums": [
30823
+ {
30824
+ "name": "MoveDirection",
30825
+ "values": [
30826
+ "Left",
30827
+ "Right",
30828
+ "Up",
30829
+ "Down"
30830
+ ],
30831
+ "description": "The direction of a keyboard-initiated card move."
30832
+ }
30833
+ ],
30834
+ "records": [
30835
+ {
30836
+ "name": "DropEventArgs",
30837
+ "signature": "DropEventArgs(string CardId, string? FromColumnId, string ToColumnId, int ToIndex)",
30838
+ "description": "Payload describing a drag-drop of a card between/within columns."
30839
+ },
30840
+ {
30841
+ "name": "MoveEventArgs",
30842
+ "signature": "MoveEventArgs(string CardId, string FromColumnId, MoveDirection Direction)",
30843
+ "description": "Payload describing a keyboard-initiated card move."
30844
+ },
30845
+ {
30846
+ "name": "BoardContext",
30847
+ "signature": "BoardContext",
30848
+ "description": "A single stable instance cascaded per board. Tracks the in-flight drag so a column's drop handler can read which card is being dragged and from where — the HTML5 DataTransfer is unreliable (and empty under the touch shim), so the board carries the drag identity itself."
30849
+ }
30850
+ ],
30183
30851
  "gotchas": [],
30184
30852
  "cssVars": [
30185
30853
  "--color-border",
@@ -30214,8 +30882,26 @@
30214
30882
  "fileName": "KanbanCard.razor",
30215
30883
  "namespace": "Lumeo",
30216
30884
  "inheritsFrom": null,
30217
- "implements": [],
30885
+ "implements": [
30886
+ "IAsyncDisposable"
30887
+ ],
30218
30888
  "parameters": [
30889
+ {
30890
+ "name": "Board",
30891
+ "type": "Kanban.BoardContext?",
30892
+ "default": null,
30893
+ "description": null,
30894
+ "isCascading": true,
30895
+ "captureUnmatched": false
30896
+ },
30897
+ {
30898
+ "name": "Column",
30899
+ "type": "KanbanColumn.ColumnContext?",
30900
+ "default": null,
30901
+ "description": null,
30902
+ "isCascading": true,
30903
+ "captureUnmatched": false
30904
+ },
30219
30905
  {
30220
30906
  "name": "Title",
30221
30907
  "type": "string?",
@@ -30272,6 +30958,22 @@
30272
30958
  "isCascading": false,
30273
30959
  "captureUnmatched": false
30274
30960
  },
30961
+ {
30962
+ "name": "CardId",
30963
+ "type": "string?",
30964
+ "default": null,
30965
+ "description": "Stable id for this card, written into the board's drop/move payloads.",
30966
+ "isCascading": false,
30967
+ "captureUnmatched": false
30968
+ },
30969
+ {
30970
+ "name": "Index",
30971
+ "type": "int",
30972
+ "default": null,
30973
+ "description": "This card's position within its column. Lets the board compute a precise insert index when another card is dropped onto this one.",
30974
+ "isCascading": false,
30975
+ "captureUnmatched": false
30976
+ },
30275
30977
  {
30276
30978
  "name": "Class",
30277
30979
  "type": "string?",
@@ -30309,6 +31011,14 @@
30309
31011
  "inheritsFrom": null,
30310
31012
  "implements": [],
30311
31013
  "parameters": [
31014
+ {
31015
+ "name": "Board",
31016
+ "type": "Kanban.BoardContext?",
31017
+ "default": null,
31018
+ "description": null,
31019
+ "isCascading": true,
31020
+ "captureUnmatched": false
31021
+ },
30312
31022
  {
30313
31023
  "name": "Title",
30314
31024
  "type": "string?",
@@ -30361,7 +31071,15 @@
30361
31071
  "name": "OnDrop",
30362
31072
  "type": "EventCallback<DragEventArgs>",
30363
31073
  "default": null,
30364
- "description": null,
31074
+ "description": "Raw drop event. Still fired for fully-manual boards that track drag state themselves. For an enriched payload (which card, from/to column, index) give the column a ColumnId, give cards a CardId, and handle Kanban.OnCardDrop at the board level.",
31075
+ "isCascading": false,
31076
+ "captureUnmatched": false
31077
+ },
31078
+ {
31079
+ "name": "ColumnId",
31080
+ "type": "string?",
31081
+ "default": null,
31082
+ "description": "Stable id for this column, written into the board's drop/move payloads.",
30365
31083
  "isCascading": false,
30366
31084
  "captureUnmatched": false
30367
31085
  },
@@ -30391,11 +31109,17 @@
30391
31109
  {
30392
31110
  "name": "OnDrop",
30393
31111
  "type": "EventCallback<DragEventArgs>",
30394
- "description": null
31112
+ "description": "Raw drop event. Still fired for fully-manual boards that track drag state themselves. For an enriched payload (which card, from/to column, index) give the column a ColumnId, give cards a CardId, and handle Kanban.OnCardDrop at the board level."
30395
31113
  }
30396
31114
  ],
30397
31115
  "enums": [],
30398
- "records": [],
31116
+ "records": [
31117
+ {
31118
+ "name": "ColumnContext",
31119
+ "signature": "ColumnContext",
31120
+ "description": "Cascaded to child cards so a card can advertise the insert index when it is the drag-over target."
31121
+ }
31122
+ ],
30399
31123
  "gotchas": [],
30400
31124
  "parseFailed": false,
30401
31125
  "parseError": null
@@ -30716,6 +31440,22 @@
30716
31440
  "isCascading": false,
30717
31441
  "captureUnmatched": false
30718
31442
  },
31443
+ {
31444
+ "name": "Disabled",
31445
+ "type": "bool",
31446
+ "default": null,
31447
+ "description": "Renders the link as non-interactive: no href, aria-disabled=\"true\", tabindex=\"-1\" (removed from the tab order) and pointer events disabled.",
31448
+ "isCascading": false,
31449
+ "captureUnmatched": false
31450
+ },
31451
+ {
31452
+ "name": "AriaCurrent",
31453
+ "type": "string?",
31454
+ "default": null,
31455
+ "description": "Value for the aria-current attribute when this link represents the current item (e.g. \"page\" for the active nav link). Null omits it.",
31456
+ "isCascading": false,
31457
+ "captureUnmatched": false
31458
+ },
30719
31459
  {
30720
31460
  "name": "Variant",
30721
31461
  "type": "string",
@@ -32047,6 +32787,22 @@
32047
32787
  "isCascading": false,
32048
32788
  "captureUnmatched": false
32049
32789
  },
32790
+ {
32791
+ "name": "Class",
32792
+ "type": "string?",
32793
+ "default": null,
32794
+ "description": null,
32795
+ "isCascading": false,
32796
+ "captureUnmatched": false
32797
+ },
32798
+ {
32799
+ "name": "AdditionalAttributes",
32800
+ "type": "Dictionary<string, object>?",
32801
+ "default": null,
32802
+ "description": null,
32803
+ "isCascading": false,
32804
+ "captureUnmatched": true
32805
+ },
32050
32806
  {
32051
32807
  "name": "MapCtx",
32052
32808
  "type": "Map.MapContext?",
@@ -32249,7 +33005,7 @@
32249
33005
  "records": [
32250
33006
  {
32251
33007
  "name": "MegaMenuContext",
32252
- "signature": "MegaMenuContext(string? ActiveItemId, EventCallback<string?> SetActiveItemId)",
33008
+ "signature": "MegaMenuContext(\n string? ActiveItemId,\n EventCallback<string?> SetActiveItemId,\n Lumeo.Orientation Orientation,\n IReadOnlyList<string> ItemIds,\n IReadOnlySet<string> DisabledItemIds,\n string? RovingItemId,\n Action<string, bool> RegisterItem,\n Action<string> UnregisterItem,\n Action<string> SetRovingItem)",
32253
33009
  "description": null
32254
33010
  }
32255
33011
  ],
@@ -33377,6 +34133,14 @@
33377
34133
  "isCascading": false,
33378
34134
  "captureUnmatched": false
33379
34135
  },
34136
+ {
34137
+ "name": "Label",
34138
+ "type": "string",
34139
+ "default": "\"Main\"",
34140
+ "description": "Accessible name for the &lt;nav&gt; landmark. Defaults to \"Main\".",
34141
+ "isCascading": false,
34142
+ "captureUnmatched": false
34143
+ },
33380
34144
  {
33381
34145
  "name": "Class",
33382
34146
  "type": "string?",
@@ -33399,7 +34163,7 @@
33399
34163
  "records": [
33400
34164
  {
33401
34165
  "name": "NavigationMenuContext",
33402
- "signature": "NavigationMenuContext(string? ActiveItemId, EventCallback<string?> SetActiveItemId)",
34166
+ "signature": "NavigationMenuContext(string? ActiveItemId, EventCallback<string?> SetActiveItemId, NavigationMenu Owner)",
33403
34167
  "description": null
33404
34168
  }
33405
34169
  ],
@@ -33654,7 +34418,7 @@
33654
34418
  "records": [
33655
34419
  {
33656
34420
  "name": "NavigationMenuItemContext",
33657
- "signature": "NavigationMenuItemContext(string ItemId, string TriggerId)",
34421
+ "signature": "NavigationMenuItemContext(string ItemId, string TriggerId, string ContentId)",
33658
34422
  "description": null
33659
34423
  }
33660
34424
  ],
@@ -34265,9 +35029,9 @@
34265
35029
  },
34266
35030
  {
34267
35031
  "name": "ThousandsSeparator",
34268
- "type": "string",
34269
- "default": "\",\"",
34270
- "description": "Thousands group separator (default \",\"). Set to empty string to suppress.",
35032
+ "type": "string?",
35033
+ "default": null,
35034
+ "description": "Thousands group separator. When null (the default) the separator is taken from CurrentCulture so the count-up matches the user's locale (e.g. 1.234 in de-DE). Set to an explicit string to override, or to empty string to suppress grouping.",
34271
35035
  "isCascading": false,
34272
35036
  "captureUnmatched": false
34273
35037
  },
@@ -34671,10 +35435,12 @@
34671
35435
  "enums": [],
34672
35436
  "records": [],
34673
35437
  "gotchas": [
34674
- "Renders an empty shell (nothing visible) until Model is set — the EditContext is deferred to avoid crashing EditForm on a null Model, so a missing Model fails silently rather than throwing."
35438
+ "A missing Model no longer fails silently: the EditContext is still\n deferred (EditForm crashes on a null Model + null EditContext), but instead of\n an invisible empty shell the component now renders a dev-visible diagnostic\n so the misconfiguration is obvious during development."
34675
35439
  ],
34676
35440
  "cssVars": [
34677
- "--color-border"
35441
+ "--color-border",
35442
+ "--color-destructive",
35443
+ "--radius"
34678
35444
  ],
34679
35445
  "examples": [
34680
35446
  {
@@ -35452,7 +36218,9 @@
35452
36218
  ],
35453
36219
  "namespace": "Lumeo",
35454
36220
  "inheritsFrom": null,
35455
- "implements": [],
36221
+ "implements": [
36222
+ "IAsyncDisposable"
36223
+ ],
35456
36224
  "parameters": [
35457
36225
  {
35458
36226
  "name": "Items",
@@ -35510,6 +36278,14 @@
35510
36278
  "isCascading": false,
35511
36279
  "captureUnmatched": false
35512
36280
  },
36281
+ {
36282
+ "name": "Reorderable",
36283
+ "type": "bool",
36284
+ "default": "true",
36285
+ "description": "When true (default), the target list can be reordered: header up/down buttons and Alt+ArrowUp/ArrowDown on a focused target item move the selected items within the target order, emitting SelectedItemsChanged. Reorder is gated while a target search is active (a filtered view has no stable order to shuffle).",
36286
+ "isCascading": false,
36287
+ "captureUnmatched": false
36288
+ },
35513
36289
  {
35514
36290
  "name": "Height",
35515
36291
  "type": "string",
@@ -35999,7 +36775,7 @@
35999
36775
  "records": [
36000
36776
  {
36001
36777
  "name": "PopoverContext",
36002
- "signature": "PopoverContext(bool IsOpen, EventCallback<bool> SetOpen, string WrapperId)",
36778
+ "signature": "PopoverContext(bool IsOpen, EventCallback<bool> SetOpen, string WrapperId, string ContentId)",
36003
36779
  "description": null
36004
36780
  }
36005
36781
  ],
@@ -36583,6 +37359,14 @@
36583
37359
  "isCascading": false,
36584
37360
  "captureUnmatched": false
36585
37361
  },
37362
+ {
37363
+ "name": "OnStop",
37364
+ "type": "EventCallback",
37365
+ "default": null,
37366
+ "description": "Invoked when the user clicks the Stop button. The Stop button only replaces Send while IsLoading is true AND this callback is bound — so a consumer that doesn't support cancellation keeps the previous disabled-spinner behaviour unchanged.",
37367
+ "isCascading": false,
37368
+ "captureUnmatched": false
37369
+ },
36586
37370
  {
36587
37371
  "name": "DisableSendOnEmpty",
36588
37372
  "type": "bool",
@@ -36591,6 +37375,46 @@
36591
37375
  "isCascading": false,
36592
37376
  "captureUnmatched": false
36593
37377
  },
37378
+ {
37379
+ "name": "Attachments",
37380
+ "type": "RenderFragment?",
37381
+ "default": null,
37382
+ "description": "Optional slot for attachment chips/thumbnails, rendered above the textarea.",
37383
+ "isCascading": false,
37384
+ "captureUnmatched": false
37385
+ },
37386
+ {
37387
+ "name": "ShowAttachButton",
37388
+ "type": "bool",
37389
+ "default": null,
37390
+ "description": "Shows a built-in paperclip attach button in the leading area that invokes OnAttach.",
37391
+ "isCascading": false,
37392
+ "captureUnmatched": false
37393
+ },
37394
+ {
37395
+ "name": "OnAttach",
37396
+ "type": "EventCallback",
37397
+ "default": null,
37398
+ "description": "Invoked when the built-in attach button is clicked (only when ShowAttachButton is true).",
37399
+ "isCascading": false,
37400
+ "captureUnmatched": false
37401
+ },
37402
+ {
37403
+ "name": "MaxLength",
37404
+ "type": "int?",
37405
+ "default": null,
37406
+ "description": "Hard character limit. When set, the textarea enforces maxlength and a \"count/limit\" counter is shown. The counter turns into a destructive color as the limit is approached.",
37407
+ "isCascading": false,
37408
+ "captureUnmatched": false
37409
+ },
37410
+ {
37411
+ "name": "ShowCounter",
37412
+ "type": "bool",
37413
+ "default": null,
37414
+ "description": "Forces the character counter to render even when MaxLength is not set (shows the raw count).",
37415
+ "isCascading": false,
37416
+ "captureUnmatched": false
37417
+ },
36594
37418
  {
36595
37419
  "name": "LeadingContent",
36596
37420
  "type": "RenderFragment?",
@@ -36634,6 +37458,16 @@
36634
37458
  "name": "OnSend",
36635
37459
  "type": "EventCallback<string>",
36636
37460
  "description": null
37461
+ },
37462
+ {
37463
+ "name": "OnStop",
37464
+ "type": "EventCallback",
37465
+ "description": "Invoked when the user clicks the Stop button. The Stop button only replaces Send while IsLoading is true AND this callback is bound — so a consumer that doesn't support cancellation keeps the previous disabled-spinner behaviour unchanged."
37466
+ },
37467
+ {
37468
+ "name": "OnAttach",
37469
+ "type": "EventCallback",
37470
+ "description": "Invoked when the built-in attach button is clicked (only when ShowAttachButton is true)."
36637
37471
  }
36638
37472
  ],
36639
37473
  "enums": [],
@@ -36642,12 +37476,15 @@
36642
37476
  "cssVars": [
36643
37477
  "--color-border",
36644
37478
  "--color-card",
37479
+ "--color-destructive",
36645
37480
  "--color-foreground",
36646
37481
  "--color-muted",
36647
37482
  "--color-muted-foreground",
36648
37483
  "--color-primary",
36649
37484
  "--color-primary-foreground",
36650
37485
  "--color-ring",
37486
+ "--color-secondary",
37487
+ "--color-secondary-foreground",
36651
37488
  "--radius"
36652
37489
  ],
36653
37490
  "examples": [
@@ -36768,8 +37605,7 @@
36768
37605
  "description": "Renders a QR code SVG for a string payload.",
36769
37606
  "nugetPackage": "Lumeo",
36770
37607
  "files": [
36771
- "UI/QRCode/QRCode.razor",
36772
- "UI/QRCode/QRCodeEncoder.cs"
37608
+ "UI/QRCode/QRCode.razor"
36773
37609
  ],
36774
37610
  "namespace": "Lumeo",
36775
37611
  "inheritsFrom": null,
@@ -37425,7 +38261,9 @@
37425
38261
  ],
37426
38262
  "namespace": "Lumeo",
37427
38263
  "inheritsFrom": null,
37428
- "implements": [],
38264
+ "implements": [
38265
+ "IAsyncDisposable"
38266
+ ],
37429
38267
  "parameters": [
37430
38268
  {
37431
38269
  "name": "FormField",
@@ -37734,6 +38572,7 @@
37734
38572
  "nugetPackage": "Lumeo",
37735
38573
  "files": [
37736
38574
  "UI/Resizable/ResizableHandle.razor",
38575
+ "UI/Resizable/ResizableLayout.cs",
37737
38576
  "UI/Resizable/ResizablePanel.razor",
37738
38577
  "UI/Resizable/ResizablePanelGroup.razor"
37739
38578
  ],
@@ -37856,6 +38695,22 @@
37856
38695
  "isCascading": false,
37857
38696
  "captureUnmatched": false
37858
38697
  },
38698
+ {
38699
+ "name": "Collapsible",
38700
+ "type": "bool",
38701
+ "default": null,
38702
+ "description": "When true, the panel can collapse to CollapsedSize — by dragging its handle below (roughly) half the MinSize, or via the group's ToggleCollapse from the cascading context. Restores on drag-out / toggle. (#257)",
38703
+ "isCascading": false,
38704
+ "captureUnmatched": false
38705
+ },
38706
+ {
38707
+ "name": "CollapsedSize",
38708
+ "type": "double",
38709
+ "default": null,
38710
+ "description": "Percentage the panel occupies while collapsed. Default 0. Only meaningful when Collapsible is true.",
38711
+ "isCascading": false,
38712
+ "captureUnmatched": false
38713
+ },
37859
38714
  {
37860
38715
  "name": "ChildContent",
37861
38716
  "type": "RenderFragment?",
@@ -37921,6 +38776,22 @@
37921
38776
  "isCascading": false,
37922
38777
  "captureUnmatched": false
37923
38778
  },
38779
+ {
38780
+ "name": "SavedLayout",
38781
+ "type": "ResizableLayout?",
38782
+ "default": null,
38783
+ "description": "Optional previously-persisted panel sizes. The group seeds its layout from this on first render (taking precedence over panel DefaultSizes and DefaultSizes). Mirrors DataGrid / Tabs SavedLayout: the library never persists on its own — store the snapshot you receive from OnLayout and feed it back here on init.",
38784
+ "isCascading": false,
38785
+ "captureUnmatched": false
38786
+ },
38787
+ {
38788
+ "name": "OnLayout",
38789
+ "type": "EventCallback<ResizableLayout>",
38790
+ "default": null,
38791
+ "description": "Fires after every resize (drag, keyboard step, or collapse toggle) with the current panel sizes so the consumer can persist them. Pairs with SavedLayout to round-trip the layout through storage.",
38792
+ "isCascading": false,
38793
+ "captureUnmatched": false
38794
+ },
37924
38795
  {
37925
38796
  "name": "Class",
37926
38797
  "type": "string?",
@@ -37938,12 +38809,18 @@
37938
38809
  "captureUnmatched": true
37939
38810
  }
37940
38811
  ],
37941
- "events": [],
38812
+ "events": [
38813
+ {
38814
+ "name": "OnLayout",
38815
+ "type": "EventCallback<ResizableLayout>",
38816
+ "description": "Fires after every resize (drag, keyboard step, or collapse toggle) with the current panel sizes so the consumer can persist them. Pairs with SavedLayout to round-trip the layout through storage."
38817
+ }
38818
+ ],
37942
38819
  "enums": [],
37943
38820
  "records": [
37944
38821
  {
37945
38822
  "name": "ResizablePanelGroupContext",
37946
- "signature": "ResizablePanelGroupContext(\n string GroupId,\n Lumeo.Orientation Direction,\n EventCallback<(int PanelIndex, double Delta)> OnHandleDrag,\n Func<int, double> GetPanelSize,\n int PanelCount,\n Action<int, double, double, double> RegisterPanel,\n Func<int, (double MinSize, double MaxSize)> GetPanelConstraints\n )",
38823
+ "signature": "ResizablePanelGroupContext(\n string GroupId,\n Lumeo.Orientation Direction,\n EventCallback<(int PanelIndex, double Delta)> OnHandleDrag,\n Func<int, double> GetPanelSize,\n int PanelCount,\n Action<int, double, double, double, bool, double> RegisterPanel,\n Func<int, (double MinSize, double MaxSize)> GetPanelConstraints,\n Func<int, bool> IsPanelCollapsed,\n EventCallback<int> ToggleCollapse\n )",
37947
38824
  "description": null
37948
38825
  }
37949
38826
  ],
@@ -39219,6 +40096,14 @@
39219
40096
  "isCascading": false,
39220
40097
  "captureUnmatched": false
39221
40098
  },
40099
+ {
40100
+ "name": "Type",
40101
+ "type": "ScrollAreaType",
40102
+ "default": "ScrollAreaType.Auto",
40103
+ "description": "When the scrollbars become visible. Mirrors Radix UI's ScrollArea type: Auto (default) — bars show only when the content overflows. Always — bars are always visible and the gutter is reserved (no layout shift when content grows). Scroll — bars show while scrolling. Hover — bars show on hover / focus within. Implemented cross-browser via the lumeo-scrollarea CSS (Firefox scrollbar-* + WebKit pseudo-elements). Firefox exposes only a thin bar, so the Hover/Scroll auto-hide granularity is a WebKit/overlay enhancement that degrades gracefully to a persistent thin bar there.",
40104
+ "isCascading": false,
40105
+ "captureUnmatched": false
40106
+ },
39222
40107
  {
39223
40108
  "name": "FocusRingGutter",
39224
40109
  "type": "bool",
@@ -39245,14 +40130,22 @@
39245
40130
  }
39246
40131
  ],
39247
40132
  "events": [],
39248
- "enums": [],
40133
+ "enums": [
40134
+ {
40135
+ "name": "ScrollAreaType",
40136
+ "values": [
40137
+ "Auto",
40138
+ "Always",
40139
+ "Scroll",
40140
+ "Hover"
40141
+ ],
40142
+ "description": "Scrollbar visibility strategy. See Type."
40143
+ }
40144
+ ],
39249
40145
  "records": [],
39250
40146
  "gotchas": [],
39251
40147
  "cssVars": [
39252
- "--color-border",
39253
- "--color-muted",
39254
- "--color-muted-foreground",
39255
- "--radius"
40148
+ "--color-foreground"
39256
40149
  ],
39257
40150
  "examples": [
39258
40151
  {
@@ -39498,7 +40391,9 @@
39498
40391
  ],
39499
40392
  "namespace": "Lumeo",
39500
40393
  "inheritsFrom": null,
39501
- "implements": [],
40394
+ "implements": [
40395
+ "IAsyncDisposable"
40396
+ ],
39502
40397
  "parameters": [
39503
40398
  {
39504
40399
  "name": "Value",
@@ -39584,8 +40479,8 @@
39584
40479
  "records": [
39585
40480
  {
39586
40481
  "name": "SegmentedContext",
39587
- "signature": "SegmentedContext(\n string? Value,\n EventCallback<string> Select,\n Func<bool, string> GetItemClasses)",
39588
- "description": "Cascading context for compound-mode SegmentedItem children — they read the active value + the parent's item-class function (so style stays consistent with Options-mode) and invoke Select on click."
40482
+ "signature": "SegmentedContext(\n string? Value,\n EventCallback<string> Select,\n Func<bool, string> GetItemClasses,\n Func<string, bool, string> GetTabIndex,\n List<string> ItemValues,\n Dictionary<string, string> ItemIds,\n Dictionary<string, bool> ItemDisabled)",
40483
+ "description": "Cascading context for compound-mode SegmentedItem children — they read the active value + the parent's item-class function (so style stays consistent with Options-mode), register themselves into the shared item registry (for roving tabindex + arrow navigation) and invoke Select on click."
39589
40484
  }
39590
40485
  ],
39591
40486
  "gotchas": [],
@@ -39617,7 +40512,9 @@
39617
40512
  "fileName": "SegmentedItem.razor",
39618
40513
  "namespace": "Lumeo",
39619
40514
  "inheritsFrom": null,
39620
- "implements": [],
40515
+ "implements": [
40516
+ "IDisposable"
40517
+ ],
39621
40518
  "parameters": [
39622
40519
  {
39623
40520
  "name": "Context",
@@ -40438,6 +41335,14 @@
40438
41335
  "isCascading": false,
40439
41336
  "captureUnmatched": false
40440
41337
  },
41338
+ {
41339
+ "name": "Decorative",
41340
+ "type": "bool",
41341
+ "default": "true",
41342
+ "description": "When true (the default), the separator is purely visual and exposes role=\"none\" with no orientation — assistive tech skips it, matching Radix's decorative default. Set to false for a semantic separator that conveys structure (e.g. between menu groups or list sections): the element then carries role=\"separator\" plus an aria-orientation matching Orientation. The implicit ARIA orientation of a separator is horizontal, so a vertical one must declare it explicitly.",
41343
+ "isCascading": false,
41344
+ "captureUnmatched": false
41345
+ },
40441
41346
  {
40442
41347
  "name": "ChildContent",
40443
41348
  "type": "RenderFragment?",
@@ -41651,7 +42556,9 @@
41651
42556
  "fileName": "SidebarProvider.razor",
41652
42557
  "namespace": "Lumeo",
41653
42558
  "inheritsFrom": null,
41654
- "implements": [],
42559
+ "implements": [
42560
+ "IAsyncDisposable"
42561
+ ],
41655
42562
  "parameters": [
41656
42563
  {
41657
42564
  "name": "ChildContent",
@@ -41685,6 +42592,22 @@
41685
42592
  "isCascading": false,
41686
42593
  "captureUnmatched": false
41687
42594
  },
42595
+ {
42596
+ "name": "MobileSheet",
42597
+ "type": "bool",
42598
+ "default": null,
42599
+ "description": "When true, the sidebar renders as an off-canvas sheet (slide-in over a dismissible scrim) on mobile viewports (&lt; md), regardless of Variant. On larger viewports it keeps its configured variant. Collapsed acts as the sheet's closed state; toggling opens it. Opt-in (default false) so existing layouts are unchanged. (#241)",
42600
+ "isCascading": false,
42601
+ "captureUnmatched": false
42602
+ },
42603
+ {
42604
+ "name": "ToggleShortcut",
42605
+ "type": "string?",
42606
+ "default": null,
42607
+ "description": "Optional keyboard shortcut that toggles the sidebar, in the IKeyboardShortcutService combo format (e.g. \"ctrl+b\", \"meta+b\"). Registered on first render and released on dispose. Null disables the shortcut. (#241)",
42608
+ "isCascading": false,
42609
+ "captureUnmatched": false
42610
+ },
41688
42611
  {
41689
42612
  "name": "PersistCollapsed",
41690
42613
  "type": "bool",
@@ -41913,7 +42836,7 @@
41913
42836
  "name": "Format",
41914
42837
  "type": "string",
41915
42838
  "default": "\"png\"",
41916
- "description": "Export format for the emitted data URL. \"png\" is the safe default (universal browser support, transparent backgrounds work). \"svg\" would require capturing strokes as path data rather than raster pixels; not implemented in this initial 3.1.0 cut falls back to PNG. TODO: real SVG export by recording pointer paths client-side.",
42839
+ "description": "Export format for the emitted data URL. \"png\" is the default (universal browser support, transparent backgrounds). \"svg\" produces a real vector export: the JS pad records each pointer path and replays it as &lt;path&gt; elements, so the signature scales crisply at any size. (A signature loaded from an existing raster data URL has no vector data to export and falls back to PNG.)",
41917
42840
  "isCascading": false,
41918
42841
  "captureUnmatched": false
41919
42842
  },
@@ -42039,6 +42962,14 @@
42039
42962
  "isCascading": false,
42040
42963
  "captureUnmatched": false
42041
42964
  },
42965
+ {
42966
+ "name": "AriaLabel",
42967
+ "type": "string?",
42968
+ "default": null,
42969
+ "description": "Screen-reader name for the loading placeholder. Defaults to \"Loading\"; set a localized string (or pass aria-label directly) so it announces in the app's language.",
42970
+ "isCascading": false,
42971
+ "captureUnmatched": false
42972
+ },
42042
42973
  {
42043
42974
  "name": "Class",
42044
42975
  "type": "string?",
@@ -42332,6 +43263,14 @@
42332
43263
  "isCascading": false,
42333
43264
  "captureUnmatched": false
42334
43265
  },
43266
+ {
43267
+ "name": "MinStepsBetweenThumbs",
43268
+ "type": "int",
43269
+ "default": null,
43270
+ "description": "Minimum permitted distance between the two range thumbs, expressed in Step units (so the absolute gap is MinStepsBetweenThumbs * Step). Mirrors Radix's minStepsBetweenThumbs. The default of 0 lets the thumbs meet but — unlike before — they can no longer cross past each other. Only meaningful when IsRange is true.",
43271
+ "isCascading": false,
43272
+ "captureUnmatched": false
43273
+ },
42335
43274
  {
42336
43275
  "name": "Min",
42337
43276
  "type": "double",
@@ -42542,7 +43481,15 @@
42542
43481
  "name": "Group",
42543
43482
  "type": "string?",
42544
43483
  "default": null,
42545
- "description": null,
43484
+ "description": "Optional shared-group name. When set, it is emitted on the container as a data-sortable-group attribute so groups are observable in the DOM. NOTE: cross-list transfer between lists that share a group is NOT yet implemented — the attribute is reserved for that future capability and current behaviour is intra-list reordering only.",
43485
+ "isCascading": false,
43486
+ "captureUnmatched": false
43487
+ },
43488
+ {
43489
+ "name": "OnReorder",
43490
+ "type": "EventCallback<SortableMoved>",
43491
+ "default": null,
43492
+ "description": "Raised in addition to ItemsChanged whenever an item is reordered (via drag, touch, or keyboard), carrying the moved item along with its old and new indices. Does not change the ItemsChanged contract.",
42546
43493
  "isCascading": false,
42547
43494
  "captureUnmatched": false
42548
43495
  },
@@ -42576,10 +43523,21 @@
42576
43523
  "name": "ItemsChanged",
42577
43524
  "type": "EventCallback<List<TItem>>",
42578
43525
  "description": null
43526
+ },
43527
+ {
43528
+ "name": "OnReorder",
43529
+ "type": "EventCallback<SortableMoved>",
43530
+ "description": "Raised in addition to ItemsChanged whenever an item is reordered (via drag, touch, or keyboard), carrying the moved item along with its old and new indices. Does not change the ItemsChanged contract."
42579
43531
  }
42580
43532
  ],
42581
43533
  "enums": [],
42582
- "records": [],
43534
+ "records": [
43535
+ {
43536
+ "name": "SortableMoved",
43537
+ "signature": "SortableMoved(TItem Item, int OldIndex, int NewIndex)",
43538
+ "description": "Payload describing a single reorder: the moved and its / within the list. Supplied to OnReorder."
43539
+ }
43540
+ ],
42583
43541
  "gotchas": [],
42584
43542
  "cssVars": [
42585
43543
  "--color-border",
@@ -43201,6 +44159,14 @@
43201
44159
  "isCascading": false,
43202
44160
  "captureUnmatched": false
43203
44161
  },
44162
+ {
44163
+ "name": "AriaLabel",
44164
+ "type": "string?",
44165
+ "default": null,
44166
+ "description": "Screen-reader name when there is no visible Label. Defaults to \"Loading\"; set it to a localized string (or pass aria-label directly) so the spinner announces in the app's language.",
44167
+ "isCascading": false,
44168
+ "captureUnmatched": false
44169
+ },
43204
44170
  {
43205
44171
  "name": "Color",
43206
44172
  "type": "string?",
@@ -43556,7 +44522,15 @@
43556
44522
  "name": "Collapsible",
43557
44523
  "type": "bool",
43558
44524
  "default": null,
43559
- "description": null,
44525
+ "description": "When true, the pane can collapse to CollapsedSize by dragging its divider below (roughly) half the pane's MinSize, and restores when dragged back out. Previously this flag was inert (#258).",
44526
+ "isCascading": false,
44527
+ "captureUnmatched": false
44528
+ },
44529
+ {
44530
+ "name": "CollapsedSize",
44531
+ "type": "double",
44532
+ "default": null,
44533
+ "description": "Percentage size the pane shrinks to when collapsed. Default 0 (fully hidden). Only meaningful when Collapsible is true.",
43560
44534
  "isCascading": false,
43561
44535
  "captureUnmatched": false
43562
44536
  },
@@ -44291,7 +45265,9 @@
44291
45265
  "fileName": "StepsItem.razor",
44292
45266
  "namespace": "Lumeo",
44293
45267
  "inheritsFrom": null,
44294
- "implements": [],
45268
+ "implements": [
45269
+ "IDisposable"
45270
+ ],
44295
45271
  "parameters": [
44296
45272
  {
44297
45273
  "name": "Context",
@@ -44412,7 +45388,23 @@
44412
45388
  "name": "Prose",
44413
45389
  "type": "bool",
44414
45390
  "default": null,
44415
- "description": null,
45391
+ "description": "Applies Tailwind Typography (prose) styling to the rendered output. Meaningful on its own only when Markdown (or a consumer's own markup via MarkdownRenderer) produces real block/inline elements for the prose styles to target.",
45392
+ "isCascading": false,
45393
+ "captureUnmatched": false
45394
+ },
45395
+ {
45396
+ "name": "Markdown",
45397
+ "type": "bool",
45398
+ "default": null,
45399
+ "description": "Renders Text as markdown instead of plain text. Uses MarkdownRenderer when supplied, otherwise a built-in dependency-free CommonMark subset (headings, lists, bold/italic, inline + fenced code, links, blockquotes). Incremental fade-in is disabled in this mode because markdown re-parses the whole string each update.",
45400
+ "isCascading": false,
45401
+ "captureUnmatched": false
45402
+ },
45403
+ {
45404
+ "name": "MarkdownRenderer",
45405
+ "type": "Func<string, MarkupString>?",
45406
+ "default": null,
45407
+ "description": "Optional render hook: converts the raw markdown Text into a MarkupString. Supply this to plug in a full renderer (Markdig, etc.). The delegate is responsible for producing SAFE HTML — sanitise untrusted input before returning. Ignored unless Markdown is true.",
44416
45408
  "isCascading": false,
44417
45409
  "captureUnmatched": false
44418
45410
  },
@@ -44505,6 +45497,14 @@
44505
45497
  "isCascading": false,
44506
45498
  "captureUnmatched": false
44507
45499
  },
45500
+ {
45501
+ "name": "AriaLabel",
45502
+ "type": "string",
45503
+ "default": "\"Swipeable item — use arrow keys to reveal actions\"",
45504
+ "description": "Accessible label for the swipeable row, announced to AT users who can't see the gesture affordance.",
45505
+ "isCascading": false,
45506
+ "captureUnmatched": false
45507
+ },
44508
45508
  {
44509
45509
  "name": "Class",
44510
45510
  "type": "string?",
@@ -44527,7 +45527,8 @@
44527
45527
  "records": [],
44528
45528
  "gotchas": [],
44529
45529
  "cssVars": [
44530
- "--color-background"
45530
+ "--color-background",
45531
+ "--color-ring"
44531
45532
  ],
44532
45533
  "examples": [
44533
45534
  {
@@ -44766,9 +45767,12 @@
44766
45767
  "UI/Table/TableBody.razor",
44767
45768
  "UI/Table/TableCaption.razor",
44768
45769
  "UI/Table/TableCell.razor",
45770
+ "UI/Table/TableEmpty.razor",
45771
+ "UI/Table/TableFooter.razor",
44769
45772
  "UI/Table/TableHead.razor",
44770
45773
  "UI/Table/TableHeader.razor",
44771
- "UI/Table/TableRow.razor"
45774
+ "UI/Table/TableRow.razor",
45775
+ "UI/Table/TableSkeleton.razor"
44772
45776
  ],
44773
45777
  "namespace": "Lumeo",
44774
45778
  "inheritsFrom": null,
@@ -44782,6 +45786,14 @@
44782
45786
  "isCascading": false,
44783
45787
  "captureUnmatched": false
44784
45788
  },
45789
+ {
45790
+ "name": "Striped",
45791
+ "type": "bool",
45792
+ "default": null,
45793
+ "description": "When true, body rows alternate background (zebra striping) via a tbody tr:nth-child(even) rule so dense data tables are easier to scan. Applied with CSS variables only — no hardcoded colors.",
45794
+ "isCascading": false,
45795
+ "captureUnmatched": false
45796
+ },
44785
45797
  {
44786
45798
  "name": "Class",
44787
45799
  "type": "string?",
@@ -44866,13 +45878,60 @@
44866
45878
  "parseFailed": false,
44867
45879
  "parseError": null
44868
45880
  },
44869
- "TableCaption": {
44870
- "componentName": "TableCaption",
44871
- "fileName": "TableCaption.razor",
45881
+ "TableCaption": {
45882
+ "componentName": "TableCaption",
45883
+ "fileName": "TableCaption.razor",
45884
+ "namespace": "Lumeo",
45885
+ "inheritsFrom": null,
45886
+ "implements": [],
45887
+ "parameters": [
45888
+ {
45889
+ "name": "ChildContent",
45890
+ "type": "RenderFragment?",
45891
+ "default": null,
45892
+ "description": null,
45893
+ "isCascading": false,
45894
+ "captureUnmatched": false
45895
+ },
45896
+ {
45897
+ "name": "Class",
45898
+ "type": "string?",
45899
+ "default": null,
45900
+ "description": null,
45901
+ "isCascading": false,
45902
+ "captureUnmatched": false
45903
+ },
45904
+ {
45905
+ "name": "AdditionalAttributes",
45906
+ "type": "Dictionary<string, object>?",
45907
+ "default": null,
45908
+ "description": null,
45909
+ "isCascading": false,
45910
+ "captureUnmatched": true
45911
+ }
45912
+ ],
45913
+ "events": [],
45914
+ "enums": [],
45915
+ "records": [],
45916
+ "gotchas": [],
45917
+ "parseFailed": false,
45918
+ "parseError": null
45919
+ },
45920
+ "TableCell": {
45921
+ "componentName": "TableCell",
45922
+ "fileName": "TableCell.razor",
44872
45923
  "namespace": "Lumeo",
44873
45924
  "inheritsFrom": null,
44874
45925
  "implements": [],
44875
45926
  "parameters": [
45927
+ {
45928
+ "name": "Density",
45929
+ "type": "Lumeo.Density?",
45930
+ "default": null,
45931
+ "description": null,
45932
+ "isCascading": true,
45933
+ "captureUnmatched": false
45934
+ },
44876
45935
  {
44877
45936
  "name": "ChildContent",
44878
45937
  "type": "RenderFragment?",
@@ -44905,21 +45964,68 @@
44905
45964
  "parseFailed": false,
44906
45965
  "parseError": null
44907
45966
  },
44908
- "TableCell": {
44909
- "componentName": "TableCell",
44910
- "fileName": "TableCell.razor",
45967
+ "TableEmpty": {
45968
+ "componentName": "TableEmpty",
45969
+ "fileName": "TableEmpty.razor",
44911
45970
  "namespace": "Lumeo",
44912
45971
  "inheritsFrom": null,
44913
45972
  "implements": [],
44914
45973
  "parameters": [
44915
45974
  {
44916
- "name": "Density",
44917
- "type": "Lumeo.Density?",
45975
+ "name": "ColumnCount",
45976
+ "type": "int",
45977
+ "default": "1",
45978
+ "description": "Number of columns to span. Defaults to 1; set it to your column count so the empty message centers across the full table width.",
45979
+ "isCascading": false,
45980
+ "captureUnmatched": false
45981
+ },
45982
+ {
45983
+ "name": "Text",
45984
+ "type": "string?",
45985
+ "default": null,
45986
+ "description": "Optional plain-text message. Ignored when ChildContent is supplied. Falls back to the localized \"No results\" string.",
45987
+ "isCascading": false,
45988
+ "captureUnmatched": false
45989
+ },
45990
+ {
45991
+ "name": "ChildContent",
45992
+ "type": "RenderFragment?",
44918
45993
  "default": null,
44919
45994
  "description": null,
44920
- "isCascading": true,
45995
+ "isCascading": false,
45996
+ "captureUnmatched": false
45997
+ },
45998
+ {
45999
+ "name": "Class",
46000
+ "type": "string?",
46001
+ "default": null,
46002
+ "description": null,
46003
+ "isCascading": false,
44921
46004
  "captureUnmatched": false
44922
46005
  },
46006
+ {
46007
+ "name": "AdditionalAttributes",
46008
+ "type": "Dictionary<string, object>?",
46009
+ "default": null,
46010
+ "description": null,
46011
+ "isCascading": false,
46012
+ "captureUnmatched": true
46013
+ }
46014
+ ],
46015
+ "events": [],
46016
+ "enums": [],
46017
+ "records": [],
46018
+ "gotchas": [],
46019
+ "parseFailed": false,
46020
+ "parseError": null
46021
+ },
46022
+ "TableFooter": {
46023
+ "componentName": "TableFooter",
46024
+ "fileName": "TableFooter.razor",
46025
+ "namespace": "Lumeo",
46026
+ "inheritsFrom": null,
46027
+ "implements": [],
46028
+ "parameters": [
44923
46029
  {
44924
46030
  "name": "ChildContent",
44925
46031
  "type": "RenderFragment?",
@@ -45076,6 +46182,61 @@
45076
46182
  "gotchas": [],
45077
46183
  "parseFailed": false,
45078
46184
  "parseError": null
46185
+ },
46186
+ "TableSkeleton": {
46187
+ "componentName": "TableSkeleton",
46188
+ "fileName": "TableSkeleton.razor",
46189
+ "namespace": "Lumeo",
46190
+ "inheritsFrom": null,
46191
+ "implements": [],
46192
+ "parameters": [
46193
+ {
46194
+ "name": "Rows",
46195
+ "type": "int",
46196
+ "default": "3",
46197
+ "description": "Number of placeholder rows. Defaults to 3.",
46198
+ "isCascading": false,
46199
+ "captureUnmatched": false
46200
+ },
46201
+ {
46202
+ "name": "Columns",
46203
+ "type": "int",
46204
+ "default": "4",
46205
+ "description": "Number of placeholder cells per row — match your column count. Defaults to 4.",
46206
+ "isCascading": false,
46207
+ "captureUnmatched": false
46208
+ },
46209
+ {
46210
+ "name": "Animation",
46211
+ "type": "Skeleton.SkeletonAnimation",
46212
+ "default": "Skeleton.SkeletonAnimation.Pulse",
46213
+ "description": "Skeleton animation style. Defaults to Pulse.",
46214
+ "isCascading": false,
46215
+ "captureUnmatched": false
46216
+ },
46217
+ {
46218
+ "name": "Class",
46219
+ "type": "string?",
46220
+ "default": null,
46221
+ "description": null,
46222
+ "isCascading": false,
46223
+ "captureUnmatched": false
46224
+ },
46225
+ {
46226
+ "name": "AdditionalAttributes",
46227
+ "type": "Dictionary<string, object>?",
46228
+ "default": null,
46229
+ "description": null,
46230
+ "isCascading": false,
46231
+ "captureUnmatched": true
46232
+ }
46233
+ ],
46234
+ "events": [],
46235
+ "enums": [],
46236
+ "records": [],
46237
+ "gotchas": [],
46238
+ "parseFailed": false,
46239
+ "parseError": null
45079
46240
  }
45080
46241
  },
45081
46242
  "parseFailed": false,
@@ -45171,6 +46332,14 @@
45171
46332
  "isCascading": false,
45172
46333
  "captureUnmatched": false
45173
46334
  },
46335
+ {
46336
+ "name": "Activation",
46337
+ "type": "TabsActivation",
46338
+ "default": "TabsActivation.Automatic",
46339
+ "description": "How arrow-key navigation activates a tab (WAI-ARIA tabs pattern): Automatic (default) — arrow keys move focus AND activate the focused tab immediately (its panel shows). Best when switching tabs is cheap. Manual — arrow keys only move focus; the user presses Enter or Space (or clicks) to activate. Preferred when activating a tab is expensive (loads data, runs queries).",
46340
+ "isCascading": false,
46341
+ "captureUnmatched": false
46342
+ },
45174
46343
  {
45175
46344
  "name": "Class",
45176
46345
  "type": "string?",
@@ -45196,6 +46365,14 @@
45196
46365
  }
45197
46366
  ],
45198
46367
  "enums": [
46368
+ {
46369
+ "name": "TabsActivation",
46370
+ "values": [
46371
+ "Automatic",
46372
+ "Manual"
46373
+ ],
46374
+ "description": "Arrow-key activation mode for tabs. See Activation."
46375
+ },
45199
46376
  {
45200
46377
  "name": "TabsVariant",
45201
46378
  "values": [
@@ -45218,7 +46395,7 @@
45218
46395
  "records": [
45219
46396
  {
45220
46397
  "name": "TabsContext",
45221
- "signature": "TabsContext(\n string ActiveValue,\n EventCallback<string> SetValue,\n Lumeo.Orientation Orientation,\n TabsVariant Variant,\n Dictionary<string, (string TabId, string PanelId, bool Disabled)> TabIds,\n bool AnimatedIndicator,\n TabsRenderMode RenderMode,\n HashSet<string> ActivatedValues,\n bool SwipeEnabled,\n bool SwipeWrap,\n Action<string> RegisterContent,\n Action<string> UnregisterContent,\n Func<string, Task> SwipeNavigate,\n TabsReorderState Reorder)",
46398
+ "signature": "TabsContext(\n string ActiveValue,\n EventCallback<string> SetValue,\n Lumeo.Orientation Orientation,\n TabsVariant Variant,\n Dictionary<string, (string TabId, string PanelId, bool Disabled)> TabIds,\n bool AnimatedIndicator,\n TabsRenderMode RenderMode,\n HashSet<string> ActivatedValues,\n bool SwipeEnabled,\n bool SwipeWrap,\n Action<string> RegisterContent,\n Action<string> UnregisterContent,\n Func<string, Task> SwipeNavigate,\n TabsReorderState Reorder,\n TabsActivation Activation = TabsActivation.Automatic)",
45222
46399
  "description": null
45223
46400
  }
45224
46401
  ],
@@ -45360,6 +46537,14 @@
45360
46537
  "isCascading": false,
45361
46538
  "captureUnmatched": false
45362
46539
  },
46540
+ {
46541
+ "name": "Arrows",
46542
+ "type": "bool",
46543
+ "default": "true",
46544
+ "description": "When true (and Scrollable), shows chevron buttons at the start/end of the list that scroll it when the tabs overflow. The arrows auto-hide at the scroll boundaries (and entirely when nothing overflows). Default true — a scrollable list with no way to reach off-screen tabs by mouse is a usability gap (#239). Set false to keep the bare scroll/swipe affordance.",
46545
+ "isCascading": false,
46546
+ "captureUnmatched": false
46547
+ },
45363
46548
  {
45364
46549
  "name": "Reorderable",
45365
46550
  "type": "bool",
@@ -45875,6 +47060,14 @@
45875
47060
  "isCascading": false,
45876
47061
  "captureUnmatched": false
45877
47062
  },
47063
+ {
47064
+ "name": "LineClamp",
47065
+ "type": "int?",
47066
+ "default": null,
47067
+ "description": "Clamp the text to a fixed number of lines via Tailwind's line-clamp-N. Supported range is 1–3 (the utilities shipped in the prebuilt Lumeo CSS bundle); values outside that range are ignored. Multi-line counterpart to Truncate, which clips to a single line. When both are set, Truncate wins (single-line ellipsis).",
47068
+ "isCascading": false,
47069
+ "captureUnmatched": false
47070
+ },
45878
47071
  {
45879
47072
  "name": "Align",
45880
47073
  "type": "string?",
@@ -46347,6 +47540,14 @@
46347
47540
  "IDisposable"
46348
47541
  ],
46349
47542
  "parameters": [
47543
+ {
47544
+ "name": "Class",
47545
+ "type": "string?",
47546
+ "default": null,
47547
+ "description": null,
47548
+ "isCascading": false,
47549
+ "captureUnmatched": false
47550
+ },
46350
47551
  {
46351
47552
  "name": "AdditionalAttributes",
46352
47553
  "type": "Dictionary<string, object>?",
@@ -46424,6 +47625,14 @@
46424
47625
  "isCascading": false,
46425
47626
  "captureUnmatched": false
46426
47627
  },
47628
+ {
47629
+ "name": "Layout",
47630
+ "type": "TimelineLayout",
47631
+ "default": "TimelineLayout.Default",
47632
+ "description": "Visual arrangement of the items: Default — all items stacked on one side of the rail (the classic single-column timeline). Alternate — items zig-zag to either side of a centered rail (even indices on the left, odd on the right). Only applies to vertical orientation; horizontal falls back to Default.",
47633
+ "isCascading": false,
47634
+ "captureUnmatched": false
47635
+ },
46427
47636
  {
46428
47637
  "name": "ActiveIndex",
46429
47638
  "type": "int?",
@@ -46464,11 +47673,20 @@
46464
47673
  "description": "Two-way binding callback for ActiveIndex."
46465
47674
  }
46466
47675
  ],
46467
- "enums": [],
47676
+ "enums": [
47677
+ {
47678
+ "name": "TimelineLayout",
47679
+ "values": [
47680
+ "Default",
47681
+ "Alternate"
47682
+ ],
47683
+ "description": "Visual arrangement for Timeline items."
47684
+ }
47685
+ ],
46468
47686
  "records": [
46469
47687
  {
46470
47688
  "name": "TimelineContext",
46471
- "signature": "TimelineContext(Lumeo.Orientation Orientation, bool Animated, int? ActiveIndex, int? PreviousActiveIndex, int ReplayKey, Timeline Parent)",
47689
+ "signature": "TimelineContext(Lumeo.Orientation Orientation, bool Animated, int? ActiveIndex, int? PreviousActiveIndex, int ReplayKey, Timeline Parent, TimelineLayout Layout)",
46472
47690
  "description": null
46473
47691
  }
46474
47692
  ],
@@ -46507,7 +47725,9 @@
46507
47725
  "fileName": "TimelineItem.razor",
46508
47726
  "namespace": "Lumeo",
46509
47727
  "inheritsFrom": null,
46510
- "implements": [],
47728
+ "implements": [
47729
+ "IDisposable"
47730
+ ],
46511
47731
  "parameters": [
46512
47732
  {
46513
47733
  "name": "Context",
@@ -46549,6 +47769,14 @@
46549
47769
  "isCascading": false,
46550
47770
  "captureUnmatched": false
46551
47771
  },
47772
+ {
47773
+ "name": "ChildContent",
47774
+ "type": "RenderFragment?",
47775
+ "default": null,
47776
+ "description": "Free-form content rendered in the item's body, after the structured Title / Description / Time (any of which may be omitted). Use this to compose richer entries — buttons, badges, avatars, nested markup — that the fixed fields can't express. Works in every orientation/layout.",
47777
+ "isCascading": false,
47778
+ "captureUnmatched": false
47779
+ },
46552
47780
  {
46553
47781
  "name": "IsActive",
46554
47782
  "type": "bool",
@@ -46575,17 +47803,7 @@
46575
47803
  }
46576
47804
  ],
46577
47805
  "events": [],
46578
- "enums": [
46579
- {
46580
- "name": "ProgressState",
46581
- "values": [
46582
- "Pending",
46583
- "Completed",
46584
- "Active"
46585
- ],
46586
- "description": null
46587
- }
46588
- ],
47806
+ "enums": [],
46589
47807
  "records": [],
46590
47808
  "gotchas": [],
46591
47809
  "parseFailed": false,
@@ -46607,7 +47825,9 @@
46607
47825
  ],
46608
47826
  "namespace": "Lumeo",
46609
47827
  "inheritsFrom": null,
46610
- "implements": [],
47828
+ "implements": [
47829
+ "IAsyncDisposable"
47830
+ ],
46611
47831
  "parameters": [
46612
47832
  {
46613
47833
  "name": "Variant",
@@ -46721,6 +47941,22 @@
46721
47941
  "isCascading": false,
46722
47942
  "captureUnmatched": false
46723
47943
  },
47944
+ {
47945
+ "name": "Min",
47946
+ "type": "TimeSpan?",
47947
+ "default": null,
47948
+ "description": "Earliest selectable time (inclusive). Times before this are rendered as disabled options. Null (default) means no lower bound.",
47949
+ "isCascading": false,
47950
+ "captureUnmatched": false
47951
+ },
47952
+ {
47953
+ "name": "Max",
47954
+ "type": "TimeSpan?",
47955
+ "default": null,
47956
+ "description": "Latest selectable time (inclusive). Times after this are rendered as disabled options. Null (default) means no upper bound.",
47957
+ "isCascading": false,
47958
+ "captureUnmatched": false
47959
+ },
46724
47960
  {
46725
47961
  "name": "Placeholder",
46726
47962
  "type": "string?",
@@ -46947,6 +48183,14 @@
46947
48183
  "isCascading": false,
46948
48184
  "captureUnmatched": false
46949
48185
  },
48186
+ {
48187
+ "name": "Id",
48188
+ "type": "string?",
48189
+ "default": null,
48190
+ "description": "Stable DOM id for the toast root. The provider sets this so it can register the touch swipe-to-dismiss gesture against this element via RegisterToastSwipe.",
48191
+ "isCascading": false,
48192
+ "captureUnmatched": false
48193
+ },
46950
48194
  {
46951
48195
  "name": "Class",
46952
48196
  "type": "string?",
@@ -47509,7 +48753,9 @@
47509
48753
  ],
47510
48754
  "namespace": "Lumeo",
47511
48755
  "inheritsFrom": null,
47512
- "implements": [],
48756
+ "implements": [
48757
+ "IAsyncDisposable"
48758
+ ],
47513
48759
  "parameters": [
47514
48760
  {
47515
48761
  "name": "ChildContent",
@@ -47625,7 +48871,7 @@
47625
48871
  "records": [
47626
48872
  {
47627
48873
  "name": "ToggleGroupContext",
47628
- "signature": "ToggleGroupContext(ToggleGroupType Type, HashSet<string> SelectedItems, ToggleGroupVariant Variant, Lumeo.Size Size, EventCallback<string> Toggle)",
48874
+ "signature": "ToggleGroupContext(\n ToggleGroupType Type,\n HashSet<string> SelectedItems,\n ToggleGroupVariant Variant,\n Lumeo.Size Size,\n EventCallback<string> Toggle,\n Func<string, bool, string> GetTabIndex,\n List<string> ItemValues,\n Dictionary<string, string> ItemIds,\n Dictionary<string, bool> ItemDisabled)",
47629
48875
  "description": null
47630
48876
  }
47631
48877
  ],
@@ -47663,7 +48909,9 @@
47663
48909
  "fileName": "ToggleGroupItem.razor",
47664
48910
  "namespace": "Lumeo",
47665
48911
  "inheritsFrom": null,
47666
- "implements": [],
48912
+ "implements": [
48913
+ "IDisposable"
48914
+ ],
47667
48915
  "parameters": [
47668
48916
  {
47669
48917
  "name": "Value",
@@ -47798,10 +49046,26 @@
47798
49046
  "description": "aria-label for the \"⋯\" overflow button. Default: \"More\".",
47799
49047
  "isCascading": false,
47800
49048
  "captureUnmatched": false
49049
+ },
49050
+ {
49051
+ "name": "Orientation",
49052
+ "type": "ToolbarOrientation",
49053
+ "default": "ToolbarOrientation.Horizontal",
49054
+ "description": "Layout/keyboard orientation. Horizontal (default) uses Left/Right arrows to move between items; Vertical uses Up/Down. Drives aria-orientation.",
49055
+ "isCascading": false,
49056
+ "captureUnmatched": false
47801
49057
  }
47802
49058
  ],
47803
49059
  "events": [],
47804
49060
  "enums": [
49061
+ {
49062
+ "name": "ToolbarOrientation",
49063
+ "values": [
49064
+ "Horizontal",
49065
+ "Vertical"
49066
+ ],
49067
+ "description": "Toolbar layout/keyboard orientation."
49068
+ },
47805
49069
  {
47806
49070
  "name": "ToolbarRenderSlot",
47807
49071
  "values": [
@@ -48035,18 +49299,7 @@
48035
49299
  }
48036
49300
  ],
48037
49301
  "events": [],
48038
- "enums": [
48039
- {
48040
- "name": "ToolCallStatus",
48041
- "values": [
48042
- "Pending",
48043
- "Running",
48044
- "Success",
48045
- "Error"
48046
- ],
48047
- "description": null
48048
- }
48049
- ],
49302
+ "enums": [],
48050
49303
  "records": [],
48051
49304
  "gotchas": [],
48052
49305
  "cssVars": [
@@ -48136,7 +49389,7 @@
48136
49389
  "records": [
48137
49390
  {
48138
49391
  "name": "TooltipContext",
48139
- "signature": "TooltipContext(bool IsOpen, string WrapperId)",
49392
+ "signature": "TooltipContext(bool IsOpen, string WrapperId, string ContentId)",
48140
49393
  "description": null
48141
49394
  }
48142
49395
  ],
@@ -48625,6 +49878,14 @@
48625
49878
  "isCascading": false,
48626
49879
  "captureUnmatched": false
48627
49880
  },
49881
+ {
49882
+ "name": "ShowSelectAll",
49883
+ "type": "bool",
49884
+ "default": "true",
49885
+ "description": "When true (default), each panel header shows a select-all checkbox that toggles every enabled, currently-visible (filtered) item in that panel. The checkbox reflects an indeterminate state when only some items are selected.",
49886
+ "isCascading": false,
49887
+ "captureUnmatched": false
49888
+ },
48628
49889
  {
48629
49890
  "name": "Class",
48630
49891
  "type": "string?",
@@ -48663,8 +49924,8 @@
48663
49924
  "records": [
48664
49925
  {
48665
49926
  "name": "TransferItem",
48666
- "signature": "TransferItem(string Label, string Value)",
48667
- "description": null
49927
+ "signature": "TransferItem(string Label, string Value, bool Disabled = false)",
49928
+ "description": "A transfer row. A Disabled item can't be selected or moved (its checkbox is disabled and a select-all skips it) and renders dimmed."
48668
49929
  },
48669
49930
  {
48670
49931
  "name": "TransferChangeEventArgs",
@@ -48805,6 +50066,14 @@
48805
50066
  "isCascading": false,
48806
50067
  "captureUnmatched": false
48807
50068
  },
50069
+ {
50070
+ "name": "Clearable",
50071
+ "type": "bool",
50072
+ "default": null,
50073
+ "description": null,
50074
+ "isCascading": false,
50075
+ "captureUnmatched": false
50076
+ },
48808
50077
  {
48809
50078
  "name": "Required",
48810
50079
  "type": "bool",
@@ -49484,6 +50753,30 @@
49484
50753
  "isCascading": false,
49485
50754
  "captureUnmatched": false
49486
50755
  },
50756
+ {
50757
+ "name": "Image",
50758
+ "type": "string?",
50759
+ "default": null,
50760
+ "description": "Optional image URL to tile as the watermark instead of Text. When set, the image is repeated edge-to-edge; ImageWidth/ImageHeight control each tile's size and Opacity dims it. Takes precedence over Text when both are provided.",
50761
+ "isCascading": false,
50762
+ "captureUnmatched": false
50763
+ },
50764
+ {
50765
+ "name": "ImageWidth",
50766
+ "type": "int",
50767
+ "default": "120",
50768
+ "description": "Tile width in px for the Image watermark. Default 120.",
50769
+ "isCascading": false,
50770
+ "captureUnmatched": false
50771
+ },
50772
+ {
50773
+ "name": "ImageHeight",
50774
+ "type": "int",
50775
+ "default": "64",
50776
+ "description": "Tile height in px for the Image watermark. Default 64.",
50777
+ "isCascading": false,
50778
+ "captureUnmatched": false
50779
+ },
49487
50780
  {
49488
50781
  "name": "ChildContent",
49489
50782
  "type": "RenderFragment?",