@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.
- package/dist/lib-esm/index.css +296 -0
- package/dist/lib-esm/index.d.ts +1 -0
- package/dist/lib-esm/index.js +1 -0
- package/dist/lib-esm/primitives/menu-combobox/index.d.ts +27 -0
- package/dist/lib-esm/primitives/menu-combobox/index.js +21 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-content.d.ts +3 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-content.js +61 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-context.d.ts +8 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-context.js +13 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-empty.d.ts +3 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-empty.js +27 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-header.d.ts +18 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-header.js +80 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-item.d.ts +3 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-item.js +31 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-list.d.ts +3 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-list.js +23 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-root.d.ts +6 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-root.js +51 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-search.d.ts +3 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-search.js +44 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-trigger.d.ts +3 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox-trigger.js +28 -0
- package/dist/lib-esm/primitives/menu-combobox/menu-combobox.module.js +4 -0
- package/dist/lib-esm/primitives/menu-combobox/types.d.ts +36 -0
- package/package.json +3 -3
package/dist/lib-esm/index.css
CHANGED
|
@@ -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);
|
package/dist/lib-esm/index.d.ts
CHANGED
|
@@ -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';
|
package/dist/lib-esm/index.js
CHANGED
|
@@ -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,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,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,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.
|
|
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.
|
|
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.
|
|
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",
|