reshaped 4.2.0-canary.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/bundle.css +1 -1
  2. package/dist/bundle.d.ts +6 -0
  3. package/dist/bundle.js +2 -2
  4. package/dist/components/Accordion/AccordionContent.js +1 -1
  5. package/dist/components/Badge/Badge.js +4 -1
  6. package/dist/components/Badge/Badge.module.css +1 -1
  7. package/dist/components/Badge/tests/Badge.stories.d.ts +4 -0
  8. package/dist/components/Badge/tests/Badge.stories.js +48 -1
  9. package/dist/components/Button/Button.js +2 -0
  10. package/dist/components/Button/Button.module.css +1 -1
  11. package/dist/components/Button/tests/Button.stories.js +1 -0
  12. package/dist/components/ContentToggle/ContentToggle.d.ts +4 -0
  13. package/dist/components/ContentToggle/ContentToggle.js +12 -0
  14. package/dist/components/ContentToggle/ContentToggle.module.css +1 -0
  15. package/dist/components/ContentToggle/ContentToggle.types.d.ts +16 -0
  16. package/dist/components/ContentToggle/index.d.ts +2 -0
  17. package/dist/components/ContentToggle/index.js +1 -0
  18. package/dist/components/ContentToggle/tests/ContentToggle.stories.d.ts +10 -0
  19. package/dist/components/ContentToggle/tests/ContentToggle.stories.js +75 -0
  20. package/dist/components/ContextMenu/ContextMenu.js +5 -4
  21. package/dist/components/ContextMenu/ContextMenu.types.d.ts +5 -1
  22. package/dist/components/ContextMenu/tests/ContextMenu.stories.d.ts +11 -7
  23. package/dist/components/ContextMenu/tests/ContextMenu.stories.js +18 -1
  24. package/dist/components/DropdownMenu/DropdownMenu.context.d.ts +11 -0
  25. package/dist/components/DropdownMenu/DropdownMenu.context.js +19 -0
  26. package/dist/components/DropdownMenu/DropdownMenu.js +6 -4
  27. package/dist/components/DropdownMenu/DropdownMenu.types.d.ts +9 -0
  28. package/dist/components/DropdownMenu/tests/DropdownMenu.stories.d.ts +1 -0
  29. package/dist/components/DropdownMenu/tests/DropdownMenu.stories.js +22 -1
  30. package/dist/components/Expandable/Expandable.d.ts +4 -0
  31. package/dist/components/Expandable/Expandable.js +85 -0
  32. package/dist/components/Expandable/Expandable.module.css +1 -0
  33. package/dist/components/Expandable/Expandable.types.d.ts +18 -0
  34. package/dist/components/Expandable/Expandable.types.js +1 -0
  35. package/dist/components/Expandable/index.d.ts +2 -0
  36. package/dist/components/Expandable/tests/Expandable.stories.d.ts +12 -0
  37. package/dist/components/Expandable/tests/Expandable.stories.js +82 -0
  38. package/dist/components/IconToggle/IconToggle.d.ts +4 -0
  39. package/dist/components/IconToggle/IconToggle.js +13 -0
  40. package/dist/components/IconToggle/IconToggle.module.css +1 -0
  41. package/dist/components/IconToggle/IconToggle.types.d.ts +5 -0
  42. package/dist/components/IconToggle/IconToggle.types.js +1 -0
  43. package/dist/components/IconToggle/index.d.ts +2 -0
  44. package/dist/components/IconToggle/index.js +1 -0
  45. package/dist/components/IconToggle/tests/IconToggle.stories.d.ts +10 -0
  46. package/dist/components/IconToggle/tests/IconToggle.stories.js +24 -0
  47. package/dist/components/Image/Image.js +14 -0
  48. package/dist/components/Link/Link.d.ts +1 -1
  49. package/dist/components/Link/Link.js +2 -2
  50. package/dist/components/Link/Link.types.d.ts +1 -1
  51. package/dist/components/Link/tests/Link.stories.d.ts +2 -1
  52. package/dist/components/Link/tests/Link.stories.js +7 -1
  53. package/dist/components/MenuItem/MenuItem.js +14 -2
  54. package/dist/components/MenuItem/MenuItem.module.css +1 -1
  55. package/dist/components/Select/Select.module.css +1 -1
  56. package/dist/components/Select/SelectStartContent.js +2 -0
  57. package/dist/components/Tabs/Tabs.module.css +1 -1
  58. package/dist/components/Tabs/TabsItem.js +6 -1
  59. package/dist/components/TextField/TextField.js +2 -0
  60. package/dist/components/TextField/TextField.module.css +1 -1
  61. package/dist/components/_private/Presence/Presence.d.ts +7 -0
  62. package/dist/components/_private/Presence/Presence.js +71 -0
  63. package/dist/components/_private/Presence/Presence.module.css +1 -0
  64. package/dist/components/_private/Presence/Presence.types.d.ts +45 -0
  65. package/dist/components/_private/Presence/Presence.types.js +1 -0
  66. package/dist/components/_private/Presence/index.d.ts +1 -0
  67. package/dist/components/_private/Presence/index.js +1 -0
  68. package/dist/hooks/_internal/useSingletonKeyboardMode.js +12 -0
  69. package/dist/hooks/useOnClickOutside.js +19 -11
  70. package/dist/index.d.ts +6 -0
  71. package/dist/index.js +3 -0
  72. package/package.json +3 -3
  73. package/dist/components/_private/Expandable/Expandable.d.ts +0 -4
  74. package/dist/components/_private/Expandable/Expandable.js +0 -58
  75. package/dist/components/_private/Expandable/Expandable.module.css +0 -1
  76. package/dist/components/_private/Expandable/Expandable.types.d.ts +0 -7
  77. package/dist/components/_private/Expandable/index.d.ts +0 -1
  78. /package/dist/components/{_private/Expandable/Expandable.types.js → ContentToggle/ContentToggle.types.js} +0 -0
  79. /package/dist/components/{_private/Expandable → Expandable}/index.js +0 -0
