@box/blueprint-web 15.2.0 → 15.4.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.
@@ -38,7 +38,7 @@ export declare const BLUEPRINT_CONFIGURATION_SPLITS: {
38
38
  */
39
39
  export declare const ANIMATED_COMPONENTS_BY_PHASE: {
40
40
  readonly phase1: readonly ["Button", "IconButton", "DropdownMenu", "Tooltip", "Popover", "SplitButton", "CardTooltip", "NavigationMenu", "Modal", "TextButton", "ContextMenu"];
41
- readonly phase2: readonly ["DropdownTrigger", "Switch", "Checkbox", "TextInput", "Select", "Datepicker", "TextArea", "Combobox", "PasswordInput", "ComboboxGroup"];
41
+ readonly phase2: readonly ["DropdownTrigger", "Switch", "Checkbox", "TextInput", "Select", "Datepicker", "TextArea", "Combobox", "PasswordInput", "ComboboxGroup", "InlineError"];
42
42
  readonly phase3: readonly [];
43
43
  };
44
44
  /**
@@ -40,7 +40,7 @@ const BLUEPRINT_CONFIGURATION_SPLITS = deepFreeze({
40
40
  */
41
41
  const ANIMATED_COMPONENTS_BY_PHASE = deepFreeze({
42
42
  phase1: ['Button', 'IconButton', 'DropdownMenu', 'Tooltip', 'Popover', 'SplitButton', 'CardTooltip', 'NavigationMenu', 'Modal', 'TextButton', 'ContextMenu'],
43
- phase2: ['DropdownTrigger', 'Switch', 'Checkbox', 'TextInput', 'Select', 'Datepicker', 'TextArea', 'Combobox', 'PasswordInput', 'ComboboxGroup'],
43
+ phase2: ['DropdownTrigger', 'Switch', 'Checkbox', 'TextInput', 'Select', 'Datepicker', 'TextArea', 'Combobox', 'PasswordInput', 'ComboboxGroup', 'InlineError'],
44
44
  phase3: []
45
45
  });
46
46
  /**
@@ -4546,7 +4546,7 @@
4546
4546
  .bp_input_chip_module_container--8ac7b .bp_input_chip_module_avatar--8ac7b.bp_input_chip_module_modern--8ac7b *{
4547
4547
  border-radius:unset;
4548
4548
  }
4549
- .bp_inline_error_module_inlineError--4733a[data-modern=false]{
4549
+ .bp_inline_error_module_inlineError--e70b6[data-modern=false]{
4550
4550
  --inline-error-gap:var(--size-1);
4551
4551
  --inline-error-height:var(--size-4);
4552
4552
  --inline-error-text-color:var(--text-text-error-on-light);
@@ -4559,10 +4559,11 @@
4559
4559
  text-transform:var(--body-default-bold-text-case);
4560
4560
  }
4561
4561
 
4562
- .bp_inline_error_module_inlineError--4733a[data-modern=true]{
4562
+ .bp_inline_error_module_inlineError--e70b6[data-modern=true]{
4563
4563
  --inline-error-gap:var(--bp-space-010);
4564
4564
  --inline-error-height:var(--bp-size-040);
4565
4565
  --inline-error-text-color:var(--bp-text-text-error-on-light);
4566
+ --inline-error-slide-offset:calc(var(--bp-font-size-02, 0.625rem)*-1);
4566
4567
  font-family:var(--bp-font-font-family), -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
4567
4568
  font-size:var(--bp-font-size-05);
4568
4569
  font-style:normal;
@@ -4571,21 +4572,54 @@
4571
4572
  line-height:var(--bp-font-line-height-04);
4572
4573
  }
4573
4574
 
4574
- .bp_inline_error_module_inlineError--4733a.bp_inline_error_module_inlineError--4733a{
4575
+ .bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_inlineError--e70b6{
4575
4576
  align-items:center;
4576
4577
  color:var(--inline-error-text-color);
4577
4578
  display:flex;
4578
4579
  gap:var(--inline-error-gap);
4579
4580
  line-height:var(--inline-error-height);
4580
4581
  }
4581
- .bp_inline_error_module_inlineError--4733a.bp_inline_error_module_inlineError--4733a.bp_inline_error_module_empty--4733a{
4582
+ .bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_empty--e70b6{
4582
4583
  display:none;
4583
4584
  }
4584
- .bp_inline_error_module_inlineError--4733a.bp_inline_error_module_inlineError--4733a .bp_inline_error_module_errorIcon--4733a{
4585
+ .bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_inlineError--e70b6 .bp_inline_error_module_errorIcon--e70b6{
4585
4586
  align-self:flex-start;
4586
4587
  flex-grow:0;
4587
4588
  flex-shrink:0;
4588
4589
  }
4590
+
4591
+ .bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_animated--e70b6[data-state=open]{
4592
+ animation-duration:var(--bp-duration-short);
4593
+ animation-fill-mode:both;
4594
+ animation-name:bp_inline_error_module_bpInlineErrorSlideEnter--e70b6;
4595
+ animation-timing-function:var(--bp-curve-small-on);
4596
+ }
4597
+
4598
+ .bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_inlineError--e70b6.bp_inline_error_module_animated--e70b6[data-state=closed]{
4599
+ animation-duration:var(--bp-duration-short);
4600
+ animation-fill-mode:forwards;
4601
+ animation-name:bp_inline_error_module_bpInlineErrorFadeExit--e70b6;
4602
+ animation-timing-function:var(--bp-curve-small-off);
4603
+ }
4604
+
4605
+ @keyframes bp_inline_error_module_bpInlineErrorSlideEnter--e70b6{
4606
+ from{
4607
+ opacity:var(--bp-opacity-hidden);
4608
+ transform:translateY(var(--inline-error-slide-offset));
4609
+ }
4610
+ to{
4611
+ opacity:var(--bp-opacity-visible);
4612
+ transform:translateY(0);
4613
+ }
4614
+ }
4615
+ @keyframes bp_inline_error_module_bpInlineErrorFadeExit--e70b6{
4616
+ from{
4617
+ opacity:var(--bp-opacity-visible);
4618
+ }
4619
+ to{
4620
+ opacity:var(--bp-opacity-hidden);
4621
+ }
4622
+ }
4589
4623
  .bp_labelable_module_required--25dbc{
4590
4624
  align-items:center;
4591
4625
  display:inline-flex;
@@ -11445,7 +11479,7 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11445
11479
  display:flex;
11446
11480
  flex-direction:row;
11447
11481
  }
11448
- .bp_select_menu_grid_option_module_buttonWrapper--287af[data-modern=false]{
11482
+ .bp_select_menu_grid_option_module_buttonWrapper--1b151[data-modern=false]{
11449
11483
  --select-menu-grid-option-labeled-margin-small-breakpoint:var(--space-05) 0;
11450
11484
  --select-menu-grid-option-labeled-margin:var(--space-05);
11451
11485
  --select-menu-grid-option-labeled-max-width:calc(50% - var(--space-1));
@@ -11453,7 +11487,7 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11453
11487
  --select-menu-grid-option-labeled-max-width-last-child-margin-right:0;
11454
11488
  }
11455
11489
 
11456
- .bp_select_menu_grid_option_module_buttonWrapper--287af[data-modern=true]{
11490
+ .bp_select_menu_grid_option_module_buttonWrapper--1b151[data-modern=true]{
11457
11491
  --select-menu-grid-option-labeled-margin-small-breakpoint:var(--bp-space-005) 0;
11458
11492
  --select-menu-grid-option-labeled-margin:var(--bp-space-005);
11459
11493
  --select-menu-grid-option-labeled-max-width:calc(50% - var(--bp-size-010));
@@ -11461,27 +11495,27 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11461
11495
  --select-menu-grid-option-labeled-max-width-last-child-margin-right:0;
11462
11496
  }
11463
11497
 
11464
- .bp_select_menu_grid_option_module_buttonWrapper--287af.bp_select_menu_grid_option_module_withLabel--287af{
11498
+ .bp_select_menu_grid_option_module_buttonWrapper--1b151.bp_select_menu_grid_option_module_withLabel--1b151{
11465
11499
  flex:1 1 0;
11466
11500
  margin:var(--select-menu-grid-option-labeled-margin-small-breakpoint);
11467
11501
  }
11468
- .bp_select_menu_grid_option_module_buttonWrapper--287af.bp_select_menu_grid_option_module_withLabel--default--287af{
11502
+ .bp_select_menu_grid_option_module_buttonWrapper--1b151.bp_select_menu_grid_option_module_withLabel--default--1b151{
11469
11503
  max-width:100%;
11470
11504
  }
11471
11505
  @media only screen and (width > 374px){
11472
- .bp_select_menu_grid_option_module_buttonWrapper--287af.bp_select_menu_grid_option_module_withLabel--default--287af{
11506
+ .bp_select_menu_grid_option_module_buttonWrapper--1b151.bp_select_menu_grid_option_module_withLabel--default--1b151{
11473
11507
  margin:var(--select-menu-grid-option-labeled-margin);
11474
11508
  max-width:var(--select-menu-grid-option-labeled-max-width);
11475
11509
  }
11476
- .bp_select_menu_grid_option_module_buttonWrapper--287af.bp_select_menu_grid_option_module_withLabel--default--287af:first-child{
11510
+ .bp_select_menu_grid_option_module_buttonWrapper--1b151.bp_select_menu_grid_option_module_withLabel--default--1b151:first-child{
11477
11511
  margin-left:var(--select-menu-grid-option-labeled-max-width-first-child-margin-left);
11478
11512
  }
11479
- .bp_select_menu_grid_option_module_buttonWrapper--287af.bp_select_menu_grid_option_module_withLabel--default--287af:last-child{
11513
+ .bp_select_menu_grid_option_module_buttonWrapper--1b151.bp_select_menu_grid_option_module_withLabel--default--1b151:last-child{
11480
11514
  margin-right:var(--select-menu-grid-option-labeled-max-width-last-child-margin-right);
11481
11515
  }
11482
11516
  }
11483
11517
 
11484
- .bp_select_menu_grid_option_module_optionButton--287af[data-modern=false]{
11518
+ .bp_select_menu_grid_option_module_optionButton--1b151[data-modern=false]{
11485
11519
  --select-menu-grid-option-background-color:#0000;
11486
11520
  --select-menu-grid-option-labeled-background-color-hover:var(--surface-surface-secondary);
11487
11521
  --select-menu-grid-option-labeled-background-color-active:var(--surface-surface-secondary);
@@ -11497,6 +11531,8 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11497
11531
  --select-menu-grid-option-labeled-border-radius:var(--radius-3);
11498
11532
  --select-menu-grid-option-labeled-transition:background-color var(--animation-duration-2);
11499
11533
  --select-menu-grid-option-labeled-text-max-height:var(--size-8);
11534
+ --select-menu-grid-option-labeled-label-content-gap:var(--space-05);
11535
+ --select-menu-grid-option-labeled-label-content-optical-offset:var(--border-1);
11500
11536
  --select-menu-grid-option-labeled-text-color:var(--text-text-on-light);
11501
11537
  --select-menu-grid-option-labeled-icon-border-radius:var(--radius-3);
11502
11538
  --select-menu-grid-option-labeled-icon-default-size:var(--size-8);
@@ -11539,7 +11575,7 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11539
11575
  --select-menu-grid-option-circle-box-shadow-focus-active:0 0 0 var(--border-1) var(--gray-white), 0 0 0 var(--border-3) var(--outline-focus-on-light);
11540
11576
  }
11541
11577
 
11542
- .bp_select_menu_grid_option_module_optionButton--287af[data-modern=true]{
11578
+ .bp_select_menu_grid_option_module_optionButton--1b151[data-modern=true]{
11543
11579
  --select-menu-grid-option-background-color:#0000;
11544
11580
  --select-menu-grid-option-labeled-background-color-hover:var(--bp-surface-surface-secondary);
11545
11581
  --select-menu-grid-option-labeled-background-color-active:var(--bp-surface-surface-secondary);
@@ -11555,6 +11591,8 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11555
11591
  --select-menu-grid-option-labeled-border-radius:var(--bp-radius-06);
11556
11592
  --select-menu-grid-option-labeled-transition:background-color var(--animation-duration-2);
11557
11593
  --select-menu-grid-option-labeled-text-max-height:var(--bp-size-080);
11594
+ --select-menu-grid-option-labeled-label-content-gap:var(--bp-space-005);
11595
+ --select-menu-grid-option-labeled-label-content-optical-offset:var(--bp-border-01);
11558
11596
  --select-menu-grid-option-labeled-text-color:var(--bp-text-text-on-light);
11559
11597
  --select-menu-grid-option-labeled-icon-border-radius:var(--bp-radius-04);
11560
11598
  --select-menu-grid-option-labeled-icon-default-size:var(--bp-size-080);
@@ -11597,7 +11635,7 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11597
11635
  --select-menu-grid-option-circle-box-shadow-focus-active:0 0 0 var(--bp-border-01) var(--bp-gray-white), 0 0 0 var(--bp-border-03) var(--bp-border-input-border-focus);
11598
11636
  }
11599
11637
 
11600
- .bp_select_menu_grid_option_module_optionButton--287af{
11638
+ .bp_select_menu_grid_option_module_optionButton--1b151{
11601
11639
  align-items:center;
11602
11640
  background-color:var(--select-menu-grid-option-background-color);
11603
11641
  border:none;
@@ -11607,13 +11645,13 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11607
11645
  -webkit-user-select:none;
11608
11646
  user-select:none;
11609
11647
  }
11610
- .bp_select_menu_grid_option_module_optionButton--287af:not(.bp_select_menu_grid_option_module_labeled--287af){
11648
+ .bp_select_menu_grid_option_module_optionButton--1b151:not(.bp_select_menu_grid_option_module_labeled--1b151){
11611
11649
  height:var(--select-menu-grid-option-not-labeled-height);
11612
11650
  justify-content:center;
11613
11651
  padding:var(--select-menu-grid-option-not-labeled-padding);
11614
11652
  width:var(--select-menu-grid-option-not-labeled-width);
11615
11653
  }
11616
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af{
11654
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151{
11617
11655
  border-radius:var(--select-menu-grid-option-labeled-border-radius);
11618
11656
  gap:var(--select-menu-grid-option-labeled-gap);
11619
11657
  min-width:var(--select-menu-grid-option-labeled-min-width);
@@ -11621,24 +11659,41 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11621
11659
  transition:var(--select-menu-grid-option-labeled-transition);
11622
11660
  width:100%;
11623
11661
  }
11624
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_text--287af{
11662
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_labelContent--1b151{
11663
+ display:flex;
11664
+ flex:1;
11665
+ flex-direction:column;
11666
+ justify-content:center;
11667
+ min-width:0;
11668
+ text-align:left;
11669
+ }
11670
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_labelContent--withDescription--1b151{
11671
+ gap:var(--select-menu-grid-option-labeled-label-content-gap);
11672
+ margin-top:calc(var(--select-menu-grid-option-labeled-label-content-optical-offset)*-1);
11673
+ }
11674
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_text--1b151{
11625
11675
  color:var(--select-menu-grid-option-labeled-text-color);
11626
11676
  max-height:var(--select-menu-grid-option-labeled-text-max-height);
11627
- text-align:left;
11628
11677
  }
11629
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_text--large--287af{
11678
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_text--large--1b151{
11630
11679
  -webkit-box-orient:vertical;
11631
11680
  -webkit-line-clamp:1;
11632
11681
  display:-webkit-box;
11633
11682
  overflow:hidden;
11634
11683
  }
11635
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_text--default--287af{
11684
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_text--default--1b151{
11636
11685
  -webkit-box-orient:vertical;
11637
11686
  -webkit-line-clamp:2;
11638
11687
  display:-webkit-box;
11639
11688
  overflow:hidden;
11640
11689
  }
11641
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--287af{
11690
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_description--1b151{
11691
+ -webkit-box-orient:vertical;
11692
+ -webkit-line-clamp:1;
11693
+ display:-webkit-box;
11694
+ overflow:hidden;
11695
+ }
11696
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--1b151{
11642
11697
  align-items:center;
11643
11698
  background:var(--icon-background);
11644
11699
  border-radius:var(--select-menu-grid-option-labeled-icon-border-radius);
@@ -11646,80 +11701,80 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11646
11701
  flex-shrink:0;
11647
11702
  justify-content:center;
11648
11703
  }
11649
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--size-default--287af{
11704
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--size-default--1b151{
11650
11705
  height:var(--select-menu-grid-option-labeled-icon-default-size);
11651
11706
  width:var(--select-menu-grid-option-labeled-icon-default-size);
11652
11707
  }
11653
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--size-large--287af{
11708
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--size-large--1b151{
11654
11709
  height:var(--select-menu-grid-option-labeled-icon-large-size);
11655
11710
  width:var(--select-menu-grid-option-labeled-icon-large-size);
11656
11711
  }
11657
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--default--287af{
11712
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--default--1b151{
11658
11713
  --icon-background:var(--select-menu-grid-option-labeled-icon-default-background);
11659
11714
  --icon-background-dark:var(--select-menu-grid-option-labeled-icon-default-background-dark);
11660
11715
  }
11661
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--box--287af{
11716
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--box--1b151{
11662
11717
  --icon-background:var(--select-menu-grid-option-labeled-icon-box-background);
11663
11718
  --icon-background-dark:var(--select-menu-grid-option-labeled-icon-box-background-dark);
11664
11719
  }
11665
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--docgen--287af{
11720
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--docgen--1b151{
11666
11721
  --icon-background:var(--select-menu-grid-option-labeled-icon-docgen-background);
11667
11722
  --icon-background-dark:var(--select-menu-grid-option-labeled-icon-docgen-background-dark);
11668
11723
  }
11669
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--forms--287af{
11724
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--forms--1b151{
11670
11725
  --icon-background:var(--select-menu-grid-option-labeled-icon-forms-background);
11671
11726
  --icon-background-dark:var(--select-menu-grid-option-labeled-icon-forms-background-dark);
11672
11727
  }
11673
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af .bp_select_menu_grid_option_module_iconContainer--sign--287af{
11728
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151 .bp_select_menu_grid_option_module_iconContainer--sign--1b151{
11674
11729
  --icon-background:var(--select-menu-grid-option-labeled-icon-sign-background);
11675
11730
  --icon-background-dark:var(--select-menu-grid-option-labeled-icon-sign-background-dark);
11676
11731
  }
11677
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af:hover{
11732
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151:hover{
11678
11733
  background:var(--select-menu-grid-option-labeled-background-color-hover);
11679
11734
  box-shadow:var(--select-menu-grid-option-labeled-box-shadow);
11680
11735
  cursor:grab;
11681
11736
  }
11682
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af.bp_select_menu_grid_option_module_active--287af,.bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af.bp_select_menu_grid_option_module_dragging--287af,.bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af:active{
11737
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151.bp_select_menu_grid_option_module_active--1b151,.bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151.bp_select_menu_grid_option_module_dragging--1b151,.bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151:active{
11683
11738
  background:var(--select-menu-grid-option-labeled-background-color-active);
11684
11739
  box-shadow:var(--select-menu-grid-option-labeled-box-shadow);
11685
11740
  }
11686
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af.bp_select_menu_grid_option_module_active--287af .bp_select_menu_grid_option_module_iconContainer--287af,.bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af:active .bp_select_menu_grid_option_module_iconContainer--287af{
11741
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151.bp_select_menu_grid_option_module_active--1b151 .bp_select_menu_grid_option_module_iconContainer--1b151,.bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151:active .bp_select_menu_grid_option_module_iconContainer--1b151{
11687
11742
  background-color:var(--icon-background);
11688
11743
  }
11689
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af.bp_select_menu_grid_option_module_dragging--287af{
11744
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151.bp_select_menu_grid_option_module_dragging--1b151{
11690
11745
  box-shadow:var(--select-menu-grid-option-labeled-box-shadow-dragging);
11691
11746
  }
11692
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af.bp_select_menu_grid_option_module_dragging--287af .bp_select_menu_grid_option_module_iconContainer--287af{
11747
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151.bp_select_menu_grid_option_module_dragging--1b151 .bp_select_menu_grid_option_module_iconContainer--1b151{
11693
11748
  background-color:var(--icon-background-dark);
11694
11749
  }
11695
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af.bp_select_menu_grid_option_module_dragging--287af:hover{
11750
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151.bp_select_menu_grid_option_module_dragging--1b151:hover{
11696
11751
  cursor:grabbing;
11697
11752
  }
11698
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af:hover:not(.bp_select_menu_grid_option_module_disabled--287af) .bp_select_menu_grid_option_module_iconContainer--287af{
11753
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151:hover:not(.bp_select_menu_grid_option_module_disabled--1b151) .bp_select_menu_grid_option_module_iconContainer--1b151{
11699
11754
  background-color:var(--icon-background-dark);
11700
11755
  transition:var(--select-menu-grid-option-labeled-transition);
11701
11756
  }
11702
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af[data-focus-visible]{
11757
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151[data-focus-visible]{
11703
11758
  box-shadow:var(--select-menu-grid-option-labeled-box-shadow-focus);
11704
11759
  }
11705
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_labeled--287af[data-focus-visible]:active{
11760
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_labeled--1b151[data-focus-visible]:active{
11706
11761
  background:var(--select-menu-grid-option-labeled-background-color-active);
11707
11762
  }
11708
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_square--287af{
11763
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_square--1b151{
11709
11764
  height:var(--select-menu-grid-option-square-height);
11710
11765
  width:var(--select-menu-grid-option-square-width);
11711
11766
  }
11712
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_square--287af,.bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_square--287af .bp_select_menu_grid_option_module_outlineHost--287af{
11767
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_square--1b151,.bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_square--1b151 .bp_select_menu_grid_option_module_outlineHost--1b151{
11713
11768
  align-items:center;
11714
11769
  border-radius:var(--select-menu-grid-option-square-border-radius);
11715
11770
  display:flex;
11716
11771
  justify-content:center;
11717
11772
  }
11718
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_square--287af .bp_select_menu_grid_option_module_outlineHost--287af{
11773
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_square--1b151 .bp_select_menu_grid_option_module_outlineHost--1b151{
11719
11774
  height:var(--select-menu-grid-option-square-outline-host-height);
11720
11775
  width:var(--select-menu-grid-option-square-outline-host-width);
11721
11776
  }
11722
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_circle--287af{
11777
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_circle--1b151{
11723
11778
  align-items:center;
11724
11779
  background-clip:content-box;
11725
11780
  background-color:var(--select-menu-grid-option-circle-background-color);
@@ -11731,10 +11786,10 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11731
11786
  justify-content:center;
11732
11787
  width:var(--select-menu-grid-option-circle-width);
11733
11788
  }
11734
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_circle--287af.bp_select_menu_grid_option_module_loading--287af{
11789
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_circle--1b151.bp_select_menu_grid_option_module_loading--1b151{
11735
11790
  border-color:var(--select-menu-grid-option-circle-border-color-loading);
11736
11791
  }
11737
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_circle--287af .bp_select_menu_grid_option_module_color--287af{
11792
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_circle--1b151 .bp_select_menu_grid_option_module_color--1b151{
11738
11793
  background-color:var(--circleColor);
11739
11794
  border:var(--select-menu-grid-option-circle-inner-border-width) solid var(--circleBorderColor);
11740
11795
  border-radius:var(--select-menu-grid-option-circle-inner-border-radius);
@@ -11742,10 +11797,10 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11742
11797
  height:var(--select-menu-grid-option-circle-inner-height);
11743
11798
  width:var(--select-menu-grid-option-circle-inner-width);
11744
11799
  }
11745
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_circle--287af .bp_select_menu_grid_option_module_strikeThrough--287af{
11800
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_circle--1b151 .bp_select_menu_grid_option_module_strikeThrough--1b151{
11746
11801
  position:relative;
11747
11802
  }
11748
- .bp_select_menu_grid_option_module_optionButton--287af .bp_select_menu_grid_option_module_circle--287af .bp_select_menu_grid_option_module_strikeThrough--287af::after{
11803
+ .bp_select_menu_grid_option_module_optionButton--1b151 .bp_select_menu_grid_option_module_circle--1b151 .bp_select_menu_grid_option_module_strikeThrough--1b151::after{
11749
11804
  background-color:var(--select-menu-grid-option-circle-strikethrough-background-color);
11750
11805
  border-radius:var(--select-menu-grid-option-circle-strikethrough-border-radius);
11751
11806
  content:"";
@@ -11756,32 +11811,32 @@ div[data-radix-popper-content-wrapper]:has([role=menu]):has([data-state=open]):h
11756
11811
  transform:rotate(-45deg);
11757
11812
  width:90%;
11758
11813
  }
11759
- .bp_select_menu_grid_option_module_optionButton--287af:hover .bp_select_menu_grid_option_module_square--287af,.bp_select_menu_grid_option_module_optionButton--287af[data-focus-visible] .bp_select_menu_grid_option_module_square--287af{
11814
+ .bp_select_menu_grid_option_module_optionButton--1b151:hover .bp_select_menu_grid_option_module_square--1b151,.bp_select_menu_grid_option_module_optionButton--1b151[data-focus-visible] .bp_select_menu_grid_option_module_square--1b151{
11760
11815
  background-color:var(--select-menu-grid-option-square-background-color-hover);
11761
11816
  }
11762
- .bp_select_menu_grid_option_module_optionButton--287af:hover .bp_select_menu_grid_option_module_circle--287af,.bp_select_menu_grid_option_module_optionButton--287af[data-focus-visible] .bp_select_menu_grid_option_module_circle--287af{
11817
+ .bp_select_menu_grid_option_module_optionButton--1b151:hover .bp_select_menu_grid_option_module_circle--1b151,.bp_select_menu_grid_option_module_optionButton--1b151[data-focus-visible] .bp_select_menu_grid_option_module_circle--1b151{
11763
11818
  background-color:var(--select-menu-grid-option-circle-background-color-hover);
11764
11819
  }
11765
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_active--287af .bp_select_menu_grid_option_module_square--287af,.bp_select_menu_grid_option_module_optionButton--287af:active .bp_select_menu_grid_option_module_square--287af{
11820
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_active--1b151 .bp_select_menu_grid_option_module_square--1b151,.bp_select_menu_grid_option_module_optionButton--1b151:active .bp_select_menu_grid_option_module_square--1b151{
11766
11821
  background-color:var(--select-menu-grid-option-square-background-color-active);
11767
11822
  }
11768
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_active--287af .bp_select_menu_grid_option_module_circle--287af,.bp_select_menu_grid_option_module_optionButton--287af:active .bp_select_menu_grid_option_module_circle--287af{
11823
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_active--1b151 .bp_select_menu_grid_option_module_circle--1b151,.bp_select_menu_grid_option_module_optionButton--1b151:active .bp_select_menu_grid_option_module_circle--1b151{
11769
11824
  border:var(--select-menu-grid-option-circle-inner-border-width-active) solid var(--circleColor);
11770
11825
  }
11771
- .bp_select_menu_grid_option_module_optionButton--287af.bp_select_menu_grid_option_module_loading--287af,.bp_select_menu_grid_option_module_optionButton--287af:disabled{
11826
+ .bp_select_menu_grid_option_module_optionButton--1b151.bp_select_menu_grid_option_module_loading--1b151,.bp_select_menu_grid_option_module_optionButton--1b151:disabled{
11772
11827
  cursor:default;
11773
11828
  }
11774
- .bp_select_menu_grid_option_module_optionButton--287af[data-focus-visible] .bp_select_menu_grid_option_module_outlineHost--287af{
11829
+ .bp_select_menu_grid_option_module_optionButton--1b151[data-focus-visible] .bp_select_menu_grid_option_module_outlineHost--1b151{
11775
11830
  box-shadow:var(--select-menu-grid-option-circle-outline-host-box-shadow-focus);
11776
11831
  }
11777
- .bp_select_menu_grid_option_module_optionButton--287af[data-focus-visible] .bp_select_menu_grid_option_module_circle--287af{
11832
+ .bp_select_menu_grid_option_module_optionButton--1b151[data-focus-visible] .bp_select_menu_grid_option_module_circle--1b151{
11778
11833
  border-color:var(--select-menu-grid-option-circle-border-color-hover);
11779
11834
  }
11780
- .bp_select_menu_grid_option_module_optionButton--287af[data-focus-visible].bp_select_menu_grid_option_module_active--287af .bp_select_menu_grid_option_module_circle--287af,.bp_select_menu_grid_option_module_optionButton--287af[data-focus-visible]:active .bp_select_menu_grid_option_module_circle--287af{
11835
+ .bp_select_menu_grid_option_module_optionButton--1b151[data-focus-visible].bp_select_menu_grid_option_module_active--1b151 .bp_select_menu_grid_option_module_circle--1b151,.bp_select_menu_grid_option_module_optionButton--1b151[data-focus-visible]:active .bp_select_menu_grid_option_module_circle--1b151{
11781
11836
  border:var(--select-menu-grid-option-circle-border-width-focus-active) solid var(--circleColor);
11782
11837
  box-shadow:var(--select-menu-grid-option-circle-box-shadow-focus-active);
11783
11838
  }
11784
- .bp_select_menu_grid_option_module_optionButton--287af:disabled:not(.bp_select_menu_grid_option_module_loading--287af){
11839
+ .bp_select_menu_grid_option_module_optionButton--1b151:disabled:not(.bp_select_menu_grid_option_module_loading--1b151){
11785
11840
  opacity:.3;
11786
11841
  }
11787
11842
 
@@ -3,44 +3,82 @@ import { AlertBadge } from '@box/blueprint-web-assets/icons/Fill';
3
3
  import { AlertCircle } from '@box/blueprint-web-assets/icons/Medium';
4
4
  import { Size4, IconIconErrorOnLight, bpSize050 } from '@box/blueprint-web-assets/tokens/tokens';
5
5
  import clsx from 'clsx';
6
- import { forwardRef } from 'react';
6
+ import { forwardRef, useCallback } from 'react';
7
+ import '../../blueprint-configuration-context/blueprint-configuration-context.js';
8
+ import '../../blueprint-configuration-context/consts.js';
9
+ import { useBlueprintConfiguration } from '../../blueprint-configuration-context/useBlueprintConfiguration.js';
7
10
  import { useBlueprintModernization } from '../../blueprint-modernization-context/useBlueprintModernization.js';
11
+ import { useInlineErrorPresence } from './utils/use-inline-error-presence.js';
8
12
  import styles from './inline-error.module.js';
9
13
 
14
+ const renderErrorContent = (content, enableModernizedComponents, errorIconClassName) => content && (!enableModernizedComponents ? jsxs(Fragment, {
15
+ children: [jsx(AlertBadge, {
16
+ className: errorIconClassName,
17
+ color: IconIconErrorOnLight,
18
+ height: Size4,
19
+ role: "presentation",
20
+ width: Size4
21
+ }), content]
22
+ }) : jsxs(Fragment, {
23
+ children: [jsx(AlertCircle, {
24
+ className: errorIconClassName,
25
+ color: IconIconErrorOnLight,
26
+ height: bpSize050,
27
+ role: "presentation",
28
+ width: bpSize050
29
+ }), content]
30
+ }));
10
31
  /** Renders an inline error message and icon, used to show error state in form elements. */
11
32
  const InlineError = /*#__PURE__*/forwardRef((props, forwardedRef) => {
12
33
  const {
13
34
  children,
14
35
  className,
36
+ onAnimationEnd: onAnimationEndProp,
15
37
  ...rest
16
38
  } = props;
17
39
  const {
18
40
  enableModernizedComponents
19
41
  } = useBlueprintModernization();
42
+ const {
43
+ componentsWithAnimationEnabled
44
+ } = useBlueprintConfiguration();
45
+ const isAnimationEnabled = componentsWithAnimationEnabled.includes('InlineError');
46
+ const useModernizedAnimation = isAnimationEnabled && enableModernizedComponents;
47
+ const presence = useInlineErrorPresence(children, useModernizedAnimation);
48
+ const {
49
+ onAnimationEnd: onPresenceAnimationEnd
50
+ } = presence;
51
+ const handleAnimationEnd = useCallback(event => {
52
+ onPresenceAnimationEnd(event);
53
+ onAnimationEndProp?.(event);
54
+ }, [onPresenceAnimationEnd, onAnimationEndProp]);
55
+ /** Legacy path: identical DOM/CSS to pre-animation InlineError (no mount/unmount, `.empty` + `display: none`). */
56
+ if (!useModernizedAnimation) {
57
+ return jsx("span", {
58
+ ...rest,
59
+ ref: forwardedRef,
60
+ className: clsx([className, styles.inlineError, {
61
+ [styles.empty]: !children
62
+ }]),
63
+ "data-modern": enableModernizedComponents ? 'true' : 'false',
64
+ onAnimationEnd: onAnimationEndProp,
65
+ children: renderErrorContent(children, enableModernizedComponents, styles.errorIcon)
66
+ });
67
+ }
68
+ /** `return null` when there is no error (and we are not in the exit phase): no visible slot for the
69
+ message — layout matches legacy (legacy hides the same slot via `.empty` + `display: none`). */
70
+ if (!presence.isMounted) {
71
+ return null;
72
+ }
20
73
  return jsx("span", {
21
74
  ...rest,
22
75
  ref: forwardedRef,
23
- className: clsx([className, styles.inlineError, {
24
- [styles.empty]: !children
25
- }]),
26
- "data-modern": enableModernizedComponents ? 'true' : 'false',
27
- children: children && (!enableModernizedComponents ? jsxs(Fragment, {
28
- children: [jsx(AlertBadge, {
29
- className: styles.errorIcon,
30
- color: IconIconErrorOnLight,
31
- height: Size4,
32
- role: "presentation",
33
- width: Size4
34
- }), children]
35
- }) : jsxs(Fragment, {
36
- children: [jsx(AlertCircle, {
37
- className: styles.errorIcon,
38
- color: IconIconErrorOnLight,
39
- height: bpSize050,
40
- role: "presentation",
41
- width: bpSize050
42
- }), children]
43
- }))
76
+ className: clsx([className, styles.inlineError, styles.animated]),
77
+ "data-bp-animated": "true",
78
+ "data-modern": "true",
79
+ "data-state": presence.presenceState,
80
+ onAnimationEnd: handleAnimationEnd,
81
+ children: renderErrorContent(presence.content, enableModernizedComponents, styles.errorIcon)
44
82
  });
45
83
  });
46
84
 
@@ -1,4 +1,4 @@
1
1
  import '../../index.css';
2
- var styles = {"inlineError":"bp_inline_error_module_inlineError--4733a","empty":"bp_inline_error_module_empty--4733a","errorIcon":"bp_inline_error_module_errorIcon--4733a"};
2
+ var styles = {"inlineError":"bp_inline_error_module_inlineError--e70b6","empty":"bp_inline_error_module_empty--e70b6","errorIcon":"bp_inline_error_module_errorIcon--e70b6","animated":"bp_inline_error_module_animated--e70b6"};
3
3
 
4
4
  export { styles as default };
@@ -0,0 +1,13 @@
1
+ import { type AnimationEvent } from 'react';
2
+ type PresenceState = 'open' | 'closed';
3
+ /**
4
+ * Exit-animation presence for `InlineError`. Pattern inspired by Radix UI `usePresence`:
5
+ * keep the node mounted while exit CSS runs, then unmount on `animationend`.
6
+ */
7
+ export declare function useInlineErrorPresence(children: React.ReactNode, isAnimationEnabled: boolean): {
8
+ content: string | number | boolean | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | import("react").ReactPortal | null | undefined;
9
+ isMounted: boolean;
10
+ presenceState: PresenceState | undefined;
11
+ onAnimationEnd: (e: AnimationEvent<HTMLSpanElement>) => void;
12
+ };
13
+ export {};
@@ -0,0 +1,54 @@
1
+ import noop from 'lodash/noop';
2
+ import { useState, useCallback } from 'react';
3
+ import { useEnhancedEffect } from '../../../utils/useEnhancedEffect.js';
4
+
5
+ const animationEndNoop = noop;
6
+ /**
7
+ * Exit-animation presence for `InlineError`. Pattern inspired by Radix UI `usePresence`:
8
+ * keep the node mounted while exit CSS runs, then unmount on `animationend`.
9
+ */
10
+ function useInlineErrorPresence(children, isAnimationEnabled) {
11
+ const hasContent = Boolean(children);
12
+ const [renderedChildren, setRenderedChildren] = useState(children);
13
+ const [presenceState, setPresenceState] = useState(() => isAnimationEnabled && hasContent ? 'open' : undefined);
14
+ const isMounted = isAnimationEnabled && (presenceState === 'open' || presenceState === 'closed');
15
+ const unmountAfterExit = useCallback(() => {
16
+ setPresenceState(undefined);
17
+ setRenderedChildren(undefined);
18
+ }, []);
19
+ const onAnimationEnd = useCallback(e => {
20
+ if (e.target !== e.currentTarget || presenceState !== 'closed') {
21
+ return;
22
+ }
23
+ unmountAfterExit();
24
+ }, [presenceState, unmountAfterExit]);
25
+ useEnhancedEffect(() => {
26
+ if (!isAnimationEnabled) {
27
+ return;
28
+ }
29
+ if (hasContent) {
30
+ setRenderedChildren(children);
31
+ setPresenceState('open');
32
+ return;
33
+ }
34
+ setPresenceState(current => current === 'open' ? 'closed' : current);
35
+ }, [children, isAnimationEnabled, hasContent]);
36
+ // When `isAnimationEnabled` is false (legacy path), return a no-op result: no mount/unmount, no exit animation.
37
+ // `inline-error.tsx` ignores `presence` and renders the legacy `<span>` + `.empty` instead.
38
+ if (!isAnimationEnabled) {
39
+ return {
40
+ content: children,
41
+ isMounted: false,
42
+ presenceState: undefined,
43
+ onAnimationEnd: animationEndNoop
44
+ };
45
+ }
46
+ return {
47
+ content: renderedChildren,
48
+ isMounted,
49
+ presenceState,
50
+ onAnimationEnd
51
+ };
52
+ }
53
+
54
+ export { useInlineErrorPresence };
@@ -42,17 +42,33 @@ export declare const SelectMenuGridColorCircle: import("react").ForwardRefExotic
42
42
  color: string;
43
43
  }, "ref">) & import("react").RefAttributes<HTMLButtonElement>>;
