@box/blueprint-web 14.14.0 → 14.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.
Files changed (26) hide show
  1. package/dist/lib-esm/index.css +296 -0
  2. package/dist/lib-esm/index.d.ts +1 -0
  3. package/dist/lib-esm/index.js +1 -0
  4. package/dist/lib-esm/primitives/menu-combobox/index.d.ts +27 -0
  5. package/dist/lib-esm/primitives/menu-combobox/index.js +21 -0
  6. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-content.d.ts +3 -0
  7. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-content.js +61 -0
  8. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-context.d.ts +8 -0
  9. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-context.js +13 -0
  10. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-empty.d.ts +3 -0
  11. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-empty.js +27 -0
  12. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-header.d.ts +18 -0
  13. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-header.js +80 -0
  14. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-item.d.ts +3 -0
  15. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-item.js +31 -0
  16. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-list.d.ts +3 -0
  17. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-list.js +23 -0
  18. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-root.d.ts +6 -0
  19. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-root.js +51 -0
  20. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-search.d.ts +3 -0
  21. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-search.js +44 -0
  22. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-trigger.d.ts +3 -0
  23. package/dist/lib-esm/primitives/menu-combobox/menu-combobox-trigger.js +28 -0
  24. package/dist/lib-esm/primitives/menu-combobox/menu-combobox.module.js +4 -0
  25. package/dist/lib-esm/primitives/menu-combobox/types.d.ts +36 -0
  26. package/package.json +3 -3
@@ -9813,6 +9813,302 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
9813
9813
  text-overflow:ellipsis;
9814
9814
  white-space:nowrap;
9815
9815
  }