@@ -1 +1 @@
1
- .root{--rs-p-h:var(--rs-text-field-p-h);--rs-p-v:0px;--rs-text-field-start-slot-padding:var(--rs-unit-x2);--rs-text-field-end-slot-padding:var(--rs-unit-x2);--rs-text-field-focus-border-color:var(--rs-color-border-primary);display:flex;align-items:center;position:relative;z-index:0;background:var(--rs-color-background-elevation-base);border-radius:var(--rs-text-field-radius);padding:var(--rs-unit-x1) var(--rs-text-field-p-h);min-height:var(--rs-text-field-min-height)}.root.--focused,.root:has(.icon:active),.root:not(:has(button:focus,a:focus,[tabindex="0"]:focus,[role=button]:focus,select:focus)):focus-within{box-shadow:var(--rs-outline-shadow)}.root.--multiline{flex-wrap:wrap}.root.--multiline .input{width:auto}.root.--rounded{--rs-text-field-radius:var(--rs-radius-circular)}.inner{display:inline-flex;flex-grow:1}.input{border:none;outline:none;position:relative;z-index:1;background:none;flex-grow:1;box-sizing:border-box;width:100%;color:var(--rs-color-foreground-neutral);min-height:var(--rs-text-field-min-height);margin:calc(var(--rs-text-field-p-v) * -1) calc(var(--rs-text-field-gap) * -1);padding-inline:var(--rs-text-field-gap);padding-block:0;font-weight:var(--rs-font-weight-regular);font-family:var(--rs-font-family-body)}.input:-webkit-autofill{-webkit-background-clip:text;-webkit-text-fill-color:var(--rs-color-foreground-neutral)}.affix,.input{font-size:var(--rs-text-field-font-size);line-height:var(--rs-text-field-line-height);letter-spacing:var(--rs-text-field-letter-spacing)}.affix,.icon,.slot{max-width:100%;position:relative;z-index:5;display:flex;align-items:center;flex-shrink:0;min-height:calc(var(--rs-text-field-min-height) - var(--rs-unit-x2))}.affix--position-start,.icon--position-start,.slot--position-start{margin-inline-end:var(--rs-text-field-gap)}.affix--position-end,.icon--position-end,.slot--position-end{margin-inline-start:var(--rs-text-field-gap)}.icon{cursor:text}.icon.icon--position-start{margin-inline-start:calc(var(--rs-text-field-icon-align) * -1)}.icon.icon--position-end{margin-inline-end:calc(var(--rs-text-field-icon-align) * -1)}.slot.slot--position-start{--rs-text-field-slot-adjustment:calc(var(--rs-text-field-start-slot-padding) - var(--rs-text-field-p-h));margin-inline-start:var(--rs-text-field-slot-adjustment)}.icon+.slot.slot--position-start{margin-inline-start:0}.slot.slot--position-start:has(+.slot--position-start){margin-inline-end:calc(max(calc(var(--rs-text-field-slot-adjustment) * -1), 0px) + var(--rs-text-field-gap))}.slot.slot--position-end{--rs-text-field-slot-adjustment:calc(var(--rs-text-field-end-slot-padding) - var(--rs-text-field-p-h));margin-inline-end:var(--rs-text-field-slot-adjustment)}.affix{color:var(--rs-color-foreground-neutral-faded)}.affix.affix--position-start{padding-inline-end:calc(var(--rs-text-field-gap) + 1px)}.affix.affix--position-start:after{content:"";position:absolute;inset-block:var(--rs-unit-x1-5);inset-inline-end:0;border-inline-end:1px solid var(--rs-color-border-neutral-faded)}.affix.affix--position-end{padding-inline-start:calc(var(--rs-text-field-gap) + 1px)}.affix.affix--position-end:after{content:"";position:absolute;inset-block:var(--rs-unit-x1-5);inset-inline-start:0;border-inline-start:1px solid var(--rs-color-border-neutral-faded)}.input+.affix--position-end,.input+.icon--position-end,.input+.slot--position-end{margin-inline-start:auto}.root.--disabled{--rs-text-field-border-color:var(--rs-color-border-disabled);background:var(--rs-color-background-disabled-faded)}.root.--disabled,.root.--disabled .input{color:var(--rs-color-foreground-disabled);cursor:not-allowed}.--size-small{--rs-text-field-gap:var(--rs-unit-x1-5);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}.root.--variant-faded{background:var(--rs-color-background-neutral-faded)}.root.--variant-ghost{background:transparent}.root.--variant-headless{--rs-text-field-focus-border-color:transparent;background:transparent;box-shadow:none!important}.root.--status-error:not(.--variant-headless){box-shadow:0 0 0 var(--rs-outline-width) var(--rs-color-border-critical) inset}@media (--rs-viewport-s ) and (hover:none){.input{font-size:var(--rs-font-size-body-1)!important}}@media (--rs-viewport-m ){.--size-small--m{--rs-text-field-gap:var(--rs-unit-x1-5);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium--m{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large--m{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge--m{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}}@media (--rs-viewport-l ){.--size-small--l{--rs-text-field-gap:var(--rs-unit-x1-5);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium--l{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large--l{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge--l{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}}@media (--rs-viewport-xl ){.--size-small--xl{--rs-text-field-gap:var(--rs-unit-x1-5);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium--xl{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large--xl{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge--xl{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}}
1
+ .root{--rs-p-h:var(--rs-text-field-p-h);--rs-p-v:0px;--rs-text-field-start-slot-padding:var(--rs-unit-x2);--rs-text-field-end-slot-padding:var(--rs-unit-x2);--rs-text-field-focus-border-color:var(--rs-color-border-primary);display:flex;align-items:center;position:relative;z-index:0;background:var(--rs-color-background-elevation-base);border-radius:var(--rs-text-field-radius);padding:var(--rs-unit-x1) var(--rs-text-field-p-h);min-height:var(--rs-text-field-min-height)}.root.--focused,.root:has(.icon:active),.root:not(:has(button:focus,a:focus,[tabindex="0"]:focus,[role=button]:focus,select:focus)):focus-within{box-shadow:var(--rs-outline-shadow)}.root.--multiline{flex-wrap:wrap}.root.--multiline .input{width:auto}.root.--rounded{--rs-text-field-radius:var(--rs-radius-circular)}.inner{display:inline-flex;flex-grow:1}.input{border:none;outline:none;position:relative;z-index:1;background:none;flex-grow:1;box-sizing:border-box;width:100%;color:var(--rs-color-foreground-neutral);min-height:var(--rs-text-field-min-height);margin:calc(var(--rs-text-field-p-v) * -1) calc(var(--rs-text-field-gap) * -1);padding-inline:var(--rs-text-field-gap);padding-block:0;font-weight:var(--rs-font-weight-regular);font-family:var(--rs-font-family-body)}.input:-webkit-autofill{-webkit-background-clip:text;-webkit-text-fill-color:var(--rs-color-foreground-neutral)}.affix,.input{font-size:var(--rs-text-field-font-size);line-height:var(--rs-text-field-line-height);letter-spacing:var(--rs-text-field-letter-spacing)}.affix,.icon,.slot{max-width:100%;position:relative;z-index:5;display:flex;align-items:center;flex-shrink:0;min-height:calc(var(--rs-text-field-min-height) - var(--rs-unit-x2))}.affix--position-start,.icon--position-start,.slot--position-start{margin-inline-end:var(--rs-text-field-gap)}.affix--position-end,.icon--position-end,.slot--position-end{margin-inline-start:var(--rs-text-field-gap)}.icon{cursor:text}.icon.icon--position-start{margin-inline-start:calc(var(--rs-text-field-icon-align) * -1)}.icon.icon--position-end{margin-inline-end:calc(var(--rs-text-field-icon-align) * -1)}.slot.slot--position-start{--rs-text-field-slot-adjustment:calc(var(--rs-text-field-start-slot-padding) - var(--rs-text-field-p-h));margin-inline-start:var(--rs-text-field-slot-adjustment)}.icon+.slot.slot--position-start{margin-inline-start:0}.slot.slot--position-start:has(+.slot--position-start){margin-inline-end:calc(max(calc(var(--rs-text-field-slot-adjustment) * -1), 0px) + var(--rs-text-field-gap))}.slot.slot--position-end{--rs-text-field-slot-adjustment:calc(var(--rs-text-field-end-slot-padding) - var(--rs-text-field-p-h));margin-inline-end:var(--rs-text-field-slot-adjustment)}.affix{color:var(--rs-color-foreground-neutral-faded)}.affix.affix--position-start{padding-inline-end:calc(var(--rs-text-field-gap) + 1px)}.affix.affix--position-start:after{content:"";position:absolute;inset-block:var(--rs-unit-x1-5);inset-inline-end:0;border-inline-end:1px solid var(--rs-color-border-neutral-faded)}.affix.affix--position-end{padding-inline-start:calc(var(--rs-text-field-gap) + 1px)}.affix.affix--position-end:after{content:"";position:absolute;inset-block:var(--rs-unit-x1-5);inset-inline-start:0;border-inline-start:1px solid var(--rs-color-border-neutral-faded)}.input+.affix--position-end,.input+.icon--position-end,.input+.slot--position-end{margin-inline-start:auto}.root.--disabled{--rs-text-field-border-color:var(--rs-color-border-disabled);background:var(--rs-color-background-disabled-faded)}.root.--disabled,.root.--disabled .input{color:var(--rs-color-foreground-disabled);cursor:not-allowed}.--size-small{--rs-text-field-gap:var(--rs-unit-x1);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}.root.--variant-faded{background:var(--rs-color-background-neutral-faded)}.root.--variant-ghost{background:transparent}.root.--variant-headless{--rs-text-field-focus-border-color:transparent;background:transparent;box-shadow:none!important}.root.--status-error:not(.--variant-headless){box-shadow:0 0 0 var(--rs-outline-width) var(--rs-color-border-critical) inset}@media (--rs-viewport-s ) and (hover:none){.input{font-size:var(--rs-font-size-body-1)!important}}@media (--rs-viewport-m ){.--size-small--m{--rs-text-field-gap:var(--rs-unit-x1);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium--m{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large--m{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge--m{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}}@media (--rs-viewport-l ){.--size-small--l{--rs-text-field-gap:var(--rs-unit-x1);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium--l{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large--l{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge--l{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}}@media (--rs-viewport-xl ){.--size-small--xl{--rs-text-field-gap:var(--rs-unit-x1);--rs-text-field-radius:var(--rs-radius-small);--rs-text-field-p-v:calc(var(--rs-unit-x1) + (var(--rs-line-height-body-2) - var(--rs-line-height-caption-1)) / 2);--rs-text-field-p-h:var(--rs-unit-x2);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-caption-1);--rs-text-field-line-height:var(--rs-line-height-caption-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-caption-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-text-field-p-v) * 2)}.--size-medium--xl{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x2);--rs-text-field-p-h:var(--rs-unit-x3);--rs-text-field-icon-align:var(--rs-unit-x0-5);--rs-text-field-font-size:var(--rs-font-size-body-2);--rs-text-field-line-height:var(--rs-line-height-body-2);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-2);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x2) * 2)}.--size-large--xl{--rs-text-field-gap:var(--rs-unit-x2);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x3);--rs-text-field-p-h:var(--rs-unit-x4);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x2);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x3) * 2)}.--size-xlarge--xl{--rs-text-field-gap:var(--rs-unit-x3);--rs-text-field-radius:var(--rs-radius-medium);--rs-text-field-p-v:var(--rs-unit-x4);--rs-text-field-p-h:var(--rs-unit-x5);--rs-text-field-icon-align:var(--rs-unit-x1);--rs-text-field-font-size:var(--rs-font-size-body-1);--rs-text-field-line-height:var(--rs-line-height-body-1);--rs-text-field-letter-spacing:var(--rs-letter-spacing-body-1);--rs-text-field-action-inset:var(--rs-unit-x1);--rs-text-field-min-height:calc(var(--rs-text-field-line-height) + var(--rs-unit-x4) * 2)}}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import type * as T from "./Presence.types";
3
+ declare function Presence<As extends keyof React.JSX.IntrinsicElements = "span">(props: T.Props<As>): React.JSX.Element;
4
+ declare namespace Presence {
5
+ var displayName: string;
6
+ }
7
+ export default Presence;
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React from "react";
4
+ import { classNames } from "@reshaped/utilities";
5
+ import useIsomorphicLayoutEffect from "../../../hooks/useIsomorphicLayoutEffect";
6
+ import s from "./Presence.module.css";
7
+ const PresenceItem = (props) => {
8
+ const { as, entry, status, itemClassName, enterClassName, exitClassName, onExited } = props;
9
+ // Rendering a union of every intrinsic tag name blows up the JSX prop type
10
+ const TagName = as;
11
+ const elRef = React.useRef(null);
12
+ const itemClassNames = classNames(s.item, status && s[`--${status}`], itemClassName, status === "enter" && enterClassName, status === "exit" && exitClassName);
13
+ const handleAnimationEnd = (e) => {
14
+ if (status !== "exit" || e.target !== elRef.current)
15
+ return;
16
+ onExited(entry.id);
17
+ };
18
+ // Exiting items are removed when their animation ends, so the ones that never
19
+ // start it have to be released here. Reduced motion keeps the animation and only
20
+ // zeroes its duration, which makes it end on the next frame instead
21
+ useIsomorphicLayoutEffect(() => {
22
+ const el = elRef.current;
23
+ if (status !== "exit" || !el)
24
+ return;
25
+ if (el.getAnimations().length > 0)
26
+ return;
27
+ onExited(entry.id);
28
+ }, [status, entry.id, onExited]);
29
+ return (_jsx(TagName, { ref: elRef, className: itemClassNames, "aria-hidden": status === "exit" || undefined, onAnimationEnd: handleAnimationEnd, children: entry.children }));
30
+ };
31
+ const Presence = (props) => {
32
+ const { children, itemKey, as: TagName = "span", className, itemClassName, enterClassName, exitClassName, attributes, } = props;
33
+ const idRef = React.useRef(0);
34
+ // Holds the children of the last committed render, which become the exiting ones on a key change
35
+ const childrenRef = React.useRef(children);
36
+ const [state, setState] = React.useState(() => ({ id: 0, key: itemKey, exiting: [] }));
37
+ // Rendering both children at the same time has to happen in the same pass as the key change,
38
+ // otherwise the previous children get unmounted before we can animate them out
39
+ if (state.key !== itemKey) {
40
+ idRef.current += 1;
41
+ setState({
42
+ id: idRef.current,
43
+ key: itemKey,
44
+ status: "enter",
45
+ exiting: [
46
+ // An item swapped back in before it finished exiting is replaced by the new one
47
+ ...state.exiting.filter((entry) => entry.key !== itemKey),
48
+ { id: state.id, key: state.key, children: childrenRef.current },
49
+ ],
50
+ });
51
+ }
52
+ const handleExited = React.useCallback((id) => {
53
+ setState((prevState) => ({
54
+ ...prevState,
55
+ exiting: prevState.exiting.filter((entry) => entry.id !== id),
56
+ }));
57
+ }, []);
58
+ useIsomorphicLayoutEffect(() => {
59
+ childrenRef.current = children;
60
+ });
61
+ const itemProps = {
62
+ as: TagName,
63
+ itemClassName,
64
+ enterClassName,
65
+ exitClassName,
66
+ onExited: handleExited,
67
+ };
68
+ return (_jsxs(TagName, { ...attributes, className: classNames(s.root, className), children: [state.exiting.map((entry) => (_jsx(PresenceItem, { entry: entry, status: "exit", ...itemProps }, entry.id))), _jsx(PresenceItem, { entry: { id: state.id, key: itemKey, children }, status: state.status, ...itemProps }, state.id)] }));
69
+ };
70
+ Presence.displayName = "Presence";
71
+ export default Presence;
@@ -0,0 +1 @@
1
+ .root{display:grid;grid-template-areas:"presence"}.item{grid-area:presence;min-width:0}.--exit{pointer-events:none}
@@ -0,0 +1,45 @@
1
+ import type React from "react";
2
+ import type { ClassName } from "@reshaped/utilities";
3
+ import type { Attributes } from "../../../types/global";
4
+ export type Status = "enter" | "exit";
5
+ export type Entry = {
6
+ id: number;
7
+ key: unknown;
8
+ children?: React.ReactNode;
9
+ };
10
+ export type State = {
11
+ /** Id of the currently rendered entry */
12
+ id: number;
13
+ /** Key the currently rendered entry was rendered with */
14
+ key: unknown;
15
+ /** Undefined until the first swap happens to avoid animating on mount */
16
+ status?: Status;
17
+ /** Entries kept mounted until their exit animation ends */
18
+ exiting: Entry[];
19
+ };
20
+ export type ItemProps = Pick<Props, "itemClassName" | "enterClassName" | "exitClassName"> & {
21
+ as: keyof React.JSX.IntrinsicElements;
22
+ entry: Entry;
23
+ status?: Status;
24
+ onExited: (id: number) => void;
25
+ };
26
+ export type Props<TagName extends keyof React.JSX.IntrinsicElements | void = void> = {
27
+ children?: React.ReactNode;
28
+ /**
29
+ * Identity of the current children, compared by reference.
30
+ * Changing it renders the previous and the next children at the same time
31
+ */
32
+ itemKey: unknown;
33
+ /** Render the root and every item as a different element */
34
+ as?: TagName extends keyof React.JSX.IntrinsicElements ? TagName : keyof React.JSX.IntrinsicElements;
35
+ /** Additional classname for the root element */
36
+ className?: ClassName;
37
+ /** Classname of every rendered item */
38
+ itemClassName?: ClassName;
39
+ /** Classname of the item animating in, added on every change except the first render */
40
+ enterClassName?: ClassName;
41
+ /** Classname of the item animating out, the item is removed when its animation ends */
42
+ exitClassName?: ClassName;
43
+ /** Additional attributes for the root element */
44
+ attributes?: Attributes<TagName>;
45
+ };
@@ -0,0 +1 @@
1
+ export { default } from "./Presence";
@@ -0,0 +1 @@
1
+ export { default } from "./Presence";
@@ -3,6 +3,16 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { activateKeyboardMode, deactivateKeyboardMode } from "@reshaped/utilities/internal";
5
5
  const ESC = "Escape";
6
+ const isEditing = (e) => {
7
+ const el = e.target;
8
+ if (!el?.tagName)
9
+ return false;
10
+ const tagName = el.tagName?.toLowerCase();
11
+ const editable = el.isContentEditable || tagName === "textarea" || tagName === "input";
12
+ if (!editable)
13
+ return false;
14
+ return e.isComposing || e.key.length === 1;
15
+ };
6
16
  const SingletonKeyboardModeContext = React.createContext({
7
17
  disabledRef: null,
8
18
  disable: () => { },
@@ -34,6 +44,8 @@ export const SingletonKeyboardModeProvider = (props) => {
34
44
  // Prevent focus ring from appearing when using mouse but closing with esc
35
45
  if (e.key === ESC)
36
46
  return;
47
+ if (isEditing(e))
48
+ return;
37
49
  activate();
38
50
  }, [activate]);
39
51
  const handleClick = React.useCallback(() => {
@@ -10,21 +10,19 @@ const useOnClickOutside = (refs, handler, options) => {
10
10
  * before we checked if it's inside the refs
11
11
  */
12
12
  const isMouseDownInsideRef = React.useRef(false);
13
+ const checkEventInsideRefs = (event) => {
14
+ const eventEl = event.composedPath()[0];
15
+ if (!eventEl)
16
+ return false;
17
+ return refs.some((elRef) => !!elRef.current && (elRef.current === eventEl || elRef.current.contains(eventEl)));
18
+ };
13
19
  React.useEffect(() => {
14
20
  /**
15
21
  * Not checking for disabled here since some components can enable the hook
16
22
  * after it was clicked
17
23
  */
18
24
  const handleMouseDown = (event) => {
19
- isMouseDownInsideRef.current = false;
20
- const clickedEl = event.composedPath()[0];
21
- refs.forEach((elRef) => {
22
- if (!elRef.current)
23
- return;
24
- if (elRef.current === clickedEl || elRef.current.contains(clickedEl)) {
25
- isMouseDownInsideRef.current = true;
26
- }
27
- });
25
+ isMouseDownInsideRef.current = checkEventInsideRefs(event);
28
26
  };
29
27
  const handleKeyDown = (event) => {
30
28
  if (![keys.ENTER, keys.SPACE].includes(event.key))
@@ -47,15 +45,25 @@ const useOnClickOutside = (refs, handler, options) => {
47
45
  if (disabled)
48
46
  return;
49
47
  const handleClick = (event) => {
50
- if ("button" in event && event.button === 2)
51
- return;
48
+ if (event.type === "contextmenu") {
49
+ /**
50
+ * Context menu events can be claimed by a handler that opens a menu of its own,
51
+ * which prevents the default browser behavior. Such events open a new flyout
52
+ * instead of dismissing the current one, so they're not outside clicks
53
+ */
54
+ if (event.defaultPrevented)
55
+ return;
56
+ isMouseDownInsideRef.current = checkEventInsideRefs(event);
57
+ }
52
58
  if (isMouseDownInsideRef.current)
53
59
  return;
54
60
  handlerRef.current?.(event);
55
61
  };
56
62
  document.addEventListener("click", handleClick);
63
+ document.addEventListener("contextmenu", handleClick);
57
64
  return () => {
58
65
  document.removeEventListener("click", handleClick);
66
+ document.removeEventListener("contextmenu", handleClick);
59
67
  };
60
68
  // oxlint-disable-next-line react-hooks/exhaustive-deps
61
69
  }, [handlerRef, disabled, ...refs]);
package/dist/index.d.ts CHANGED
@@ -90,8 +90,12 @@ export type { ActionableProps, ActionableRef } from "./components/Actionable";
90
90
  export { default as Actionable } from "./components/Actionable";
91
91
  export type { ContainerProps } from "./components/Container";
92
92
  export { default as Container } from "./components/Container";
93
+ export type { ContentToggleProps } from "./components/ContentToggle";
94
+ export { default as ContentToggle } from "./components/ContentToggle";
93
95
  export type { DismissibleProps } from "./components/Dismissible";
94
96
  export { default as Dismissible } from "./components/Dismissible";
97
+ export type { ExpandableProps } from "./components/Expandable";
98
+ export { default as Expandable } from "./components/Expandable";
95
99
  export type { FlyoutInstance, FlyoutProps, FlyoutTriggerAttributes } from "./components/Flyout";
96
100
  export { default as Flyout } from "./components/Flyout";
97
101
  export type { FormControlProps } from "./components/FormControl";
@@ -106,6 +110,8 @@ export type { HiddenVisuallyProps } from "./components/HiddenVisually";
106
110
  export { default as HiddenVisually } from "./components/HiddenVisually";
107
111
  export type { IconProps } from "./components/Icon";
108
112
  export { default as Icon } from "./components/Icon";
113
+ export type { IconToggleProps } from "./components/IconToggle";
114
+ export { default as IconToggle } from "./components/IconToggle";
109
115
  export type { ImageProps } from "./components/Image";
110
116
  export { default as Image } from "./components/Image";
111
117
  export type { OverlayProps } from "./components/Overlay";
package/dist/index.js CHANGED
@@ -41,7 +41,9 @@ export { default as Tooltip } from "./components/Tooltip";
41
41
  export { default as Accordion } from "./components/Accordion";
42
42
  export { default as Actionable } from "./components/Actionable";
43
43
  export { default as Container } from "./components/Container";
44
+ export { default as ContentToggle } from "./components/ContentToggle";
44
45
  export { default as Dismissible } from "./components/Dismissible";
46
+ export { default as Expandable } from "./components/Expandable";
45
47
  export { default as Flyout } from "./components/Flyout";
46
48
  export { default as FormControl } from "./components/FormControl";
47
49
  export { default as Grid } from "./components/Grid";
@@ -49,6 +51,7 @@ export { default as Hidden } from "./components/Hidden";
49
51
  export { default as HiddenInput } from "./components/HiddenInput";
50
52
  export { default as HiddenVisually } from "./components/HiddenVisually";
51
53
  export { default as Icon } from "./components/Icon";
54
+ export { default as IconToggle } from "./components/IconToggle";
52
55
  export { default as Image } from "./components/Image";
53
56
  export { default as Overlay } from "./components/Overlay";
54
57
  export { default as Reshaped } from "./components/Reshaped";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reshaped",
3
- "version": "4.2.0-canary.1",
3
+ "version": "4.2.0",
4
4
  "description": "Professionally crafted design system in React and Figma for building products of any scale and complexity",
5
5
  "keywords": [
6
6
  "accessibility",
@@ -80,8 +80,8 @@
80
80
  "cssnano": "8.0.2",
81
81
  "csstype": "3.2.3",
82
82
  "postcss-custom-media": "12.0.1",
83
- "@reshaped/utilities": "4.2.0-canary.1",
84
- "@reshaped/theming": "4.2.0-canary.1"
83
+ "@reshaped/theming": "4.2.0",
84
+ "@reshaped/utilities": "4.2.0"
85
85
  },
86
86
  "peerDependencies": {
87
87
  "postcss": "^8",
@@ -1,4 +0,0 @@
1
- import React from "react";
2
- import * as T from "./Expandable.types";
3
- declare const Expandable: React.FC<T.ContentProps>;
4
- export default Expandable;
@@ -1,58 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import React from "react";
4
- import { classNames } from "@reshaped/utilities";
5
- import useIsomorphicLayoutEffect from "../../../hooks/useIsomorphicLayoutEffect";
6
- import { onNextFrame, checkTransitions } from "../../../utilities/animation";
7
- import s from "./Expandable.module.css";
8
- const Expandable = (props) => {
9
- const { children, active, attributes } = props;
10
- const rootRef = React.useRef(null);
11
- const mountedRef = React.useRef(false);
12
- const [animatedHeight, setAnimatedHeight] = React.useState(active ? "auto" : null);
13
- const contentClassNames = classNames(s.root, animatedHeight !== null && animatedHeight !== 0 && s["--visible"], mountedRef.current && animatedHeight !== "auto" && s["--animated"]);
14
- const handleTransitionEnd = (e) => {
15
- if (e.propertyName !== "height")
16
- return;
17
- setAnimatedHeight(active ? "auto" : null);
18
- };
19
- // Avoid animations happening if component is active by default
20
- // onNextFrame lets us wait for the component to render first
21
- React.useEffect(() => {
22
- onNextFrame(() => {
23
- mountedRef.current = true;
24
- });
25
- }, []);
26
- useIsomorphicLayoutEffect(() => {
27
- const rootEl = rootRef.current;
28
- if (!rootEl || !mountedRef.current)
29
- return;
30
- if (!checkTransitions()) {
31
- setAnimatedHeight(active ? "auto" : null);
32
- return;
33
- }
34
- if (active) {
35
- rootEl.style.height = "auto";
36
- requestAnimationFrame(() => {
37
- const targetHeight = rootEl.clientHeight;
38
- rootEl.style.height = "0";
39
- requestAnimationFrame(() => {
40
- setAnimatedHeight(targetHeight);
41
- });
42
- });
43
- }
44
- else {
45
- rootEl.style.height = `${rootEl.clientHeight}px`;
46
- requestAnimationFrame(() => {
47
- setAnimatedHeight(0);
48
- });
49
- }
50
- }, [active]);
51
- return (_jsx("div", { ...attributes, className: contentClassNames, ref: rootRef, style: animatedHeight !== null
52
- ? { height: animatedHeight, overflow: animatedHeight === "auto" ? "visible" : undefined }
53
- : undefined, onTransitionEnd: handleTransitionEnd,
54
- // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role
55
- role: "region", hidden: !active && animatedHeight === null, children: children }));
56
- };
57
- Expandable.displayName = "Expandable";
58
- export default Expandable;
@@ -1 +0,0 @@
1
- .root{overflow:hidden;position:relative;height:0;opacity:0}.root.--visible{opacity:1}.root.--animated{transition:height var(--rs-duration-medium) var(--rs-easing-standard),opacity var(--rs-duration-medium) var(--rs-easing-standard)}
@@ -1,7 +0,0 @@
1
- import React from "react";
2
- import type { Attributes } from "../../../types/global";
3
- export type ContentProps = {
4
- active?: boolean;
5
- children?: React.ReactNode;
6
- attributes?: Attributes<"div">;
7
- };
@@ -1 +0,0 @@
1
- export { default } from "./Expandable";