44
44
  export declare const SelectMenuGridWithLabel: import("react").ForwardRefExoticComponent<(Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
45
- size: "default" | "large";
46
45
  colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
47
46
  icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
48
47
  label: string;
49
- } & Required<Pick<import("./types").Dragging, keyof import("./types").Dragging>> & Omit<import("./types").Dragging, keyof import("./types").Dragging>, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
50
- size: "default" | "large";
48
+ } & Required<Pick<import("./types").Dragging, keyof import("./types").Dragging>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
49
+ size: "default";
50
+ }, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
51
+ colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
52
+ icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
53
+ label: string;
54
+ } & Partial<Record<keyof import("./types").Dragging, never>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
55
+ size: "default";
56
+ }, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
57
+ colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
58
+ icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
59
+ label: string;
60
+ } & Required<Pick<import("./types").Dragging, keyof import("./types").Dragging>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
61
+ size: "large";
62
+ description?: string;
63
+ }, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
51
64
  colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
52
65
  icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
53
66
  label: string;
54
- } & Partial<Record<keyof import("./types").Dragging, never>> & Omit<import("./types").Dragging, keyof import("./types").Dragging>, "ref">) & import("react").RefAttributes<HTMLButtonElement>>;
55
- export declare const SelectMenuGridOption: import("react").ForwardRefExoticComponent<(Omit<Partial<{
67
+ } & Partial<Record<keyof import("./types").Dragging, never>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
68
+ size: "large";
69
+ description?: string;
70
+ }, "ref">) & import("react").RefAttributes<HTMLButtonElement>>;
71
+ export declare const SelectMenuGridOption: import("react").ForwardRefExoticComponent<(Omit<{
56
72
  'aria-label': string;
57
73
  tooltipSide?: "top" | "bottom" | "left" | "right";
58
74
  active?: boolean;
@@ -62,41 +78,9 @@ export declare const SelectMenuGridOption: import("react").ForwardRefExoticCompo
62
78
  [index: `data-${string}`]: unknown;
63
79
  } & {
64
80
  children: React.ReactNode;
65
- }> & Partial<{
66
- 'aria-label': string;
67
- tooltipSide?: "top" | "bottom" | "left" | "right";
68
- active?: boolean;
69
- } & Required<Pick<import("./types").Loading, keyof import("./types").Loading>> & Omit<import("./types").Loading, keyof import("./types").Loading> & import("@ariakit/react").ButtonOptions<"button"> & Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
70
- ref?: ((instance: HTMLButtonElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLButtonElement> | null | undefined;
71
- }, keyof import("@ariakit/react").ButtonOptions<T>> & {
72
- [index: `data-${string}`]: unknown;
73
81
  } & {
74
- color: string;
75
- }> & {
76
- variant: "square" | "colorCircle";
77
- }, "ref"> | Omit<Partial<{
78
- 'aria-label': string;
79
- tooltipSide?: "top" | "bottom" | "left" | "right";
80
- active?: boolean;
81
- } & Required<Pick<import("./types").Loading, keyof import("./types").Loading>> & Omit<import("./types").Loading, keyof import("./types").Loading> & import("@ariakit/react").ButtonOptions<"button"> & Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
82
- ref?: ((instance: HTMLButtonElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLButtonElement> | null | undefined;
83
- }, keyof import("@ariakit/react").ButtonOptions<T>> & {
84
- [index: `data-${string}`]: unknown;
85
- } & {
86
- children: React.ReactNode;
87
- }> & Partial<{
88
- 'aria-label': string;
89
- tooltipSide?: "top" | "bottom" | "left" | "right";
90
- active?: boolean;
91
- } & Partial<Record<keyof import("./types").Loading, never>> & Omit<import("./types").Loading, keyof import("./types").Loading> & import("@ariakit/react").ButtonOptions<"button"> & Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
92
- ref?: ((instance: HTMLButtonElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLButtonElement> | null | undefined;
93
- }, keyof import("@ariakit/react").ButtonOptions<T>> & {
94
- [index: `data-${string}`]: unknown;
95
- } & {
96
- color: string;
97
- }> & {
98
- variant: "square" | "colorCircle";
99
- }, "ref"> | Omit<Partial<{
82
+ variant: "square";
83
+ }, "ref"> | Omit<{
100
84
  'aria-label': string;
101
85
  tooltipSide?: "top" | "bottom" | "left" | "right";
102
86
  active?: boolean;
@@ -106,7 +90,9 @@ export declare const SelectMenuGridOption: import("react").ForwardRefExoticCompo
106
90
  [index: `data-${string}`]: unknown;
107
91
  } & {
108
92
  children: React.ReactNode;
109
- }> & Partial<{
93
+ } & {
94
+ variant: "square";
95
+ }, "ref"> | Omit<{
110
96
  'aria-label': string;
111
97
  tooltipSide?: "top" | "bottom" | "left" | "right";
112
98
  active?: boolean;
@@ -116,19 +102,9 @@ export declare const SelectMenuGridOption: import("react").ForwardRefExoticCompo
116
102
  [index: `data-${string}`]: unknown;
117
103
  } & {
118
104
  color: string;
119
- }> & {
120
- variant: "square" | "colorCircle";
121
- }, "ref"> | Omit<Partial<{
122
- 'aria-label': string;
123
- tooltipSide?: "top" | "bottom" | "left" | "right";
124
- active?: boolean;
125
- } & Partial<Record<keyof import("./types").Loading, never>> & Omit<import("./types").Loading, keyof import("./types").Loading> & import("@ariakit/react").ButtonOptions<"button"> & Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
126
- ref?: ((instance: HTMLButtonElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLButtonElement> | null | undefined;
127
- }, keyof import("@ariakit/react").ButtonOptions<T>> & {
128
- [index: `data-${string}`]: unknown;
129
105
  } & {
130
- children: React.ReactNode;
131
- }> & Partial<{
106
+ variant: "colorCircle";
107
+ }, "ref"> | Omit<{
132
108
  'aria-label': string;
133
109
  tooltipSide?: "top" | "bottom" | "left" | "right";
134
110
  active?: boolean;
@@ -138,21 +114,43 @@ export declare const SelectMenuGridOption: import("react").ForwardRefExoticCompo
138
114
  [index: `data-${string}`]: unknown;
139
115
  } & {
140
116
  color: string;
141
- }> & {
142
- variant: "square" | "colorCircle";
117
+ } & {
118
+ variant: "colorCircle";
143
119
  }, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
144
- size: "default" | "large";
145
120
  colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
146
121
  icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
147
122
  label: string;
148
123
  } & Required<Pick<import("./types").Dragging, keyof import("./types").Dragging>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
124
+ size: "default";
125
+ } & {
149
126
  variant: "labeled";
150
127
  }, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
151
- size: "default" | "large";
152
128
  colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
153
129
  icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
154
130
  label: string;
155
131
  } & Partial<Record<keyof import("./types").Dragging, never>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
132
+ size: "default";
133
+ } & {
134
+ variant: "labeled";
135
+ }, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
136
+ colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
137
+ icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
138
+ label: string;
139
+ } & Required<Pick<import("./types").Dragging, keyof import("./types").Dragging>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
140
+ size: "large";
141
+ description?: string;
142
+ } & {
143
+ variant: "labeled";
144
+ }, "ref"> | Omit<Omit<import("./types").CommonOptionProps, "draggable" | "aria-label" | "tooltipSide"> & {
145
+ colorVariant: "default" | "box" | "forms" | "docgen" | "sign";
146
+ icon: import("react").FunctionComponent<import("react").PropsWithChildren<import("react").SVGProps<SVGSVGElement>>>;
147
+ label: string;
148
+ } & Partial<Record<keyof import("./types").Dragging, never>> & Omit<import("./types").Dragging, keyof import("./types").Dragging> & {
149
+ size: "large";
150
+ description?: string;
151
+ } & {
156
152
  variant: "labeled";
157
153
  }, "ref">) & import("react").RefAttributes<HTMLButtonElement>>;
