tembro 3.1.5 → 3.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +241 -91
  3. package/dist/components/ui/dialog/index.d.ts +3 -1
  4. package/dist/components/ui/select/index.d.ts +6 -3
  5. package/dist/showcase/package-meta.d.ts +3 -3
  6. package/dist/showcase/premium/wizard/index.cjs +1 -0
  7. package/dist/showcase/premium/wizard/index.d.ts +2 -0
  8. package/dist/showcase/premium/wizard/index.js +1 -0
  9. package/dist/showcase/premium/wizard/mock.cjs +1 -0
  10. package/dist/showcase/premium/wizard/mock.d.ts +2 -0
  11. package/dist/showcase/premium/wizard/mock.js +1 -0
  12. package/dist/showcase/premium/wizard/showcase.cjs +1 -0
  13. package/dist/showcase/premium/wizard/showcase.d.ts +2 -0
  14. package/dist/showcase/premium/wizard/showcase.js +1 -0
  15. package/dist/showcase/search-utils.d.ts +1 -1
  16. package/dist/showcase/site-data.d.ts +6 -6
  17. package/dist/src/components/layout/app-sidebar.cjs +1 -1
  18. package/dist/src/components/layout/app-sidebar.js +49 -36
  19. package/dist/src/components/theme-provider.cjs +1 -1
  20. package/dist/src/components/theme-provider.js +1 -1
  21. package/dist/src/components/ui/dialog/index.cjs +1 -1
  22. package/dist/src/components/ui/dialog/index.js +14 -7
  23. package/dist/src/components/ui/select/index.cjs +1 -1
  24. package/dist/src/components/ui/select/index.js +44 -43
  25. package/dist/src/index.cjs +1 -1
  26. package/dist/src/index.js +101 -101
  27. package/dist/src/showcase/component-api-schema.cjs +1 -1
  28. package/dist/src/showcase/component-api-schema.js +868 -9
  29. package/dist/src/showcase/demo-snippets/forms/index.cjs +1 -1
  30. package/dist/src/showcase/demo-snippets/forms/index.js +1 -1
  31. package/dist/src/showcase/fallback.cjs +4 -4
  32. package/dist/src/showcase/fallback.js +354 -181
  33. package/dist/src/showcase/index.cjs +1 -1
  34. package/dist/src/showcase/index.js +2 -2
  35. package/dist/src/showcase/package-meta.cjs +1 -1
  36. package/dist/src/showcase/package-meta.js +1 -1
  37. package/dist/src/showcase/premium/app-sidebar/mock.cjs +3 -2
  38. package/dist/src/showcase/premium/app-sidebar/mock.js +1 -1
  39. package/dist/src/showcase/premium/app-sidebar/showcase.cjs +1 -1
  40. package/dist/src/showcase/premium/app-sidebar/showcase.js +1 -1
  41. package/dist/src/showcase/premium/async-select/showcase.cjs +1 -1
  42. package/dist/src/showcase/premium/async-select/showcase.js +118 -74
  43. package/dist/src/showcase/premium/avatar/showcase.cjs +1 -1
  44. package/dist/src/showcase/premium/avatar/showcase.js +5 -5
  45. package/dist/src/showcase/premium/dialog/mock.cjs +6 -1
  46. package/dist/src/showcase/premium/dialog/mock.js +1 -1
  47. package/dist/src/showcase/premium/dialog/showcase.cjs +1 -1
  48. package/dist/src/showcase/premium/dialog/showcase.js +101 -39
  49. package/dist/src/showcase/premium/form-wrapper/mock.cjs +2 -2
  50. package/dist/src/showcase/premium/form-wrapper/mock.js +2 -2
  51. package/dist/src/showcase/premium/form-wrapper/showcase.cjs +1 -1
  52. package/dist/src/showcase/premium/form-wrapper/showcase.js +1 -1
  53. package/dist/src/showcase/premium/index.cjs +1 -1
  54. package/dist/src/showcase/premium/index.js +9 -3
  55. package/dist/src/showcase/premium/input/showcase.cjs +1 -1
  56. package/dist/src/showcase/premium/input/showcase.js +1 -1
  57. package/dist/src/showcase/premium/json-input/showcase.cjs +1 -1
  58. package/dist/src/showcase/premium/json-input/showcase.js +1 -1
  59. package/dist/src/showcase/premium/select/showcase.cjs +1 -1
  60. package/dist/src/showcase/premium/select/showcase.js +53 -0
  61. package/dist/src/showcase/premium/table/mock.cjs +1 -1
  62. package/dist/src/showcase/premium/table/mock.js +1 -1
  63. package/dist/src/showcase/premium/types.cjs +1 -1
  64. package/dist/src/showcase/premium/types.js +1 -1
  65. package/dist/src/showcase/premium/wizard/index.cjs +1 -0
  66. package/dist/src/showcase/premium/wizard/index.js +3 -0
  67. package/dist/src/showcase/premium/wizard/mock.cjs +25 -0
  68. package/dist/src/showcase/premium/wizard/mock.js +32 -0
  69. package/dist/src/showcase/premium/wizard/showcase.cjs +1 -0
  70. package/dist/src/showcase/premium/wizard/showcase.js +130 -0
  71. package/dist/src/showcase/preview-registry.cjs +1 -1
  72. package/dist/src/showcase/preview-registry.js +6 -6
  73. package/dist/src/showcase/registry-quality.cjs +1 -1
  74. package/dist/src/showcase/registry-quality.js +5 -0
  75. package/dist/src/showcase/registry-specific.cjs +1 -1
  76. package/dist/src/showcase/registry-specific.js +2 -2
  77. package/dist/src/showcase/render-registry-preview.cjs +1 -1
  78. package/dist/src/showcase/render-registry-preview.js +2 -2
  79. package/dist/src/showcase/site-data.cjs +1 -1
  80. package/dist/src/showcase/site-data.js +198 -44
  81. package/dist/src/showcase/tembro-registry.json.cjs +1 -1
  82. package/dist/src/showcase/tembro-registry.json.js +1 -1
  83. package/dist/src/showcase/types.cjs +1 -1
  84. package/dist/src/showcase/types.js +1 -1
  85. package/package.json +13 -9
  86. package/packages/cli/dist/index.cjs +127 -127
  87. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +31 -6
  88. package/packages/cli/vendor/src/components/theme-provider.tsx +1 -1
  89. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +15 -3
  90. package/packages/cli/vendor/src/components/ui/select/index.tsx +17 -10
  91. package/packages/cli/vendor/src/showcase/component-api-schema.ts +269 -39
  92. package/packages/cli/vendor/src/showcase/demo-snippets/forms/index.ts +1 -1
  93. package/packages/cli/vendor/src/showcase/fallback.tsx +202 -39
  94. package/packages/cli/vendor/src/showcase/index.ts +6 -6
  95. package/packages/cli/vendor/src/showcase/package-meta.ts +3 -3
  96. package/packages/cli/vendor/src/showcase/premium/app-sidebar/mock.ts +3 -2
  97. package/packages/cli/vendor/src/showcase/premium/app-sidebar/showcase.tsx +1 -1
  98. package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +50 -4
  99. package/packages/cli/vendor/src/showcase/premium/avatar/showcase.tsx +5 -5
  100. package/packages/cli/vendor/src/showcase/premium/dialog/mock.ts +6 -1
  101. package/packages/cli/vendor/src/showcase/premium/dialog/showcase.tsx +53 -1
  102. package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +2 -2
  103. package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +1 -1
  104. package/packages/cli/vendor/src/showcase/premium/index.ts +5 -3
  105. package/packages/cli/vendor/src/showcase/premium/input/showcase.tsx +1 -1
  106. package/packages/cli/vendor/src/showcase/premium/json-input/showcase.tsx +1 -1
  107. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +38 -0
  108. package/packages/cli/vendor/src/showcase/premium/table/mock.ts +1 -1
  109. package/packages/cli/vendor/src/showcase/premium/types.ts +1 -1
  110. package/packages/cli/vendor/src/showcase/premium/wizard/index.ts +2 -0
  111. package/packages/cli/vendor/src/showcase/premium/wizard/mock.ts +41 -0
  112. package/packages/cli/vendor/src/showcase/premium/wizard/showcase.tsx +88 -0
  113. package/packages/cli/vendor/src/showcase/preview-registry.tsx +6 -6
  114. package/packages/cli/vendor/src/showcase/registry-quality.ts +5 -0
  115. package/packages/cli/vendor/src/showcase/registry-specific.tsx +2 -2
  116. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +2 -2
  117. package/packages/cli/vendor/src/showcase/site-data.tsx +89 -32
  118. package/packages/cli/vendor/src/showcase/tembro-registry.json +1 -1
  119. package/packages/cli/vendor/src/showcase/types.ts +1 -1
  120. package/registry.json +1 -1
