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.
- package/dist/bundle.css +1 -1
- package/dist/bundle.d.ts +6 -0
- package/dist/bundle.js +2 -2
- package/dist/components/Accordion/AccordionContent.js +1 -1
- package/dist/components/Badge/Badge.js +4 -1
- package/dist/components/Badge/Badge.module.css +1 -1
- package/dist/components/Badge/tests/Badge.stories.d.ts +4 -0
- package/dist/components/Badge/tests/Badge.stories.js +48 -1
- package/dist/components/Button/Button.js +2 -0
- package/dist/components/Button/Button.module.css +1 -1
- package/dist/components/Button/tests/Button.stories.js +1 -0
- package/dist/components/ContentToggle/ContentToggle.d.ts +4 -0
- package/dist/components/ContentToggle/ContentToggle.js +12 -0
- package/dist/components/ContentToggle/ContentToggle.module.css +1 -0
- package/dist/components/ContentToggle/ContentToggle.types.d.ts +16 -0
- package/dist/components/ContentToggle/index.d.ts +2 -0
- package/dist/components/ContentToggle/index.js +1 -0
- package/dist/components/ContentToggle/tests/ContentToggle.stories.d.ts +10 -0
- package/dist/components/ContentToggle/tests/ContentToggle.stories.js +75 -0
- package/dist/components/ContextMenu/ContextMenu.js +5 -4
- package/dist/components/ContextMenu/ContextMenu.types.d.ts +5 -1
- package/dist/components/ContextMenu/tests/ContextMenu.stories.d.ts +11 -7
- package/dist/components/ContextMenu/tests/ContextMenu.stories.js +18 -1
- package/dist/components/DropdownMenu/DropdownMenu.context.d.ts +11 -0
- package/dist/components/DropdownMenu/DropdownMenu.context.js +19 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +6 -4
- package/dist/components/DropdownMenu/DropdownMenu.types.d.ts +9 -0
- package/dist/components/DropdownMenu/tests/DropdownMenu.stories.d.ts +1 -0
- package/dist/components/DropdownMenu/tests/DropdownMenu.stories.js +22 -1
- package/dist/components/Expandable/Expandable.d.ts +4 -0
- package/dist/components/Expandable/Expandable.js +85 -0
- package/dist/components/Expandable/Expandable.module.css +1 -0
- package/dist/components/Expandable/Expandable.types.d.ts +18 -0
- package/dist/components/Expandable/Expandable.types.js +1 -0
- package/dist/components/Expandable/index.d.ts +2 -0
- package/dist/components/Expandable/tests/Expandable.stories.d.ts +12 -0
- package/dist/components/Expandable/tests/Expandable.stories.js +82 -0
- package/dist/components/IconToggle/IconToggle.d.ts +4 -0
- package/dist/components/IconToggle/IconToggle.js +13 -0
- package/dist/components/IconToggle/IconToggle.module.css +1 -0
- package/dist/components/IconToggle/IconToggle.types.d.ts +5 -0
- package/dist/components/IconToggle/IconToggle.types.js +1 -0
- package/dist/components/IconToggle/index.d.ts +2 -0
- package/dist/components/IconToggle/index.js +1 -0
- package/dist/components/IconToggle/tests/IconToggle.stories.d.ts +10 -0
- package/dist/components/IconToggle/tests/IconToggle.stories.js +24 -0
- package/dist/components/Image/Image.js +14 -0
- package/dist/components/Link/Link.d.ts +1 -1
- package/dist/components/Link/Link.js +2 -2
- package/dist/components/Link/Link.types.d.ts +1 -1
- package/dist/components/Link/tests/Link.stories.d.ts +2 -1
- package/dist/components/Link/tests/Link.stories.js +7 -1
- package/dist/components/MenuItem/MenuItem.js +14 -2
- package/dist/components/MenuItem/MenuItem.module.css +1 -1
- package/dist/components/Select/Select.module.css +1 -1
- package/dist/components/Select/SelectStartContent.js +2 -0
- package/dist/components/Tabs/Tabs.module.css +1 -1
- package/dist/components/Tabs/TabsItem.js +6 -1
- package/dist/components/TextField/TextField.js +2 -0
- package/dist/components/TextField/TextField.module.css +1 -1
- package/dist/components/_private/Presence/Presence.d.ts +7 -0
- package/dist/components/_private/Presence/Presence.js +71 -0
- package/dist/components/_private/Presence/Presence.module.css +1 -0
- package/dist/components/_private/Presence/Presence.types.d.ts +45 -0
- package/dist/components/_private/Presence/Presence.types.js +1 -0
- package/dist/components/_private/Presence/index.d.ts +1 -0
- package/dist/components/_private/Presence/index.js +1 -0
- package/dist/hooks/_internal/useSingletonKeyboardMode.js +12 -0
- package/dist/hooks/useOnClickOutside.js +19 -11
- package/dist/index.d.ts +6 -0
- package/dist/index.js +3 -0
- package/package.json +3 -3
- package/dist/components/_private/Expandable/Expandable.d.ts +0 -4
- package/dist/components/_private/Expandable/Expandable.js +0 -58
- package/dist/components/_private/Expandable/Expandable.module.css +0 -1
- package/dist/components/_private/Expandable/Expandable.types.d.ts +0 -7
- package/dist/components/_private/Expandable/index.d.ts +0 -1
- /package/dist/components/{_private/Expandable/Expandable.types.js → ContentToggle/ContentToggle.types.js} +0 -0
- /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 {};
|
|
@@ -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 =
|
|
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 (
|
|
51
|
-
|
|
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
|
|
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/
|
|
84
|
-
"@reshaped/
|
|
83
|
+
"@reshaped/theming": "4.2.0",
|
|
84
|
+
"@reshaped/utilities": "4.2.0"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
87
|
"postcss": "^8",
|
|
@@ -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 +0,0 @@
|
|
|
1
|
-
export { default } from "./Expandable";
|
|
File without changes
|
|
File without changes
|