158
- export declare const ItemWithLabel: ({ size, colorVariant, label, icon, }: Pick<SelectMenuGridWithLabelProps, "label" | "size" | "colorVariant" | "icon">) => import("react/jsx-runtime").JSX.Element;
154
+ export declare const ItemWithLabel: ({ size, colorVariant, label, description, icon, }: Pick<SelectMenuGridWithLabelProps, "colorVariant" | "icon" | "label" | "size"> & {
155
+ description?: string;
156
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -46,8 +46,21 @@ const SelectMenuGridOption = /*#__PURE__*/forwardRef((props, forwardedRef) => {
46
46
  const isButtonActive = !disabled && !loading && active;
47
47
  const isButtonDragged = isWithLabel && !isButtonDisabled && props.draggable && props.dragging;
48
48
  const shouldShowTooltip = !isButtonDisabled && !isWithLabel;
49
- const ariaLabel = !isWithLabel ? props['aria-label'] : props.label;
50
- const buttonProps = isWithLabel ? omit(restProps, ['colorVariant', 'icon', 'dragging', 'label']) : restProps;
49
+ let ariaLabel;
50
+ if (variant === 'labeled') {
51
+ const {
52
+ label,
53
+ size
54
+ } = props;
55
+ if (size === 'large' && props.description) {
56
+ ariaLabel = `${label}. ${props.description}`;
57
+ } else {
58
+ ariaLabel = label;
59
+ }
60
+ } else {
61
+ ariaLabel = props['aria-label'];
62
+ }
63
+ const buttonProps = isWithLabel ? omit(restProps, ['colorVariant', 'icon', 'dragging', 'label', 'description']) : restProps;
51
64
  // TODO: [DSYS-764] use IconButton instead of AriakitButton
52
65
  const button = jsx(CompositeItem, {
53
66
  render: jsxs(Button, {
@@ -153,6 +166,7 @@ const ItemWithLabel = ({
153
166
  size,
154
167
  colorVariant,
155
168
  label,
169
+ description,
156
170
  icon
157
171
  }) => {
158
172
  const {
@@ -168,11 +182,22 @@ const ItemWithLabel = ({
168
182
  children: [jsx("div", {
169
183
  className: clsx(styles.iconContainer, styles[`iconContainer--${colorVariant}`], styles[`iconContainer--size-${size}`]),
170
184
  children: iconElement
171
- }), jsx(Text, {
172
- as: "span",
173
- className: clsx(styles.text, styles[`text--${size}`]),
174
- variant: size === 'default' ? 'caption' : 'bodyDefaultBold',
175
- children: label
185
+ }), jsxs("div", {
186
+ className: clsx(styles.labelContent, {
187
+ [styles['labelContent--withDescription']]: description
188
+ }),
189
+ children: [jsx(Text, {
190
+ as: "span",
191
+ className: clsx(styles.text, styles[`text--${size}`]),
192
+ variant: size === 'default' ? 'caption' : 'bodyDefaultBold',
193
+ children: label
194
+ }), description && jsx(Text, {
195
+ as: "span",
196
+ className: styles.description,
197
+ color: "textOnLightSecondary",
198
+ variant: "caption",
199
+ children: description
200
+ })]
176
201
  })]
177
202
  });
178
203
  };
@@ -1,4 +1,4 @@
1
1
  import '../../index.css';
2
- var styles = {"buttonWrapper":"bp_select_menu_grid_option_module_buttonWrapper--287af","withLabel":"bp_select_menu_grid_option_module_withLabel--287af","withLabel--default":"bp_select_menu_grid_option_module_withLabel--default--287af","optionButton":"bp_select_menu_grid_option_module_optionButton--287af","labeled":"bp_select_menu_grid_option_module_labeled--287af","text":"bp_select_menu_grid_option_module_text--287af","text--large":"bp_select_menu_grid_option_module_text--large--287af","text--default":"bp_select_menu_grid_option_module_text--default--287af","iconContainer":"bp_select_menu_grid_option_module_iconContainer--287af","iconContainer--size-default":"bp_select_menu_grid_option_module_iconContainer--size-default--287af","iconContainer--size-large":"bp_select_menu_grid_option_module_iconContainer--size-large--287af","iconContainer--default":"bp_select_menu_grid_option_module_iconContainer--default--287af","iconContainer--box":"bp_select_menu_grid_option_module_iconContainer--box--287af","iconContainer--docgen":"bp_select_menu_grid_option_module_iconContainer--docgen--287af","iconContainer--forms":"bp_select_menu_grid_option_module_iconContainer--forms--287af","iconContainer--sign":"bp_select_menu_grid_option_module_iconContainer--sign--287af","active":"bp_select_menu_grid_option_module_active--287af","dragging":"bp_select_menu_grid_option_module_dragging--287af","disabled":"bp_select_menu_grid_option_module_disabled--287af","square":"bp_select_menu_grid_option_module_square--287af","outlineHost":"bp_select_menu_grid_option_module_outlineHost--287af","circle":"bp_select_menu_grid_option_module_circle--287af","loading":"bp_select_menu_grid_option_module_loading--287af","color":"bp_select_menu_grid_option_module_color--287af","strikeThrough":"bp_select_menu_grid_option_module_strikeThrough--287af"};
2
+ var styles = {"buttonWrapper":"bp_select_menu_grid_option_module_buttonWrapper--1b151","withLabel":"bp_select_menu_grid_option_module_withLabel--1b151","withLabel--default":"bp_select_menu_grid_option_module_withLabel--default--1b151","optionButton":"bp_select_menu_grid_option_module_optionButton--1b151","labeled":"bp_select_menu_grid_option_module_labeled--1b151","labelContent":"bp_select_menu_grid_option_module_labelContent--1b151","labelContent--withDescription":"bp_select_menu_grid_option_module_labelContent--withDescription--1b151","text":"bp_select_menu_grid_option_module_text--1b151","text--large":"bp_select_menu_grid_option_module_text--large--1b151","text--default":"bp_select_menu_grid_option_module_text--default--1b151","description":"bp_select_menu_grid_option_module_description--1b151","iconContainer":"bp_select_menu_grid_option_module_iconContainer--1b151","iconContainer--size-default":"bp_select_menu_grid_option_module_iconContainer--size-default--1b151","iconContainer--size-large":"bp_select_menu_grid_option_module_iconContainer--size-large--1b151","iconContainer--default":"bp_select_menu_grid_option_module_iconContainer--default--1b151","iconContainer--box":"bp_select_menu_grid_option_module_iconContainer--box--1b151","iconContainer--docgen":"bp_select_menu_grid_option_module_iconContainer--docgen--1b151","iconContainer--forms":"bp_select_menu_grid_option_module_iconContainer--forms--1b151","iconContainer--sign":"bp_select_menu_grid_option_module_iconContainer--sign--1b151","active":"bp_select_menu_grid_option_module_active--1b151","dragging":"bp_select_menu_grid_option_module_dragging--1b151","disabled":"bp_select_menu_grid_option_module_disabled--1b151","square":"bp_select_menu_grid_option_module_square--1b151","outlineHost":"bp_select_menu_grid_option_module_outlineHost--1b151","circle":"bp_select_menu_grid_option_module_circle--1b151","loading":"bp_select_menu_grid_option_module_loading--1b151","color":"bp_select_menu_grid_option_module_color--1b151","strikeThrough":"bp_select_menu_grid_option_module_strikeThrough--1b151"};
3
3
 
4
4
  export { styles as default };
@@ -1,6 +1,6 @@
1
1
  import { type ButtonProps as AriakitButtonProps, type CompositeProps, type CompositeRowProps } from '@ariakit/react';
2
- import { type RequireAllOrNone } from 'type-fest';
3
2
  import { type FunctionComponent, type PropsWithChildren, type SVGProps } from 'react';
3
+ import { type RequireAllOrNone } from 'type-fest';
4
4
  export interface Loading {
5
5
  /** Loading state of the grid option. Ghost section is displaying as a placeholder. When this is true `loadingAriaLabel` must also be provided. */
6
6
  loading: boolean;
@@ -27,15 +27,23 @@ export type SelectMenuGridColorCircleProps = CommonOptionProps & {
27
27
  /** The color of the swatch */
28
28
  color: string;
29
29
  };
30
- export type SelectMenuGridWithLabelProps = Omit<CommonOptionProps, 'aria-label' | 'tooltipSide' | 'draggable'> & {
31
- size: 'default' | 'large';
30
+ type SelectMenuGridWithLabelBase = Omit<CommonOptionProps, 'aria-label' | 'tooltipSide' | 'draggable'> & {
32
31
  colorVariant: 'default' | 'box' | 'forms' | 'docgen' | 'sign';
33
32
  icon: FunctionComponent<PropsWithChildren<SVGProps<SVGSVGElement>>>;
34
33
  label: string;
35
34
  } & RequireAllOrNone<Dragging, keyof Dragging>;
36
- export type SelectMenuOptionIconsProps = Partial<SelectMenuGridSquareProps> & Partial<SelectMenuGridColorCircleProps> & {
37
- variant: 'square' | 'colorCircle';
38
- };
35
+ export type SelectMenuGridWithLabelProps = (SelectMenuGridWithLabelBase & {
36
+ size: 'default';
37
+ }) | (SelectMenuGridWithLabelBase & {
38
+ /** Secondary text shown below the label. Only supported when `size` is `large`. */
39
+ size: 'large';
40
+ description?: string;
41
+ });
42
+ export type SelectMenuOptionIconsProps = (SelectMenuGridSquareProps & {
43
+ variant: 'square';
44
+ }) | (SelectMenuGridColorCircleProps & {
45
+ variant: 'colorCircle';
46
+ });
39
47
  export type SelectMenuOptionProps = SelectMenuOptionIconsProps | (SelectMenuGridWithLabelProps & {
40
48
  variant: 'labeled';
41
49
  });
@@ -46,3 +54,4 @@ export type SelectMenuGridProps = {
46
54
  /** The number of columns to slice the grid options into */
47
55
  columns: number;
48
56
  } & CompositeProps;
57
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/blueprint-web",
3
- "version": "15.2.0",
3
+ "version": "15.4.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.121.5",
50
+ "@box/blueprint-web-assets": "^4.121.7",
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.20.5",
80
+ "@box/storybook-utils": "^0.20.7",
81
81
  "@figma/code-connect": "1.4.4",
82
82
  "@types/react": "^18.0.0",
83
83
  "@types/react-dom": "^18.0.0",