@@ -158,6 +158,12 @@ var e = {
158
158
  description: "Direct text callback for controlled string flows.",
159
159
  example: "onValueChange={setQuery}"
160
160
  },
161
+ {
162
+ name: "onDebouncedValueChange",
163
+ type: "(value: string) => void",
164
+ defaultValue: "-",
165
+ description: "Delayed callback for search-heavy inputs."
166
+ },
161
167
  {
162
168
  name: "type",
163
169
  type: "HTMLInputTypeAttribute",
@@ -195,6 +201,12 @@ var e = {
195
201
  defaultValue: "-",
196
202
  description: "Called after the built-in clear action resets the field."
197
203
  },
204
+ {
205
+ name: "clearLabel",
206
+ type: "string",
207
+ defaultValue: "'Clear'",
208
+ description: "Accessible label for the clear action."
209
+ },
198
210
  {
199
211
  name: "trailingAction",
200
212
  type: "ReactNode",
@@ -232,6 +244,30 @@ var e = {
232
244
  defaultValue: "false",
233
245
  description: "Shows current length and maxLength when available."
234
246
  },
247
+ {
248
+ name: "loading",
249
+ type: "boolean",
250
+ defaultValue: "false",
251
+ description: "Shows pending feedback in search-oriented input states."
252
+ },
253
+ {
254
+ name: "resultCount",
255
+ type: "number",
256
+ defaultValue: "-",
257
+ description: "Optional search result count displayed in the input meta area."
258
+ },
259
+ {
260
+ name: "shortcut",
261
+ type: "ReactNode",
262
+ defaultValue: "-",
263
+ description: "Keyboard hint or shortcut chip rendered inside search-oriented inputs."
264
+ },
265
+ {
266
+ name: "debounceMs",
267
+ type: "number",
268
+ defaultValue: "-",
269
+ description: "Delay before `onDebouncedValueChange` fires."
270
+ },
235
271
  {
236
272
  name: "disabled",
237
273
  type: "boolean",
@@ -326,6 +362,12 @@ var e = {
326
362
  defaultValue: "-",
327
363
  description: "Text shown when no value is selected."
328
364
  },
365
+ {
366
+ name: "searchPlaceholder",
367
+ type: "string",
368
+ defaultValue: "'Search options...'",
369
+ description: "Placeholder used by the optional search input inside the popup."
370
+ },
329
371
  {
330
372
  name: "disabled",
331
373
  type: "boolean",
@@ -344,12 +386,30 @@ var e = {
344
386
  defaultValue: "false",
345
387
  description: "Shows a clear action when a value is selected."
346
388
  },
389
+ {
390
+ name: "clearLabel",
391
+ type: "string",
392
+ defaultValue: "'Clear selection'",
393
+ description: "Accessible label for the clear action."
394
+ },
395
+ {
396
+ name: "size",
397
+ type: "'sm' | 'default' | 'lg'",
398
+ defaultValue: "'default'",
399
+ description: "Controls trigger height and density."
400
+ },
347
401
  {
348
402
  name: "loading",
349
403
  type: "boolean",
350
404
  defaultValue: "false",
351
405
  description: "Disables selection and renders a loading state."
352
406
  },
407
+ {
408
+ name: "loadingLabel",
409
+ type: "ReactNode",
410
+ defaultValue: "'Loading options...'",
411
+ description: "Content shown while options are loading."
412
+ },
353
413
  {
354
414
  name: "emptyLabel",
355
415
  type: "ReactNode",
@@ -362,11 +422,35 @@ var e = {
362
422
  defaultValue: "-",
363
423
  description: "Alias for empty state content used by newer docs."
364
424
  },
425
+ {
426
+ name: "showSelectedDescription",
427
+ type: "boolean",
428
+ defaultValue: "true",
429
+ description: "Shows the selected option description inside the trigger when available."
430
+ },
431
+ {
432
+ name: "showSelectedIndicator",
433
+ type: "boolean",
434
+ defaultValue: "true",
435
+ description: "Shows the built-in check indicator inside option rows. Set false when `renderOption` draws its own selected state."
436
+ },
365
437
  {
366
438
  name: "renderOption",
367
439
  type: "(option, state) => ReactNode",
368
440
  defaultValue: "-",
369
441
  description: "Custom option renderer for richer rows."
442
+ },
443
+ {
444
+ name: "invalid",
445
+ type: "boolean",
446
+ defaultValue: "false",
447
+ description: "Marks the trigger invalid and sets `aria-invalid`."
448
+ },
449
+ {
450
+ name: "onSearchChange",
451
+ type: "(value: string) => void",
452
+ defaultValue: "-",
453
+ description: "Called as the local search value changes."
370
454
  }
371
455
  ],
372
456
  examples: [
@@ -382,6 +466,10 @@ var e = {
382
466
  title: "Grouped select",
383
467
  code: "<Select value={region} onValueChange={setRegion} groups={regionGroups} searchable />"
384
468
  },
469
+ {
470
+ title: "Custom option selected state",
471
+ code: "<Select options={options} renderOption={(option, state) => <CustomOption selected={state.selected} />} showSelectedIndicator={false} />"
472
+ },
385
473
  {
386
474
  title: "Async member direction",
387
475
  code: "// Prefer Select first; use AsyncSelect only when remote loading is required."
@@ -532,6 +620,18 @@ var e = {
532
620
  description: "Controlled search input config for the built-in toolbar.",
533
621
  example: "search={{ value, onValueChange: setValue, placeholder: \"Search invoices...\" }}"
534
622
  },
623
+ {
624
+ name: "filters",
625
+ type: "ReactNode | (context) => ReactNode",
626
+ defaultValue: "-",
627
+ description: "Filter controls rendered in the default toolbar."
628
+ },
629
+ {
630
+ name: "summary",
631
+ type: "ReactNode | (context) => ReactNode",
632
+ defaultValue: "-",
633
+ description: "Compact summary content rendered in the default toolbar."
634
+ },
535
635
  {
536
636
  name: "toolbarProps",
537
637
  type: "DataTableToolbarProps | (table) => DataTableToolbarProps",
@@ -569,6 +669,18 @@ var e = {
569
669
  defaultValue: "-",
570
670
  description: "Declarative row menu items appended as an actions column."
571
671
  },
672
+ {
673
+ name: "onRefresh",
674
+ type: "(context) => void",
675
+ defaultValue: "-",
676
+ description: "Callback used by the built-in refresh action."
677
+ },
678
+ {
679
+ name: "onExport",
680
+ type: "(context) => void",
681
+ defaultValue: "-",
682
+ description: "Callback used by the built-in export action."
683
+ },
572
684
  {
573
685
  name: "sorting",
574
686
  type: "SortingState",
@@ -669,6 +781,24 @@ var e = {
669
781
  defaultValue: "false",
670
782
  description: "Keeps headers pinned while the table scrolls."
671
783
  },
784
+ {
785
+ name: "renderExpandedRow",
786
+ type: "(row) => ReactNode",
787
+ defaultValue: "-",
788
+ description: "Renders an expanded row panel beneath a parent row."
789
+ },
790
+ {
791
+ name: "columnPinning",
792
+ type: "ColumnPinningState",
793
+ defaultValue: "-",
794
+ description: "Controlled TanStack column pinning state."
795
+ },
796
+ {
797
+ name: "virtualization",
798
+ type: "DataTableVirtualizationConfig | false",
799
+ defaultValue: "-",
800
+ description: "Enables virtualized row rendering for large datasets."
801
+ },
672
802
  {
673
803
  name: "isLoading",
674
804
  type: "boolean",
@@ -724,10 +854,485 @@ var e = {
724
854
  "When mobile cards replace the table, preserve the same row meaning and action availability."
725
855
  ]
726
856
  },
857
+ "async-select": {
858
+ slug: "async-select",
859
+ source: "metadata",
860
+ summary: "Remote option picker for large, changing or server-filtered datasets. Prefer Select for small finite lists; use AsyncSelect when loading, hydration, create-option, min-search, cache, error and multi-select behavior are required.",
861
+ props: [
862
+ {
863
+ name: "value",
864
+ type: "string | string[]",
865
+ defaultValue: "-",
866
+ description: "Controlled selected value. Use an array when `isMulti` is true."
867
+ },
868
+ {
869
+ name: "isMulti",
870
+ type: "boolean",
871
+ defaultValue: "false",
872
+ description: "Switches the component into multi-value mode with tag rendering and optional select-all behavior.",
873
+ example: "isMulti"
874
+ },
875
+ {
876
+ name: "onValueChange",
877
+ type: "(value, optionOrOptions) => void",
878
+ defaultValue: "-",
879
+ description: "Called with the next selected value and resolved option object(s)."
880
+ },
881
+ {
882
+ name: "loadOptions",
883
+ type: "(search: string, signal?: AbortSignal) => Promise<Option[] | Group[]>",
884
+ defaultValue: "-",
885
+ required: !0,
886
+ description: "Async option loader. Respect the AbortSignal when forwarding to fetch."
887
+ },
888
+ {
889
+ name: "loadSelectedOption",
890
+ type: "(value: string, signal?: AbortSignal) => Promise<Option | null>",
891
+ defaultValue: "-",
892
+ description: "Hydrates a single selected value when only an ID is stored."
893
+ },
894
+ {
895
+ name: "loadSelectedOptions",
896
+ type: "(values: string[], signal?: AbortSignal) => Promise<Option[]>",
897
+ defaultValue: "-",
898
+ description: "Hydrates multiple selected values when only IDs are stored."
899
+ },
900
+ {
901
+ name: "defaultOptions",
902
+ type: "Option[] | Group[]",
903
+ defaultValue: "-",
904
+ description: "Initial options shown before a search request resolves."
905
+ },
906
+ {
907
+ name: "cacheOptions",
908
+ type: "boolean",
909
+ defaultValue: "true",
910
+ description: "Caches query results by normalized search text."
911
+ },
912
+ {
913
+ name: "cacheTtl",
914
+ type: "number",
915
+ defaultValue: "Infinity",
916
+ description: "Maximum age for cached option results."
917
+ },
918
+ {
919
+ name: "debounceMs",
920
+ type: "number",
921
+ defaultValue: "250",
922
+ description: "Delay before search requests are sent."
923
+ },
924
+ {
925
+ name: "minSearchLength",
926
+ type: "number",
927
+ defaultValue: "0",
928
+ description: "Minimum typed characters before loading remote options."
929
+ },
930
+ {
931
+ name: "clearable",
932
+ type: "boolean",
933
+ defaultValue: "true",
934
+ description: "Shows clear actions for selected value or tags."
935
+ },
936
+ {
937
+ name: "closeOnSelect",
938
+ type: "boolean",
939
+ defaultValue: "false",
940
+ description: "Multi-select only. Closes the popup after selecting an option."
941
+ },
942
+ {
943
+ name: "maxSelected",
944
+ type: "number",
945
+ defaultValue: "-",
946
+ description: "Multi-select only. Limits selected option count."
947
+ },
948
+ {
949
+ name: "maxVisibleTags",
950
+ type: "number",
951
+ defaultValue: "-",
952
+ description: "Multi-select only. Collapses extra selected tags into an overflow label."
953
+ },
954
+ {
955
+ name: "showSelectAll",
956
+ type: "boolean",
957
+ defaultValue: "false",
958
+ description: "Multi-select only. Adds a select-all-visible action."
959
+ },
960
+ {
961
+ name: "onCreateOption",
962
+ type: "(search: string) => Promise<Option> | Option",
963
+ defaultValue: "-",
964
+ description: "Creates a selectable option from the current search query."
965
+ },
966
+ {
967
+ name: "showCreateOption",
968
+ type: "(search: string, options: Option[]) => boolean",
969
+ defaultValue: "-",
970
+ description: "Controls when the create-option row should appear."
971
+ },
972
+ {
973
+ name: "createOptionLabel",
974
+ type: "(search: string) => ReactNode",
975
+ defaultValue: "-",
976
+ description: "Custom label for the create-option action."
977
+ },
978
+ {
979
+ name: "labels",
980
+ type: "AsyncSelectLabels",
981
+ defaultValue: "-",
982
+ description: "Centralized copy for placeholder, loading, error, empty, select-all and selected-count states."
983
+ },
984
+ {
985
+ name: "renderOption",
986
+ type: "(option, state) => ReactNode",
987
+ defaultValue: "-",
988
+ description: "Custom option row renderer."
989
+ },
990
+ {
991
+ name: "renderValue",
992
+ type: "(option) => ReactNode",
993
+ defaultValue: "-",
994
+ description: "Custom selected value renderer."
995
+ },
996
+ {
997
+ name: "renderTag",
998
+ type: "(option, state) => ReactNode",
999
+ defaultValue: "-",
1000
+ description: "Multi-select only. Custom selected tag renderer."
1001
+ },
1002
+ {
1003
+ name: "renderLoading",
1004
+ type: "(state) => ReactNode",
1005
+ defaultValue: "-",
1006
+ description: "Custom loading state renderer."
1007
+ },
1008
+ {
1009
+ name: "renderEmpty",
1010
+ type: "(state) => ReactNode",
1011
+ defaultValue: "-",
1012
+ description: "Custom empty state renderer."
1013
+ },
1014
+ {
1015
+ name: "renderError",
1016
+ type: "(state) => ReactNode",
1017
+ defaultValue: "-",
1018
+ description: "Custom error state renderer."
1019
+ },
1020
+ {
1021
+ name: "renderMinSearch",
1022
+ type: "(state) => ReactNode",
1023
+ defaultValue: "-",
1024
+ description: "Custom minimum-search state renderer."
1025
+ },
1026
+ {
1027
+ name: "renderMaxSelected",
1028
+ type: "(state) => ReactNode",
1029
+ defaultValue: "-",
1030
+ description: "Custom max-selected state renderer."
1031
+ },
1032
+ {
1033
+ name: "showSelectedDescription",
1034
+ type: "boolean",
1035
+ defaultValue: "true",
1036
+ description: "Shows option descriptions in selected value and tag surfaces."
1037
+ },
1038
+ {
1039
+ name: "invalid",
1040
+ type: "boolean",
1041
+ defaultValue: "false",
1042
+ description: "Marks the trigger invalid and sets `aria-invalid`."
1043
+ }
1044
+ ],
1045
+ examples: [
1046
+ {
1047
+ title: "Remote single select",
1048
+ code: "<AsyncSelect value={value} onValueChange={setValue} loadOptions={loadOptions} minSearchLength={2} />"
1049
+ },
1050
+ {
1051
+ title: "Hydrated edit state",
1052
+ code: "<AsyncSelect value={ownerId} loadOptions={searchOwners} loadSelectedOption={loadOwnerById} />"
1053
+ },
1054
+ {
1055
+ title: "Multi select with limit",
1056
+ code: "<AsyncSelect isMulti value={ids} onValueChange={setIds} loadOptions={loadTeams} maxSelected={3} showSelectAll />"
1057
+ },
1058
+ {
1059
+ title: "Create missing option",
1060
+ code: "<AsyncSelect loadOptions={loadOptions} onCreateOption={createOption} createOptionLabel={(search) => `Create ${search}`} />"
1061
+ }
1062
+ ],
1063
+ accessibility: [
1064
+ "Keep async loading and error labels readable.",
1065
+ "Use min-search copy so users know why no request has been sent.",
1066
+ "Preserve keyboard access for clear, tag remove and select-all actions.",
1067
+ "Hydrate selected labels so edit forms do not expose raw IDs."
1068
+ ]
1069
+ },
1070
+ "async-multi-select": {
1071
+ slug: "async-multi-select",
1072
+ source: "metadata",
1073
+ summary: "Deprecated public alias for multi-value async selection. Prefer `AsyncSelect` with `isMulti` so single and multi remote selection share one mental model.",
1074
+ props: [
1075
+ {
1076
+ name: "isMulti",
1077
+ type: "true",
1078
+ defaultValue: "true",
1079
+ required: !0,
1080
+ description: "Prefer passing this to `AsyncSelect` instead of importing the deprecated alias."
1081
+ },
1082
+ {
1083
+ name: "value",
1084
+ type: "string[]",
1085
+ defaultValue: "[]",
1086
+ description: "Controlled selected values."
1087
+ },
1088
+ {
1089
+ name: "onValueChange",
1090
+ type: "(values: string[], options: Option[]) => void",
1091
+ defaultValue: "-",
1092
+ description: "Called when selected values change."
1093
+ },
1094
+ {
1095
+ name: "loadOptions",
1096
+ type: "(search: string, signal?: AbortSignal) => Promise<Option[] | Group[]>",
1097
+ defaultValue: "-",
1098
+ required: !0,
1099
+ description: "Async option loader."
1100
+ },
1101
+ {
1102
+ name: "loadSelectedOptions",
1103
+ type: "(values: string[], signal?: AbortSignal) => Promise<Option[]>",
1104
+ defaultValue: "-",
1105
+ description: "Hydrates selected values from stored IDs."
1106
+ },
1107
+ {
1108
+ name: "maxSelected",
1109
+ type: "number",
1110
+ defaultValue: "-",
1111
+ description: "Limits selected option count."
1112
+ },
1113
+ {
1114
+ name: "showSelectAll",
1115
+ type: "boolean",
1116
+ defaultValue: "false",
1117
+ description: "Adds a select-all-visible action."
1118
+ },
1119
+ {
1120
+ name: "maxVisibleTags",
1121
+ type: "number",
1122
+ defaultValue: "-",
1123
+ description: "Collapses extra selected tags."
1124
+ }
1125
+ ],
1126
+ examples: [{
1127
+ title: "Preferred API",
1128
+ code: "<AsyncSelect isMulti value={teamIds} onValueChange={setTeamIds} loadOptions={loadTeams} />"
1129
+ }],
1130
+ accessibility: [
1131
+ "Make tag remove controls keyboard reachable.",
1132
+ "Announce selected count when selections are constrained.",
1133
+ "Keep deprecated alias docs pointed to the preferred API."
1134
+ ]
1135
+ },
1136
+ "app-sidebar": {
1137
+ slug: "app-sidebar",
1138
+ source: "metadata",
1139
+ summary: "Reusable dashboard navigation shell for admin products. Keep route state in one items array, render framework links through `renderLink`, and use the built-in active indicators, collapsed rail, mobile drawer and footer account slots instead of rebuilding sidebar chrome per app.",
1140
+ props: [
1141
+ {
1142
+ name: "items",
1143
+ type: "SidebarItem[]",
1144
+ defaultValue: "[]",
1145
+ required: !0,
1146
+ description: "Primary navigation tree with labels, hrefs, badges, active state, disabled state and nested children."
1147
+ },
1148
+ {
1149
+ name: "header",
1150
+ type: "ReactNode",
1151
+ defaultValue: "-",
1152
+ description: "Workspace, product or tenant identity area."
1153
+ },
1154
+ {
1155
+ name: "footer",
1156
+ type: "ReactNode",
1157
+ defaultValue: "-",
1158
+ description: "Custom footer content rendered under account and secondary actions."
1159
+ },
1160
+ {
1161
+ name: "footerAccount",
1162
+ type: "{ label; description?; avatar?; href?; onSelect? }",
1163
+ defaultValue: "-",
1164
+ description: "Account/workspace switcher surface rendered in the footer."
1165
+ },
1166
+ {
1167
+ name: "secondaryActions",
1168
+ type: "SidebarItem[]",
1169
+ defaultValue: "[]",
1170
+ description: "Support, billing, help or logout-like actions below primary navigation."
1171
+ },
1172
+ {
1173
+ name: "railItems",
1174
+ type: "SidebarItem[]",
1175
+ defaultValue: "[]",
1176
+ description: "Compact rail actions shown when the sidebar is collapsed."
1177
+ },
1178
+ {
1179
+ name: "collapsed",
1180
+ type: "boolean",
1181
+ defaultValue: "false",
1182
+ description: "Switches desktop sidebar into icon rail mode."
1183
+ },
1184
+ {
1185
+ name: "width",
1186
+ type: "CSSProperties['width']",
1187
+ defaultValue: "'18rem'",
1188
+ description: "Expanded desktop sidebar width."
1189
+ },
1190
+ {
1191
+ name: "collapsedWidth",
1192
+ type: "CSSProperties['width']",
1193
+ defaultValue: "'4.75rem'",
1194
+ description: "Collapsed desktop rail width."
1195
+ },
1196
+ {
1197
+ name: "itemSize",
1198
+ type: "'sm' | 'md' | 'lg'",
1199
+ defaultValue: "'md'",
1200
+ description: "Controls item density for compact admin apps or comfortable product shells."
1201
+ },
1202
+ {
1203
+ name: "activeIndicator",
1204
+ type: "'none' | 'bar' | 'pill'",
1205
+ defaultValue: "'bar'",
1206
+ description: "Controls how the active route is emphasized."
1207
+ },
1208
+ {
1209
+ name: "showSectionLabels",
1210
+ type: "boolean",
1211
+ defaultValue: "true",
1212
+ description: "Shows top-level section labels from item.sectionLabel."
1213
+ },
1214
+ {
1215
+ name: "tooltipOnCollapsed",
1216
+ type: "boolean",
1217
+ defaultValue: "true",
1218
+ description: "Shows item labels in tooltips while collapsed."
1219
+ },
1220
+ {
1221
+ name: "navigationLabel",
1222
+ type: "string",
1223
+ defaultValue: "'Primary navigation'",
1224
+ description: "Accessible label for the navigation landmark."
1225
+ },
1226
+ {
1227
+ name: "responsive",
1228
+ type: "boolean",
1229
+ defaultValue: "true",
1230
+ description: "Enables mobile drawer behavior at the configured breakpoint."
1231
+ },
1232
+ {
1233
+ name: "mobileBreakpoint",
1234
+ type: "number",
1235
+ defaultValue: "1024",
1236
+ description: "Viewport width where the sidebar becomes a mobile drawer."
1237
+ },
1238
+ {
1239
+ name: "mobileOpen",
1240
+ type: "boolean",
1241
+ defaultValue: "-",
1242
+ description: "Controlled mobile drawer open state."
1243
+ },
1244
+ {
1245
+ name: "defaultMobileOpen",
1246
+ type: "boolean",
1247
+ defaultValue: "false",
1248
+ description: "Initial uncontrolled mobile drawer open state."
1249
+ },
1250
+ {
1251
+ name: "onMobileOpenChange",
1252
+ type: "(open: boolean) => void",
1253
+ defaultValue: "-",
1254
+ description: "Called when the mobile drawer opens or closes."
1255
+ },
1256
+ {
1257
+ name: "mobileTitle",
1258
+ type: "ReactNode",
1259
+ defaultValue: "-",
1260
+ description: "Title rendered in the mobile drawer header."
1261
+ },
1262
+ {
1263
+ name: "mobileDescription",
1264
+ type: "ReactNode",
1265
+ defaultValue: "-",
1266
+ description: "Short helper copy rendered in the mobile drawer header."
1267
+ },
1268
+ {
1269
+ name: "showMobileToggle",
1270
+ type: "boolean",
1271
+ defaultValue: "true",
1272
+ description: "Controls whether the built-in mobile trigger renders."
1273
+ },
1274
+ {
1275
+ name: "closeOnSelect",
1276
+ type: "boolean",
1277
+ defaultValue: "true",
1278
+ description: "Closes the mobile drawer after a navigation item is selected."
1279
+ },
1280
+ {
1281
+ name: "renderMobileToggle",
1282
+ type: "({ open, setOpen }) => ReactNode",
1283
+ defaultValue: "-",
1284
+ description: "Replaces the built-in mobile trigger."
1285
+ },
1286
+ {
1287
+ name: "onItemSelect",
1288
+ type: "(item: SidebarItem) => void",
1289
+ defaultValue: "-",
1290
+ description: "Global callback fired after any sidebar item is selected."
1291
+ },
1292
+ {
1293
+ name: "renderItem",
1294
+ type: "(item, state) => ReactNode",
1295
+ defaultValue: "-",
1296
+ description: "Fully custom item renderer for advanced product shells."
1297
+ },
1298
+ {
1299
+ name: "renderLink",
1300
+ type: "(props) => ReactNode",
1301
+ defaultValue: "-",
1302
+ description: "Adapter for React Router Link, Next Link, Remix Link or any framework router.",
1303
+ example: "renderLink={({ href, ...props }) => <Link {...props} to={href} />}"
1304
+ }
1305
+ ],
1306
+ examples: [
1307
+ {
1308
+ title: "React Router links",
1309
+ code: "<Sidebar items={items} renderLink={({ href = '/', ...props }) => <Link {...props} to={href} />} />"
1310
+ },
1311
+ {
1312
+ title: "Collapsed rail",
1313
+ code: "<Sidebar collapsed items={items} railItems={railItems} footerAccount={account} />"
1314
+ },
1315
+ {
1316
+ title: "Mobile drawer",
1317
+ code: "<Sidebar responsive mobileTitle=\"Workspace\" mobileDescription=\"Navigate admin sections\" items={items} />"
1318
+ },
1319
+ {
1320
+ title: "Admin density",
1321
+ code: "<Sidebar itemSize=\"sm\" activeIndicator=\"bar\" showSectionLabels={false} items={items} />"
1322
+ }
1323
+ ],
1324
+ accessibility: [
1325
+ "Use `navigationLabel` that matches the product language.",
1326
+ "Keep active route state explicit through `item.active` or child active state.",
1327
+ "Use `renderLink` for client routing instead of raw anchors in React Router or Next apps.",
1328
+ "Collapsed sidebars need icons or tooltips that still identify each route.",
1329
+ "Mobile drawer should close on selection unless the route opens another nested group."
1330
+ ]
1331
+ },
727
1332
  dialog: {
728
1333
  slug: "dialog",
729
1334
  source: "metadata",
730
- summary: "Focused overlay for short decisions, confirmations and contained edit flows.",
1335
+ summary: "Focused overlay for short decisions, confirmations and contained edit flows. Use DialogBody for scrollable content so footer actions stay aligned and visible.",
731
1336
  props: [
732
1337
  {
733
1338
  name: "open",
@@ -747,6 +1352,24 @@ var e = {
747
1352
  defaultValue: "-",
748
1353
  description: "Called when the dialog opens or closes."
749
1354
  },
1355
+ {
1356
+ name: "size",
1357
+ type: "'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full'",
1358
+ defaultValue: "'md'",
1359
+ description: "Controls DialogContent width and full-screen-like layout."
1360
+ },
1361
+ {
1362
+ name: "surface",
1363
+ type: "'default' | 'plain'",
1364
+ defaultValue: "'default'",
1365
+ description: "Controls whether the content uses the default dialog surface or a plain custom wrapper."
1366
+ },
1367
+ {
1368
+ name: "showCloseButton",
1369
+ type: "boolean",
1370
+ defaultValue: "true",
1371
+ description: "Controls the top-right close button on DialogContent or footer close action on DialogFooter."
1372
+ },
750
1373
  {
751
1374
  name: "title",
752
1375
  type: "ReactNode",
@@ -761,21 +1384,43 @@ var e = {
761
1384
  description: "Supporting description for context."
762
1385
  },
763
1386
  {
764
- name: "children",
765
- type: "ReactNode",
1387
+ name: "DialogBody",
1388
+ type: "Component",
766
1389
  defaultValue: "-",
767
- description: "Dialog body content."
1390
+ description: "Scrollable body area for long content, forms, details and preview blocks."
768
1391
  },
769
1392
  {
770
- name: "footer",
1393
+ name: "DialogFooter",
1394
+ type: "Component",
1395
+ defaultValue: "-",
1396
+ description: "Sticky-safe action row. Buttons stay inline-flex and wrap instead of stacking icons above text."
1397
+ },
1398
+ {
1399
+ name: "children",
771
1400
  type: "ReactNode",
772
1401
  defaultValue: "-",
773
- description: "Action row for confirm/cancel buttons."
1402
+ description: "Dialog composition: header, body and footer."
1403
+ }
1404
+ ],
1405
+ examples: [
1406
+ {
1407
+ title: "Confirm dialog",
1408
+ code: "<Dialog><DialogTrigger render={<Button />}>Publish</DialogTrigger><DialogContent><DialogHeader><DialogTitle>Publish update</DialogTitle></DialogHeader><DialogFooter><Button>Publish</Button></DialogFooter></DialogContent></Dialog>"
1409
+ },
1410
+ {
1411
+ title: "Form dialog",
1412
+ code: "<DialogContent size=\"lg\"><DialogHeader /><DialogBody>...</DialogBody><DialogFooter>...</DialogFooter></DialogContent>"
1413
+ },
1414
+ {
1415
+ title: "Destructive dialog",
1416
+ code: "<DialogContent size=\"sm\"><DialogHeader /><DialogBody /><DialogFooter><Button variant=\"destructive\">Deactivate</Button></DialogFooter></DialogContent>"
774
1417
  }
775
1418
  ],
776
1419
  accessibility: [
777
1420
  "Every dialog needs a title.",
778
1421
  "Return focus to the trigger after close.",
1422
+ "Use DialogBody for long content instead of scrolling the whole modal.",
1423
+ "Keep footer actions outcome-specific and keyboard reachable.",
779
1424
  "Do not put long multi-step workflows in a small dialog."
780
1425
  ]
781
1426
  },
@@ -894,10 +1539,224 @@ var e = {
894
1539
  "Error text should be connected to the field.",
895
1540
  "Required state should be visual and semantic."
896
1541
  ]
1542
+ },
1543
+ wizard: {
1544
+ slug: "wizard",
1545
+ source: "metadata",
1546
+ summary: "Controlled multi-step workflow surface for onboarding, setup and review flows. Keep the current step in state so validation, route sync and final submit behavior stay predictable.",
1547
+ props: [
1548
+ {
1549
+ name: "steps",
1550
+ type: "Array<{ id: string; title: ReactNode; description?: ReactNode; disabled?: boolean; completed?: boolean }>",
1551
+ defaultValue: "[]",
1552
+ required: !0,
1553
+ description: "Ordered steps shown in the stepper and used by navigation controls."
1554
+ },
1555
+ {
1556
+ name: "currentStep",
1557
+ type: "string",
1558
+ defaultValue: "-",
1559
+ required: !0,
1560
+ description: "Controlled active step id.",
1561
+ example: "currentStep={step}"
1562
+ },
1563
+ {
1564
+ name: "onStepChange",
1565
+ type: "(stepId: string) => void",
1566
+ defaultValue: "-",
1567
+ description: "Called when a clickable step is selected.",
1568
+ example: "onStepChange={setStep}"
1569
+ },
1570
+ {
1571
+ name: "onNext",
1572
+ type: "() => void",
1573
+ defaultValue: "-",
1574
+ description: "Called by the primary next action before the final step."
1575
+ },
1576
+ {
1577
+ name: "onPrevious",
1578
+ type: "() => void",
1579
+ defaultValue: "-",
1580
+ description: "Called by the previous action when the user can go back."
1581
+ },
1582
+ {
1583
+ name: "onFinish",
1584
+ type: "() => void",
1585
+ defaultValue: "-",
1586
+ description: "Called by the final submit action on the last step."
1587
+ },
1588
+ {
1589
+ name: "nextLabel",
1590
+ type: "ReactNode",
1591
+ defaultValue: "'Next'",
1592
+ description: "Label for the forward action."
1593
+ },
1594
+ {
1595
+ name: "previousLabel",
1596
+ type: "ReactNode",
1597
+ defaultValue: "'Back'",
1598
+ description: "Label for the backward action."
1599
+ },
1600
+ {
1601
+ name: "finishLabel",
1602
+ type: "ReactNode",
1603
+ defaultValue: "'Finish'",
1604
+ description: "Label for the final action."
1605
+ },
1606
+ {
1607
+ name: "footer",
1608
+ type: "ReactNode",
1609
+ defaultValue: "-",
1610
+ description: "Optional custom footer when the default Back/Next/Finish row is not enough."
1611
+ },
1612
+ {
1613
+ name: "children",
1614
+ type: "ReactNode",
1615
+ defaultValue: "-",
1616
+ description: "Current step content rendered between the stepper and footer."
1617
+ },
1618
+ {
1619
+ name: "className",
1620
+ type: "string",
1621
+ defaultValue: "-",
1622
+ description: "Optional class override for local spacing and layout composition."
1623
+ }
1624
+ ],
1625
+ examples: [
1626
+ {
1627
+ title: "Controlled wizard",
1628
+ code: "<Wizard steps={steps} currentStep={step} onStepChange={setStep} onNext={goNext} onPrevious={goBack} onFinish={submit}>...</Wizard>"
1629
+ },
1630
+ {
1631
+ title: "Validation-gated step",
1632
+ code: "<Wizard steps={steps.map((item) => ({ ...item, disabled: item.id === 'finish' && !isValid }))} currentStep={step} />"
1633
+ },
1634
+ {
1635
+ title: "Custom action labels",
1636
+ code: "<Wizard nextLabel=\"Continue setup\" previousLabel=\"Edit previous\" finishLabel=\"Publish\" />"
1637
+ }
1638
+ ],
1639
+ accessibility: [
1640
+ "Keep step titles short and descriptive.",
1641
+ "Disable future steps when validation has not passed.",
1642
+ "Move focus to the new step content after step changes in long forms.",
1643
+ "Keep final submit copy specific to the workflow."
1644
+ ]
1645
+ },
1646
+ stepper: {
1647
+ slug: "stepper",
1648
+ source: "metadata",
1649
+ summary: "Progress navigation for multi-step forms and setup flows. Use it when the workflow needs visible step context without taking over the page content.",
1650
+ props: [
1651
+ {
1652
+ name: "steps",
1653
+ type: "Array<{ id: string; title: ReactNode; description?: ReactNode; disabled?: boolean; completed?: boolean }>",
1654
+ defaultValue: "[]",
1655
+ required: !0,
1656
+ description: "Ordered step list rendered as the progress navigation."
1657
+ },
1658
+ {
1659
+ name: "currentStep",
1660
+ type: "string",
1661
+ defaultValue: "-",
1662
+ required: !0,
1663
+ description: "Controlled active step id."
1664
+ },
1665
+ {
1666
+ name: "onStepChange",
1667
+ type: "(stepId: string) => void",
1668
+ defaultValue: "-",
1669
+ description: "Called when an enabled step is selected."
1670
+ },
1671
+ {
1672
+ name: "orientation",
1673
+ type: "'horizontal' | 'vertical'",
1674
+ defaultValue: "'horizontal'",
1675
+ description: "Controls whether steps render in a row or stacked column."
1676
+ },
1677
+ {
1678
+ name: "size",
1679
+ type: "'sm' | 'default' | 'lg'",
1680
+ defaultValue: "'default'",
1681
+ description: "Controls indicator and label density."
1682
+ },
1683
+ {
1684
+ name: "showDescriptions",
1685
+ type: "boolean",
1686
+ defaultValue: "true",
1687
+ description: "Shows or hides supporting step descriptions."
1688
+ },
1689
+ {
1690
+ name: "className",
1691
+ type: "string",
1692
+ defaultValue: "-",
1693
+ description: "Optional class override for local layout composition."
1694
+ }
1695
+ ],
1696
+ examples: [
1697
+ {
1698
+ title: "Horizontal setup stepper",
1699
+ code: "<Stepper steps={steps} currentStep={step} onStepChange={setStep} />"
1700
+ },
1701
+ {
1702
+ title: "Vertical review stepper",
1703
+ code: "<Stepper orientation=\"vertical\" steps={steps} currentStep={step} />"
1704
+ },
1705
+ {
1706
+ title: "Compact labels",
1707
+ code: "<Stepper size=\"sm\" showDescriptions={false} steps={steps} currentStep={step} />"
1708
+ }
1709
+ ],
1710
+ accessibility: [
1711
+ "Use disabled steps when users cannot jump ahead.",
1712
+ "Keep active and completed states visually distinct.",
1713
+ "Do not rely on color alone to communicate progress."
1714
+ ]
897
1715
  }
898
1716
  };
899
- function t(t) {
900
- return e[t];
1717
+ function t(e) {
1718
+ return e.split("-").filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
1719
+ }
1720
+ function n(e) {
1721
+ let n = t(e);
1722
+ return {
1723
+ slug: e,
1724
+ source: "manual-fallback",
1725
+ summary: `${n} is documented as a source-copy surface. Start with the default example, keep the public props small, then customize the local source only where the product needs it.`,
1726
+ props: [
1727
+ {
1728
+ name: "className",
1729
+ type: "string",
1730
+ defaultValue: "-",
1731
+ description: "Optional class override for layout, spacing or local product styling."
1732
+ },
1733
+ {
1734
+ name: "children",
1735
+ type: "ReactNode",
1736
+ defaultValue: "-",
1737
+ description: "Optional composed content, label or slot content when the component supports composition."
1738
+ },
1739
+ {
1740
+ name: "aria-label",
1741
+ type: "string",
1742
+ defaultValue: "-",
1743
+ description: "Accessible label for icon-only, compact or non-text usage.",
1744
+ notes: "Use when visible text does not fully describe the action or content."
1745
+ }
1746
+ ],
1747
+ examples: [{
1748
+ title: `${n} default`,
1749
+ code: `<${n.replaceAll(" ", "")} className="w-full" />`
1750
+ }],
1751
+ accessibility: [
1752
+ "Keep visible focus states when the surface is interactive.",
1753
+ "Provide readable labels for icon-only or compact controls.",
1754
+ "Preserve semantic structure when customizing copied source."
1755
+ ]
1756
+ };
1757
+ }
1758
+ function r(t) {
1759
+ return e[t] ?? n(t);
901
1760
  }
902
1761
  //#endregion
903
- export { e as componentApiSchemas, t as getComponentApiSchema };
1762
+ export { e as componentApiSchemas, r as getComponentApiSchema };