9816
+ .bp_menu_combobox_module_content--6ad69[data-modern=false]{
9817
+ --menu-combobox-header-gap:var(--space-2);
9818
+ --menu-combobox-header-padding:var(--space-3);
9819
+ --menu-combobox-header-shadow:var(--dropshadow-1);
9820
+ --menu-combobox-radius:var(--radius-3);
9821
+ --menu-combobox-padding:var(--space-4);
9822
+ --menu-combobox-text-color:var(--text-text-on-light);
9823
+ --menu-combobox-background:var(--surface-menu-surface);
9824
+ --menu-combobox-border:var(--border-1) solid var(--border-card-border);
9825
+ --menu-combobox-shadow:var(--dropshadow-3);
9826
+ --menu-combobox-backdrop-filter:none;
9827
+ --menu-combobox-item-background-hover:var(--surface-menu-surface-hover);
9828
+ --menu-combobox-item-background-focus:var(--surface-menu-surface-hover);
9829
+ --menu-combobox-item-border-focus:var(--border-2) solid var(--outline-focus-on-light);
9830
+ --menu-combobox-item-border-hover:var(--border-2) solid #0000;
9831
+ --menu-combobox-item-border-active:var(--border-2) solid #0000;
9832
+ --menu-combobox-item-background-active:var(--surface-menu-surface-hover);
9833
+ --menu-combobox-item-padding:var(--space-2);
9834
+ --menu-combobox-item-border-width:var(--border-2);
9835
+ --menu-combobox-item-border:var(--border-2) solid #0000;
9836
+ --menu-combobox-item-radius:var(--radius-3);
9837
+ --menu-combobox-item-gap:var(--space-4);
9838
+ --menu-combobox-item-min-height:var(--size-9);
9839
+ --menu-combobox-search-default-padding:var(--space-2);
9840
+ --menu-combobox-search-height:var(--size-10);
9841
+ --menu-combobox-search-with-start-icon-padding:var(--space-8);
9842
+ --menu-combobox-search-padding-inline-start-focused:calc(var(--space-8) - var(--border-1));
9843
+ --menu-combobox-search-background:var(--surface-search-surface);
9844
+ --menu-combobox-search-background-hover:var(--surface-search-surface-hover);
9845
+ --menu-combobox-search-background-focus:var(--surface-search-surface-focused);
9846
+ --menu-combobox-search-border-width:var(--border-1);
9847
+ --menu-combobox-search-border-width-focus:var(--border-2);
9848
+ --menu-combobox-search-border:var(--border-search-border);
9849
+ --menu-combobox-search-border-hover:var(--border-search-border-hover);
9850
+ --menu-combobox-search-focus-outline:var(--outline-focus-on-light);
9851
+ --menu-combobox-search-radius:var(--radius-2);
9852
+ --menu-combobox-search-color:var(--text-text-on-light);
9853
+ --menu-combobox-search-placeholder-color:var(--text-text-on-light-secondary);
9854
+ --menu-combobox-search-icon-size:var(--size-4);
9855
+ --menu-combobox-search-icon-color:var(--icon-icon-on-light-secondary);
9856
+ --menu-combobox-empty-color:var(--text-text-on-light-secondary);
9857
+ --menu-combobox-list-gap:var(--space-1);
9858
+ --menu-combobox-separator-margin:var(--space-2);
9859
+ font-family:var(--body-default-font-family);
9860
+ font-size:var(--body-default-font-size);
9861
+ font-weight:var(--body-default-font-weight);
9862
+ letter-spacing:var(--body-default-letter-spacing);
9863
+ line-height:var(--body-default-line-height);
9864
+ text-decoration:var(--body-default-text-decoration);
9865
+ text-transform:var(--body-default-text-case);
9866
+ }
9867
+
9868
+ .bp_menu_combobox_module_content--6ad69[data-modern=true]{
9869
+ --menu-combobox-header-gap:var(--bp-space-020);
9870
+ --menu-combobox-header-padding:var(--bp-space-030);
9871
+ --menu-combobox-header-shadow:var(--dropshadow-1);
9872
+ --menu-combobox-radius:var(--bp-radius-10);
9873
+ --menu-combobox-padding:var(--bp-space-040);
9874
+ --menu-combobox-text-color:var(--bp-text-text-on-light);
9875
+ --menu-combobox-background:var(--bp-surface-menu-surface-dropdown);
9876
+ --menu-combobox-border:var(--bp-border-01) solid var(--bp-border-menu-border);
9877
+ --menu-combobox-shadow:var(--dropshadow-2);
9878
+ --menu-combobox-backdrop-filter:blur(16px);
9879
+ --menu-combobox-item-background-hover:var(--bp-surface-menu-item-surface-hover);
9880
+ --menu-combobox-item-background-focus:var(--bp-surface-menu-item-surface-hover);
9881
+ --menu-combobox-item-border-focus:var(--bp-border-02) solid var(--bp-outline-focus-on-light);
9882
+ --menu-combobox-item-border-hover:var(--bp-border-02) solid #0000;
9883
+ --menu-combobox-item-border-active:var(--bp-border-02) solid #0000;
9884
+ --menu-combobox-item-background-active:var(--bp-surface-menu-item-surface-hover);
9885
+ --menu-combobox-item-padding:var(--bp-space-020);
9886
+ --menu-combobox-item-border-width:var(--bp-border-02);
9887
+ --menu-combobox-item-border:var(--bp-border-02) solid #0000;
9888
+ --menu-combobox-item-radius:var(--bp-radius-06);
9889
+ --menu-combobox-item-gap:var(--bp-space-040);
9890
+ --menu-combobox-item-min-height:var(--bp-size-090);
9891
+ --menu-combobox-search-default-padding:var(--bp-space-030);
9892
+ --menu-combobox-search-height:var(--bp-size-100);
9893
+ --menu-combobox-search-with-start-icon-padding:calc(var(--menu-combobox-search-default-padding) + var(--bp-space-040) + var(--bp-space-020));
9894
+ --menu-combobox-search-padding-inline-start-focused:calc(var(--menu-combobox-search-with-start-icon-padding) - var(--bp-border-01));
9895
+ --menu-combobox-search-background:var(--bp-surface-search-surface);
9896
+ --menu-combobox-search-background-hover:var(--bp-surface-search-surface-hover);
9897
+ --menu-combobox-search-background-focus:var(--bp-surface-search-surface-focused);
9898
+ --menu-combobox-search-border-width:var(--bp-border-01);
9899
+ --menu-combobox-search-border-width-focus:var(--bp-border-02);
9900
+ --menu-combobox-search-border:var(--bp-border-search-border);
9901
+ --menu-combobox-search-border-hover:var(--bp-border-search-border-hover);
9902
+ --menu-combobox-search-focus-outline:var(--bp-light-blue-100);
9903
+ --menu-combobox-search-radius:var(--bp-radius-10);
9904
+ --menu-combobox-search-color:var(--bp-text-text-on-light);
9905
+ --menu-combobox-search-placeholder-color:var(--bp-text-text-on-light-secondary);
9906
+ --menu-combobox-search-icon-size:var(--bp-size-040);
9907
+ --menu-combobox-search-icon-color:var(--bp-icon-icon-on-light-secondary);
9908
+ --menu-combobox-empty-color:var(--bp-text-text-on-light-secondary);
9909
+ --menu-combobox-list-gap:var(--bp-space-010);
9910
+ --menu-combobox-separator-margin:var(--bp-space-020);
9911
+ font-family:var(--bp-font-font-family), -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
9912
+ font-size:var(--bp-font-size-05);
9913
+ font-style:normal;
9914
+ font-weight:var(--bp-font-weight-regular);
9915
+ letter-spacing:var(--bp-font-letter-spacing-01);
9916
+ line-height:var(--bp-font-line-height-04);
9917
+ }
9918
+
9919
+ .bp_menu_combobox_module_content--6ad69{
9920
+ backdrop-filter:var(--menu-combobox-backdrop-filter);
9921
+ background-color:var(--menu-combobox-background);
9922
+ border:var(--menu-combobox-border);
9923
+ border-radius:var(--menu-combobox-radius);
9924
+ box-shadow:var(--menu-combobox-shadow);
9925
+ box-sizing:border-box;
9926
+ color:var(--menu-combobox-text-color);
9927
+ display:flex;
9928
+ flex-direction:column;
9929
+ max-height:min(var(--blueprint-web-menu-combobox-max-height, 25rem), var(--popover-available-height, 100vh));
9930
+ max-width:min(var(--blueprint-web-menu-combobox-content-max-width, 25rem), 90vw, var(--popover-available-width, 100vw));
9931
+ min-width:var(--blueprint-web-menu-combobox-content-min-width, 11.5rem);
9932
+ padding:var(--menu-combobox-padding);
9933
+ z-index:380;
9934
+ }
9935
+ .bp_menu_combobox_module_content--6ad69[data-menu-fullscreen=true]{
9936
+ border:none;
9937
+ border-radius:0;
9938
+ height:100%;
9939
+ max-height:none;
9940
+ max-width:none;
9941
+ min-width:0;
9942
+ overflow:hidden;
9943
+ pointer-events:auto;
9944
+ width:100%;
9945
+ }
9946
+
9947
+ .bp_menu_combobox_module_searchWrapper--6ad69{
9948
+ display:block;
9949
+ flex-shrink:0;
9950
+ position:relative;
9951
+ }
9952
+
9953
+ .bp_menu_combobox_module_searchIcon--6ad69{
9954
+ color:var(--menu-combobox-search-icon-color);
9955
+ height:var(--menu-combobox-search-icon-size);
9956
+ inset-inline-start:var(--menu-combobox-search-default-padding);
9957
+ pointer-events:none;
9958
+ position:absolute;
9959
+ top:50%;
9960
+ transform:translateY(-50%);
9961
+ width:var(--menu-combobox-search-icon-size);
9962
+ }
9963
+ .bp_menu_combobox_module_search--6ad69{
9964
+ -webkit-font-smoothing:auto;
9965
+ background-color:var(--menu-combobox-search-background);
9966
+ border:var(--menu-combobox-search-border-width) solid var(--menu-combobox-search-border);
9967
+ border-radius:var(--menu-combobox-search-radius);
9968
+ box-shadow:unset;
9969
+ box-sizing:border-box;
9970
+ color:var(--menu-combobox-search-color);
9971
+ font-family:var(--body-default-font-family);
9972
+ font-size:var(--body-default-font-size);
9973
+ font-weight:var(--body-default-font-weight);
9974
+ height:var(--menu-combobox-search-height);
9975
+ letter-spacing:var(--body-default-letter-spacing);
9976
+ line-height:var(--body-default-line-height);
9977
+ min-width:0;
9978
+ outline:0;
9979
+ padding-block:0;
9980
+ padding-inline:var(--menu-combobox-search-with-start-icon-padding) var(--menu-combobox-search-default-padding);
9981
+ text-decoration:var(--body-default-text-decoration);
9982
+ text-transform:var(--body-default-text-case);
9983
+ transition:border-color .15s ease,background-color .15s ease;
9984
+ width:100%;
9985
+ }
9986
+ .bp_menu_combobox_module_search--6ad69::placeholder{
9987
+ color:var(--menu-combobox-search-placeholder-color);
9988
+ }
9989
+ .bp_menu_combobox_module_search--6ad69:focus-visible{
9990
+ background-color:var(--menu-combobox-search-background-focus);
9991
+ border:var(--menu-combobox-search-border-width-focus) solid var(--menu-combobox-search-focus-outline);
9992
+ padding-inline:var(--menu-combobox-search-padding-inline-start-focused) calc(var(--menu-combobox-search-with-start-icon-padding) - var(--bp-border-01));
9993
+ }
9994
+ .bp_menu_combobox_module_search--6ad69:not(:focus-visible):hover{
9995
+ background-color:var(--menu-combobox-search-background-hover);
9996
+ border-color:var(--menu-combobox-search-border-hover);
9997
+ }
9998
+
9999
+ .bp_menu_combobox_module_searchModern--6ad69{
10000
+ font-family:var(--bp-font-font-family), -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
10001
+ font-size:var(--bp-font-size-05);
10002
+ font-style:normal;
10003
+ font-weight:var(--bp-font-weight-regular);
10004
+ letter-spacing:var(--bp-font-letter-spacing-01);
10005
+ line-height:var(--bp-font-line-height-04);
10006
+ }
10007
+
10008
+ .bp_menu_combobox_module_list--6ad69{
10009
+ display:flex;
10010
+ flex:1 1 auto;
10011
+ flex-direction:column;
10012
+ gap:var(--menu-combobox-list-gap);
10013
+ margin-block:var(--menu-combobox-separator-margin) calc(var(--menu-combobox-padding)*-1);
10014
+ margin-inline-end:calc(var(--menu-combobox-padding)*-1);
10015
+ min-height:0;
10016
+ overflow-y:auto;
10017
+ padding-block-end:var(--menu-combobox-padding);
10018
+ padding-inline-end:var(--menu-combobox-padding);
10019
+ }
10020
+
10021
+ .bp_menu_combobox_module_item--6ad69{
10022
+ align-items:center;
10023
+ border:var(--menu-combobox-item-border);
10024
+ border-radius:var(--menu-combobox-item-radius);
10025
+ box-sizing:border-box;
10026
+ cursor:pointer;
10027
+ display:flex;
10028
+ gap:var(--menu-combobox-item-gap);
10029
+ min-height:var(--menu-combobox-item-min-height);
10030
+ min-width:0;
10031
+ outline:none;
10032
+ overflow:hidden;
10033
+ padding:calc(var(--menu-combobox-item-padding) - var(--menu-combobox-item-border-width));
10034
+ position:relative;
10035
+ -webkit-user-select:none;
10036
+ user-select:none;
10037
+ }
10038
+ .bp_menu_combobox_module_item--6ad69[data-active-item]{
10039
+ background-color:var(--menu-combobox-item-background-focus);
10040
+ border:var(--menu-combobox-item-border-focus);
10041
+ }
10042
+ .bp_menu_combobox_module_item--6ad69:hover{
10043
+ background-color:var(--menu-combobox-item-background-hover);
10044
+ border:var(--menu-combobox-item-border-hover);
10045
+ }
10046
+ .bp_menu_combobox_module_item--6ad69:active{
10047
+ background-color:var(--menu-combobox-item-background-active);
10048
+ border:var(--menu-combobox-item-border-active);
10049
+ }
10050
+ .bp_menu_combobox_module_item--6ad69[aria-disabled=true]{
10051
+ opacity:60%;
10052
+ pointer-events:none;
10053
+ }
10054
+ .bp_menu_combobox_module_itemLabel--6ad69{
10055
+ flex:1 1 0;
10056
+ min-width:0;
10057
+ overflow:hidden;
10058
+ text-overflow:ellipsis;
10059
+ white-space:nowrap;
10060
+ }
10061
+
10062
+ .bp_menu_combobox_module_empty--6ad69{
10063
+ color:var(--menu-combobox-empty-color);
10064
+ font-family:var(--body-default-font-family);
10065
+ font-size:var(--body-default-font-size);
10066
+ font-weight:var(--body-default-font-weight);
10067
+ letter-spacing:var(--body-default-letter-spacing);
10068
+ line-height:var(--body-default-line-height);
10069
+ padding:var(--menu-combobox-item-padding);
10070
+ text-align:center;
10071
+ text-decoration:var(--body-default-text-decoration);
10072
+ text-transform:var(--body-default-text-case);
10073
+ }
10074
+
10075
+ .bp_menu_combobox_module_emptyModern--6ad69{
10076
+ font-family:var(--bp-font-font-family), -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
10077
+ font-size:var(--bp-font-size-05);
10078
+ font-style:normal;
10079
+ font-weight:var(--bp-font-weight-regular);
10080
+ letter-spacing:var(--bp-font-letter-spacing-01);
10081
+ line-height:var(--bp-font-line-height-04);
10082
+ }
10083
+
10084
+ .bp_menu_combobox_module_menuHeader--6ad69{
10085
+ align-items:center;
10086
+ box-shadow:var(--menu-combobox-header-shadow);
10087
+ display:grid;
10088
+ flex-shrink:0;
10089
+ gap:var(--menu-combobox-header-gap);
10090
+ grid-template-areas:"content close";
10091
+ grid-template-columns:minmax(0, 1fr) auto;
10092
+ margin:calc(var(--menu-combobox-padding)*-1);
10093
+ margin-block-end:var(--menu-combobox-padding);
10094
+ padding:var(--menu-combobox-header-padding);
10095
+ }
10096
+
10097
+ .bp_menu_combobox_module_headerTextContent--6ad69{
10098
+ display:grid;
10099
+ grid-area:content;
10100
+ }
10101
+
10102
+ .bp_menu_combobox_module_headerEllipsis--6ad69{
10103
+ min-width:0;
10104
+ overflow:hidden;
10105
+ text-overflow:ellipsis;
10106
+ white-space:nowrap;
10107
+ }
10108
+
10109
+ .bp_menu_combobox_module_menuCloseButton--6ad69{
10110
+ grid-area:close;
10111
+ }
9816
10112
  .bp_notification_module_viewport--26924{
9817
10113
  --notification-viewport-space:var(--space-4);
9818
10114
  --notification-viewport-item-spacing:var(--space-3);
@@ -51,6 +51,7 @@ export * from './primitives/dropdown-menu';
51
51
  export * from './primitives/icon-button';
52
52
  export * from './primitives/inline-error/inline-error';
53
53
  export * from './primitives/link';
54
+ export * from './primitives/menu-combobox';
54
55
  export * from './primitives/notification';
55
56
  export * from './primitives/page-header';
56
57
  export * from './primitives/popover';
@@ -69,6 +69,7 @@ export { DropdownMenu } from './primitives/dropdown-menu/index.js';
69
69
  export { IconButton } from './primitives/icon-button/icon-button.js';
70
70
  export { InlineError } from './primitives/inline-error/inline-error.js';
71
71
  export { Link } from './primitives/link/link.js';
72
+ export { MenuCombobox } from './primitives/menu-combobox/index.js';
72
73
  export { Notification } from './primitives/notification/index.js';
73
74
  export { PageHeader } from './primitives/page-header/page-header.js';
74
75
  export { Popover } from './primitives/popover/index.js';
@@ -0,0 +1,27 @@
1
+ export declare const MenuCombobox: {
2
+ Root: {
3
+ (props: import("./types").MenuComboboxRootProps): import("react/jsx-runtime").JSX.Element;
4
+ displayName: string;
5
+ };
6
+ Trigger: import("react").ForwardRefExoticComponent<Omit<import("./types").MenuComboboxTriggerProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
7
+ Content: import("react").ForwardRefExoticComponent<Omit<import("./types").MenuComboboxContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
8
+ Header: (({ children, className, ...rest }: import("react").HTMLAttributes<HTMLDivElement>) => import("react/jsx-runtime").JSX.Element) & {
9
+ MenuCloseButton: import("react").ForwardRefExoticComponent<Omit<import("./menu-combobox-header").MenuComboboxHeaderMenuCloseButtonProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
10
+ TextContent: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
11
+ subtitle?: string;
12
+ title: string;
13
+ } & import("react").RefAttributes<HTMLDivElement>>;
14
+ };
15
+ Search: import("react").ForwardRefExoticComponent<Omit<import("./types").MenuComboboxSearchProps, "ref"> & import("react").RefAttributes<HTMLInputElement>>;
16
+ List: import("react").ForwardRefExoticComponent<Omit<import("./types").MenuComboboxListProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
17
+ Item: import("react").ForwardRefExoticComponent<Omit<import("./types").MenuComboboxItemProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
18
+ Empty: import("react").ForwardRefExoticComponent<Omit<import("./types").MenuComboboxEmptyProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
19
+ };
20
+ export type { MenuComboboxHeaderMenuCloseButtonProps, MenuComboboxHeaderTextContentProps, } from './menu-combobox-header';
21
+ export type { MenuComboboxContentProps } from './types';
22
+ export type { MenuComboboxEmptyProps } from './types';
23
+ export type { MenuComboboxItemProps } from './types';
24
+ export type { MenuComboboxListProps } from './types';
25
+ export type { MenuComboboxRootProps } from './types';
26
+ export type { MenuComboboxSearchProps } from './types';
27
+ export type { MenuComboboxTriggerProps } from './types';
@@ -0,0 +1,21 @@
1
+ import { MenuComboboxContent } from './menu-combobox-content.js';
2
+ import { MenuComboboxEmpty } from './menu-combobox-empty.js';
3
+ import { MenuComboboxHeader } from './menu-combobox-header.js';
4
+ import { MenuComboboxItem } from './menu-combobox-item.js';
5
+ import { MenuComboboxList } from './menu-combobox-list.js';
6
+ import { MenuComboboxRoot } from './menu-combobox-root.js';
7
+ import { MenuComboboxSearch } from './menu-combobox-search.js';
8
+ import { MenuComboboxTrigger } from './menu-combobox-trigger.js';
9
+
10
+ const MenuCombobox = {
11
+ Root: MenuComboboxRoot,
12
+ Trigger: MenuComboboxTrigger,
13
+ Content: MenuComboboxContent,
14
+ Header: MenuComboboxHeader,
15
+ Search: MenuComboboxSearch,
16
+ List: MenuComboboxList,
17
+ Item: MenuComboboxItem,
18
+ Empty: MenuComboboxEmpty
19
+ };
20
+
21
+ export { MenuCombobox };
@@ -0,0 +1,3 @@
1
+ import { type MenuComboboxContentProps } from './types';
2
+ /** Menu panel that contains the search input and items. */
3
+ export declare const MenuComboboxContent: import("react").ForwardRefExoticComponent<Omit<MenuComboboxContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,61 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Space2 } from '@box/blueprint-web-assets/tokens/px-tokens';
3
+ import { Menu } from '@ariakit/react';
4
+ import clsx from 'clsx';
5
+ import { forwardRef, useMemo } from 'react';
6
+ import { useBlueprintModernization } from '../../blueprint-modernization-context/useBlueprintModernization.js';
7
+ import { useMenuComboboxContext } from './menu-combobox-context.js';
8
+ import styles from './menu-combobox.module.js';
9
+
10
+ const GUTTER = parseInt(Space2, 10);
11
+ /* Force-fill the viewport when fullscreen; `pointerEvents: 'none'` lets clicks reach the
12
+ * trigger while closed, the inner content re-enables them via SCSS. */
13
+ const FULLSCREEN_WRAPPER_STYLE = {
14
+ position: 'fixed',
15
+ top: 0,
16
+ left: 0,
17
+ right: 0,
18
+ bottom: 0,
19
+ width: '100vw',
20
+ height: '100dvh',
21
+ transform: 'none',
22
+ pointerEvents: 'none'
23
+ };
24
+ const noopUpdatePosition = () => {
25
+ /* Skip Ariakit positioning when fullscreen so it doesn't override the wrapper style. */
26
+ };
27
+ /** Menu panel that contains the search input and items. */
28
+ const MenuComboboxContent = /*#__PURE__*/forwardRef((props, forwardedRef) => {
29
+ const {
30
+ children,
31
+ className,
32
+ portalElement,
33
+ ...rest
34
+ } = props;
35
+ const {
36
+ isFullScreenEnabled
37
+ } = useMenuComboboxContext();
38
+ const {
39
+ enableModernizedComponents
40
+ } = useBlueprintModernization();
41
+ const gutter = isFullScreenEnabled ? 0 : GUTTER;
42
+ const wrapperProps = useMemo(() => isFullScreenEnabled ? {
43
+ style: FULLSCREEN_WRAPPER_STYLE
44
+ } : undefined, [isFullScreenEnabled]);
45
+ return jsx(Menu, {
46
+ ref: forwardedRef,
47
+ portal: true,
48
+ portalElement: portalElement,
49
+ gutter: gutter,
50
+ wrapperProps: wrapperProps,
51
+ updatePosition: isFullScreenEnabled ? noopUpdatePosition : undefined,
52
+ ...rest,
53
+ className: clsx(styles.content, className),
54
+ "data-menu-fullscreen": isFullScreenEnabled ? 'true' : 'false',
55
+ "data-modern": enableModernizedComponents ? 'true' : 'false',
56
+ children: children
57
+ });
58
+ });
59
+ MenuComboboxContent.displayName = 'MenuComboboxContent';
60
+
61
+ export { MenuComboboxContent };
@@ -0,0 +1,8 @@
1
+ export type MenuComboboxContextValue = {
2
+ searchPlaceholder: string | undefined;
3
+ isFullScreenEnabled: boolean;
4
+ /** Imperatively close the menu. */
5
+ setOpen: (open: boolean) => void;
6
+ };
7
+ export declare const MenuComboboxContext: import("react").Context<MenuComboboxContextValue>;
8
+ export declare const useMenuComboboxContext: () => MenuComboboxContextValue;
@@ -0,0 +1,13 @@
1
+ import { useContext, createContext } from 'react';
2
+
3
+ const defaultValue = {
4
+ searchPlaceholder: undefined,
5
+ isFullScreenEnabled: false,
6
+ setOpen: () => {
7
+ /* no-op outside of a MenuCombobox.Root */
8
+ }
9
+ };
10
+ const MenuComboboxContext = /*#__PURE__*/createContext(defaultValue);
11
+ const useMenuComboboxContext = () => useContext(MenuComboboxContext);
12
+
13
+ export { MenuComboboxContext, useMenuComboboxContext };
@@ -0,0 +1,3 @@
1
+ import { type MenuComboboxEmptyProps } from './types';
2
+ /** Shown when the filtered list has no matches. */
3
+ export declare const MenuComboboxEmpty: import("react").ForwardRefExoticComponent<Omit<MenuComboboxEmptyProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,27 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import clsx from 'clsx';
3
+ import { forwardRef } from 'react';
4
+ import { useBlueprintModernization } from '../../blueprint-modernization-context/useBlueprintModernization.js';
5
+ import styles from './menu-combobox.module.js';
6
+
7
+ /** Shown when the filtered list has no matches. */
8
+ const MenuComboboxEmpty = /*#__PURE__*/forwardRef((props, forwardedRef) => {
9
+ const {
10
+ children,
11
+ className,
12
+ ...rest
13
+ } = props;
14
+ const {
15
+ enableModernizedComponents
16
+ } = useBlueprintModernization();
17
+ return jsx("div", {
18
+ ref: forwardedRef,
19
+ role: "status",
20
+ ...rest,
21
+ className: clsx(styles.empty, enableModernizedComponents && styles.emptyModern, className),
22
+ children: children
23
+ });
24
+ });
25
+ MenuComboboxEmpty.displayName = 'MenuComboboxEmpty';
26
+
27
+ export { MenuComboboxEmpty };
@@ -0,0 +1,18 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import { type IconButtonProps } from '../icon-button';
3
+ export type MenuComboboxHeaderMenuCloseButtonProps = Omit<IconButtonProps, 'icon' | 'variant' | 'size'>;
4
+ export type MenuComboboxHeaderTextContentProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
5
+ /** Secondary line below the title. */
6
+ subtitle?: string;
7
+ /** Primary line. */
8
+ title: string;
9
+ };
10
+ export declare const MenuComboboxHeader: (({ children, className, ...rest }: HTMLAttributes<HTMLDivElement>) => import("react/jsx-runtime").JSX.Element) & {
11
+ MenuCloseButton: import("react").ForwardRefExoticComponent<Omit<MenuComboboxHeaderMenuCloseButtonProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
12
+ TextContent: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
13
+ /** Secondary line below the title. */
14
+ subtitle?: string;
15
+ /** Primary line. */
16
+ title: string;
17
+ } & import("react").RefAttributes<HTMLDivElement>>;
18
+ };
@@ -0,0 +1,80 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { XMark as XMark$1 } from '@box/blueprint-web-assets/icons/Fill';
3
+ import { XMark } from '@box/blueprint-web-assets/icons/Medium';
4
+ import clsx from 'clsx';
5
+ import { forwardRef, useCallback } from 'react';
6
+ import { useBlueprintModernization } from '../../blueprint-modernization-context/useBlueprintModernization.js';
7
+ import { IconButton } from '../icon-button/icon-button.js';
8
+ import { Text } from '../../text/text.js';
9
+ import { composeEventHandlers } from '../../utils/composeEventHandlers.js';
10
+ import { useMenuComboboxContext } from './menu-combobox-context.js';
11
+ import styles from './menu-combobox.module.js';
12
+
13
+ const MenuCloseButton = /*#__PURE__*/forwardRef(({
14
+ onClick,
15
+ className,
16
+ ...rest
17
+ }, ref) => {
18
+ const {
19
+ setOpen
20
+ } = useMenuComboboxContext();
21
+ const {
22
+ enableModernizedComponents
23
+ } = useBlueprintModernization();
24
+ const handleCloseClick = useCallback(() => {
25
+ setOpen(false);
26
+ }, [setOpen]);
27
+ const CloseIcon = enableModernizedComponents ? XMark : XMark$1;
28
+ return jsx(IconButton, {
29
+ ref: ref,
30
+ ...rest,
31
+ className: clsx(styles.menuCloseButton, className),
32
+ icon: CloseIcon,
33
+ onClick: composeEventHandlers(handleCloseClick, onClick),
34
+ variant: "small-utility"
35
+ });
36
+ });
37
+ MenuCloseButton.displayName = 'MenuComboboxHeaderMenuCloseButton';
38
+ const TextContent = /*#__PURE__*/forwardRef(({
39
+ title,
40
+ subtitle,
41
+ className,
42
+ ...rest
43
+ }, ref) => {
44
+ return jsxs("div", {
45
+ ref: ref,
46
+ ...rest,
47
+ className: clsx(styles.headerTextContent, className),
48
+ children: [jsx(Text, {
49
+ as: "span",
50
+ className: styles.headerEllipsis,
51
+ variant: "bodyLargeBold",
52
+ children: title
53
+ }), subtitle && jsx(Text, {
54
+ as: "span",
55
+ className: styles.headerEllipsis,
56
+ color: "textOnLightSecondary",
57
+ variant: "caption",
58
+ children: subtitle
59
+ })]
60
+ });
61
+ });
62
+ TextContent.displayName = 'MenuComboboxHeaderTextContent';
63
+ const MenuComboboxHeaderPrimitive = ({
64
+ children,
65
+ className,
66
+ ...rest
67
+ }) => {
68
+ return jsx("div", {
69
+ ...rest,
70
+ className: clsx(styles.menuHeader, className),
71
+ role: "presentation",
72
+ children: children
73
+ });
74
+ };
75
+ const MenuComboboxHeader = Object.assign(MenuComboboxHeaderPrimitive, {
76
+ MenuCloseButton,
77
+ TextContent
78
+ });
79
+
80
+ export { MenuComboboxHeader };
@@ -0,0 +1,3 @@
1
+ import { type MenuComboboxItemProps } from './types';
2
+ /** A filterable menu item. */
3
+ export declare const MenuComboboxItem: import("react").ForwardRefExoticComponent<Omit<MenuComboboxItemProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,31 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ComboboxItem } from '@ariakit/react';
3
+ import clsx from 'clsx';
4
+ import { forwardRef } from 'react';
5
+ import { Text } from '../../text/text.js';
6
+ import styles from './menu-combobox.module.js';
7
+
8
+ /** A filterable menu item. */
9
+ const MenuComboboxItem = /*#__PURE__*/forwardRef((props, forwardedRef) => {
10
+ const {
11
+ children,
12
+ className,
13
+ ...rest
14
+ } = props;
15
+ return jsx(ComboboxItem, {
16
+ ref: forwardedRef,
17
+ focusOnHover: true,
18
+ setValueOnClick: false,
19
+ ...rest,
20
+ className: clsx(styles.item, className),
21
+ children: jsx(Text, {
22
+ as: "span",
23
+ className: styles.itemLabel,
24
+ variant: "bodyDefault",
25
+ children: children
26
+ })
27
+ });
28
+ });
29
+ MenuComboboxItem.displayName = 'MenuComboboxItem';
30
+
31
+ export { MenuComboboxItem };
@@ -0,0 +1,3 @@
1
+ import { type MenuComboboxListProps } from './types';
2
+ /** Scrollable list of combobox items. */
3
+ export declare const MenuComboboxList: import("react").ForwardRefExoticComponent<Omit<MenuComboboxListProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,23 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ComboboxList } from '@ariakit/react';
3
+ import clsx from 'clsx';
4
+ import { forwardRef } from 'react';
5
+ import styles from './menu-combobox.module.js';
6
+
7
+ /** Scrollable list of combobox items. */
8
+ const MenuComboboxList = /*#__PURE__*/forwardRef((props, forwardedRef) => {
9
+ const {
10
+ children,
11
+ className,
12
+ ...rest
13
+ } = props;
14
+ return jsx(ComboboxList, {
15
+ ref: forwardedRef,
16
+ ...rest,
17
+ className: clsx(styles.list, className),
18
+ children: children
19
+ });
20
+ });
21
+ MenuComboboxList.displayName = 'MenuComboboxList';
22
+
23
+ export { MenuComboboxList };
@@ -0,0 +1,6 @@
1
+ import { type MenuComboboxRootProps } from './types';
2
+ /** Root provider that wires the combobox + menu state together. */
3
+ export declare const MenuComboboxRoot: {
4
+ (props: MenuComboboxRootProps): import("react/jsx-runtime").JSX.Element;
5
+ displayName: string;
6
+ };
@@ -0,0 +1,51 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ComboboxProvider, MenuProvider } from '@ariakit/react';
3
+ import { useState, useCallback, startTransition, useMemo } from 'react';
4
+ import { MenuComboboxContext } from './menu-combobox-context.js';
5
+
6
+ /** Root provider that wires the combobox + menu state together. */
7
+ const MenuComboboxRoot = props => {
8
+ const {
9
+ children,
10
+ open: controlledOpen,
11
+ onOpenChange,
12
+ defaultOpen = false,
13
+ onSearchValueChange,
14
+ searchPlaceholder,
15
+ isFullScreenEnabled = false
16
+ } = props;
17
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
18
+ const isControlled = controlledOpen !== undefined;
19
+ const isOpen = isControlled ? controlledOpen : uncontrolledOpen;
20
+ const handleSetOpen = useCallback(nextOpen => {
21
+ if (!isControlled) {
22
+ setUncontrolledOpen(nextOpen);
23
+ }
24
+ onOpenChange?.(nextOpen);
25
+ }, [isControlled, onOpenChange]);
26
+ const handleSetValue = useCallback(value => {
27
+ startTransition(() => {
28
+ onSearchValueChange?.(value);
29
+ });
30
+ }, [onSearchValueChange]);
31
+ const contextValue = useMemo(() => ({
32
+ searchPlaceholder,
33
+ isFullScreenEnabled,
34
+ setOpen: handleSetOpen
35
+ }), [searchPlaceholder, isFullScreenEnabled, handleSetOpen]);
36
+ return jsx(MenuComboboxContext.Provider, {
37
+ value: contextValue,
38
+ children: jsx(ComboboxProvider, {
39
+ resetValueOnHide: true,
40
+ setValue: handleSetValue,
41
+ children: jsx(MenuProvider, {
42
+ open: isOpen,
43
+ setOpen: handleSetOpen,
44
+ children: children
45
+ })
46
+ })
47
+ });
48
+ };
49
+ MenuComboboxRoot.displayName = 'MenuComboboxRoot';
50
+
51
+ export { MenuComboboxRoot };
@@ -0,0 +1,3 @@
1
+ import { type MenuComboboxSearchProps } from './types';
2
+ /** Filterable search input rendered inside the menu panel. */
3
+ export declare const MenuComboboxSearch: import("react").ForwardRefExoticComponent<Omit<MenuComboboxSearchProps, "ref"> & import("react").RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,44 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Combobox } from '@ariakit/react';
3
+ import { Search as Search$1 } from '@box/blueprint-web-assets/icons/Fill';
4
+ import { Search } from '@box/blueprint-web-assets/icons/Medium';
5
+ import clsx from 'clsx';
6
+ import { forwardRef } from 'react';
7
+ import { useBlueprintModernization } from '../../blueprint-modernization-context/useBlueprintModernization.js';
8
+ import { useMenuComboboxContext } from './menu-combobox-context.js';
9
+ import styles from './menu-combobox.module.js';
10
+
11
+ /** Filterable search input rendered inside the menu panel. */
12
+ const MenuComboboxSearch = /*#__PURE__*/forwardRef((props, forwardedRef) => {
13
+ const {
14
+ className,
15
+ placeholder,
16
+ 'aria-label': ariaLabel,
17
+ ...rest
18
+ } = props;
19
+ const {
20
+ searchPlaceholder: rootSearchPlaceholder
21
+ } = useMenuComboboxContext();
22
+ const {
23
+ enableModernizedComponents
24
+ } = useBlueprintModernization();
25
+ const SearchIcon = enableModernizedComponents ? Search : Search$1;
26
+ const resolvedPlaceholder = placeholder ?? rootSearchPlaceholder;
27
+ return jsxs("span", {
28
+ className: styles.searchWrapper,
29
+ children: [jsx(SearchIcon, {
30
+ "aria-hidden": "true",
31
+ className: styles.searchIcon
32
+ }), jsx(Combobox, {
33
+ ref: forwardedRef,
34
+ "aria-label": ariaLabel,
35
+ autoSelect: true,
36
+ ...rest,
37
+ className: clsx(styles.search, enableModernizedComponents && styles.searchModern, className),
38
+ placeholder: resolvedPlaceholder
39
+ })]
40
+ });
41
+ });
42
+ MenuComboboxSearch.displayName = 'MenuComboboxSearch';
43
+
44
+ export { MenuComboboxSearch };
@@ -0,0 +1,3 @@
1
+ import { type MenuComboboxTriggerProps } from './types';
2
+ /** Connects the menu disclosure to a single interactive child (asChild pattern). */
3
+ export declare const MenuComboboxTrigger: import("react").ForwardRefExoticComponent<Omit<MenuComboboxTriggerProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,28 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { MenuButton } from '@ariakit/react';
3
+ import { forwardRef, Children, isValidElement } from 'react';
4
+
5
+ /** Connects the menu disclosure to a single interactive child (asChild pattern). */
6
+ const MenuComboboxTrigger = /*#__PURE__*/forwardRef((props, forwardedRef) => {
7
+ const {
8
+ children,
9
+ render: renderProp,
10
+ ...rest
11
+ } = props;
12
+ const elements = Children.toArray(children).filter(isValidElement);
13
+ if (process.env.NODE_ENV !== 'production' && !renderProp && elements.length !== 1) {
14
+ // eslint-disable-next-line no-console
15
+ console.warn('MenuCombobox.Trigger expects a single element child so disclosure props can be merged into it. ' + `Received ${elements.length} element(s).`);
16
+ }
17
+ const renderFromChild = elements.length === 1 ? elements[0] : undefined;
18
+ const render = renderProp ?? renderFromChild;
19
+ return jsx(MenuButton, {
20
+ ref: forwardedRef,
21
+ ...rest,
22
+ render: render,
23
+ children: renderFromChild ? undefined : children
24
+ });
25
+ });
26
+ MenuComboboxTrigger.displayName = 'MenuComboboxTrigger';
27
+
28
+ export { MenuComboboxTrigger };
@@ -0,0 +1,4 @@
1
+ import '../../index.css';
2
+ var styles = {"content":"bp_menu_combobox_module_content--6ad69","searchWrapper":"bp_menu_combobox_module_searchWrapper--6ad69","searchIcon":"bp_menu_combobox_module_searchIcon--6ad69","search":"bp_menu_combobox_module_search--6ad69","searchModern":"bp_menu_combobox_module_searchModern--6ad69","list":"bp_menu_combobox_module_list--6ad69","item":"bp_menu_combobox_module_item--6ad69","itemLabel":"bp_menu_combobox_module_itemLabel--6ad69","empty":"bp_menu_combobox_module_empty--6ad69","emptyModern":"bp_menu_combobox_module_emptyModern--6ad69","menuHeader":"bp_menu_combobox_module_menuHeader--6ad69","headerTextContent":"bp_menu_combobox_module_headerTextContent--6ad69","headerEllipsis":"bp_menu_combobox_module_headerEllipsis--6ad69","menuCloseButton":"bp_menu_combobox_module_menuCloseButton--6ad69"};
3
+
4
+ export { styles as default };
@@ -0,0 +1,36 @@
1
+ import { type ComboboxItemProps as AriakitComboboxItemProps, type ComboboxListProps as AriakitComboboxListProps, type ComboboxProps as AriakitComboboxProps, type MenuButtonProps as AriakitMenuButtonProps, type MenuProps as AriakitMenuProps } from '@ariakit/react';
2
+ import { type ComponentProps, type ReactNode } from 'react';
3
+ export interface MenuComboboxRootProps {
4
+ children: ReactNode;
5
+ /** Controlled open state. Pair with `onOpenChange`. */
6
+ open?: boolean;
7
+ onOpenChange?: (open: boolean) => void;
8
+ /** @default false */
9
+ defaultOpen?: boolean;
10
+ /** Called as the search input value changes; use it to filter the rendered items. */
11
+ onSearchValueChange?: (value: string) => void;
12
+ /** Default placeholder for `MenuCombobox.Search`. */
13
+ searchPlaceholder?: string;
14
+ /** Render the panel as a full-screen mobile surface. @default false */
15
+ isFullScreenEnabled?: boolean;
16
+ }
17
+ export interface MenuComboboxTriggerProps extends Omit<AriakitMenuButtonProps, 'store'> {
18
+ /** A single interactive element to merge disclosure behavior into (asChild pattern). */
19
+ children: ReactNode;
20
+ }
21
+ export type MenuComboboxContentProps = Omit<AriakitMenuProps, 'store'>;
22
+ export interface MenuComboboxSearchProps extends Omit<AriakitComboboxProps, 'store'> {
23
+ /** Required, localized accessible name for the search input. */
24
+ 'aria-label': string;
25
+ /** Overrides `searchPlaceholder` from `MenuCombobox.Root`. */
26
+ placeholder?: string;
27
+ }
28
+ export interface MenuComboboxListProps extends Omit<AriakitComboboxListProps, 'store'> {
29
+ children: ReactNode;
30
+ }
31
+ export interface MenuComboboxItemProps extends Omit<AriakitComboboxItemProps, 'store'> {
32
+ children?: ReactNode;
33
+ }
34
+ export interface MenuComboboxEmptyProps extends ComponentProps<'div'> {
35
+ children: ReactNode;
36
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/blueprint-web",
3
- "version": "14.14.0",
3
+ "version": "14.15.0",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {
@@ -47,7 +47,7 @@
47
47
  "dependencies": {
48
48
  "@ariakit/react": "0.4.21",
49
49
  "@ariakit/react-core": "0.4.21",
50
- "@box/blueprint-web-assets": "^4.114.5",
50
+ "@box/blueprint-web-assets": "^4.114.6",
51
51
  "@internationalized/date": "^3.12.0",
52
52
  "@radix-ui/react-accordion": "1.1.2",
53
53
  "@radix-ui/react-checkbox": "1.0.4",
@@ -77,7 +77,7 @@
77
77
  "type-fest": "^3.2.0"
78
78
  },
79
79
  "devDependencies": {
80
- "@box/storybook-utils": "^0.17.47",
80
+ "@box/storybook-utils": "^0.17.48",
81
81
  "@figma/code-connect": "1.4.4",
82
82
  "@types/react": "^18.0.0",
83
83
  "@types/react-dom": "^18.0.0",