From 136733b867cd9fec2000166390058eb673377378 Mon Sep 17 00:00:00 2001
From: Craig Palermo <3260642+craigpalermo@users.noreply.github.com>
Date: Wed, 24 Jul 2024 11:23:00 -0400
Subject: [PATCH] Refactor Popover using Radix UI (#1504)
---
.../popover-refactor_2024-07-17-12-56.json | 10 +
common/config/rush/pnpm-lock.yaml | 422 ++++++++++++++++--
packages/core/config/jest.config.json | 6 +-
packages/core/package.json | 1 +
packages/core/src/CloseButton/CloseButton.tsx | 2 +
packages/core/src/Popover/Overlay.tsx | 33 ++
.../core/src/Popover/Popover.stories.args.tsx | 97 ++++
packages/core/src/Popover/Popover.stories.tsx | 69 +++
packages/core/src/Popover/Popover.styles.tsx | 12 +
packages/core/src/Popover/Popover.tsx | 165 +++++++
packages/core/src/index.ts | 1 +
tools/eslint-config/index.js | 7 +-
12 files changed, 784 insertions(+), 41 deletions(-)
create mode 100644 common/changes/pcln-design-system/popover-refactor_2024-07-17-12-56.json
create mode 100644 packages/core/src/Popover/Overlay.tsx
create mode 100644 packages/core/src/Popover/Popover.stories.args.tsx
create mode 100644 packages/core/src/Popover/Popover.stories.tsx
create mode 100644 packages/core/src/Popover/Popover.styles.tsx
create mode 100644 packages/core/src/Popover/Popover.tsx
diff --git a/common/changes/pcln-design-system/popover-refactor_2024-07-17-12-56.json b/common/changes/pcln-design-system/popover-refactor_2024-07-17-12-56.json
new file mode 100644
index 0000000000..270b8f1b06
--- /dev/null
+++ b/common/changes/pcln-design-system/popover-refactor_2024-07-17-12-56.json
@@ -0,0 +1,10 @@
+{
+ "changes": [
+ {
+ "packageName": "pcln-design-system",
+ "comment": "Create new Popover using Radix UI",
+ "type": "minor"
+ }
+ ],
+ "packageName": "pcln-design-system"
+}
\ No newline at end of file
diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml
index e97c673c36..a9ef41de32 100644
--- a/common/config/rush/pnpm-lock.yaml
+++ b/common/config/rush/pnpm-lock.yaml
@@ -458,6 +458,9 @@ importers:
'@radix-ui/react-dialog':
specifier: ^1.0.5
version: 1.0.5(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-popover':
+ specifier: ^1.0.5
+ version: 1.1.1(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-tabs':
specifier: ^1.0.4
version: 1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
@@ -1535,7 +1538,7 @@ packages:
dependencies:
'@babel/compat-data': 7.23.5
'@babel/helper-validator-option': 7.23.5
- browserslist: 4.23.0
+ browserslist: 4.23.2
lru-cache: 5.1.1
semver: 6.3.1
@@ -1545,7 +1548,7 @@ packages:
dependencies:
'@babel/compat-data': 7.23.5
'@babel/helper-validator-option': 7.23.5
- browserslist: 4.23.0
+ browserslist: 4.23.2
lru-cache: 5.1.1
semver: 6.3.1
@@ -4188,7 +4191,6 @@ packages:
'@floating-ui/dom': 1.5.3
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- dev: true
/@floating-ui/utils@0.1.6:
resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==}
@@ -4928,6 +4930,10 @@ packages:
dependencies:
'@babel/runtime': 7.23.5
+ /@radix-ui/primitive@1.1.0:
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
+ dev: false
+
/@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==}
peerDependencies:
@@ -4978,6 +4984,26 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: true
+ /@radix-ui/react-arrow@1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==}
peerDependencies:
@@ -5042,6 +5068,19 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-compose-refs@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-context@1.0.1(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
peerDependencies:
@@ -5055,6 +5094,19 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-context@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==}
peerDependencies:
@@ -5152,6 +5204,30 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
peerDependencies:
@@ -5165,6 +5241,19 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-focus-guards@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==}
peerDependencies:
@@ -5211,6 +5300,28 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-id@1.0.1(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
peerDependencies:
@@ -5225,6 +5336,54 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-id@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
+ /@radix-ui/react-popover@1.1.1(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ aria-hidden: 1.2.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-remove-scroll: 2.5.7(@types/react@18.2.42)(react@18.2.0)
+ dev: false
+
/@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==}
peerDependencies:
@@ -5255,6 +5414,35 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: true
+ /@radix-ui/react-popper@1.2.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/rect': 1.1.0
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==}
peerDependencies:
@@ -5297,6 +5485,27 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-portal@1.1.1(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
peerDependencies:
@@ -5319,6 +5528,27 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-presence@1.1.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
peerDependencies:
@@ -5339,6 +5569,26 @@ packages:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
+ /@radix-ui/react-primitive@2.0.0(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ '@types/react-dom': 18.2.17
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==}
peerDependencies:
@@ -5443,6 +5693,20 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-slot@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==}
peerDependencies:
@@ -5561,6 +5825,19 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
peerDependencies:
@@ -5575,6 +5852,20 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
peerDependencies:
@@ -5589,6 +5880,20 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
peerDependencies:
@@ -5602,6 +5907,19 @@ packages:
'@types/react': 18.2.42
react: 18.2.0
+ /@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-previous@1.0.1(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==}
peerDependencies:
@@ -5631,6 +5949,20 @@ packages:
react: 18.2.0
dev: true
+ /@radix-ui/react-use-rect@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-use-size@1.0.1(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
peerDependencies:
@@ -5646,6 +5978,20 @@ packages:
react: 18.2.0
dev: true
+ /@radix-ui/react-use-size@1.1.0(@types/react@18.2.42)(react@18.2.0):
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.42)(react@18.2.0)
+ '@types/react': 18.2.42
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.17)(@types/react@18.2.42)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
peerDependencies:
@@ -5672,6 +6018,10 @@ packages:
'@babel/runtime': 7.23.5
dev: true
+ /@radix-ui/rect@1.1.0:
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+ dev: false
+
/@reach/component-component@0.16.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-GZSQyEGGBhgu2b/wSWBWARHFiq/861XDce69AdS65Ev5h7N62bME5Cneh/P6mj7Hvxmiq6GaltMrN98xqH3+9Q==}
peerDependencies:
@@ -5706,7 +6056,7 @@ packages:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-focus-lock: 2.9.6(react@18.2.0)
- react-remove-scroll: 2.5.7(react@18.2.0)
+ react-remove-scroll: 2.5.7(@types/react@18.2.42)(react@18.2.0)
tslib: 2.6.2
transitivePeerDependencies:
- '@types/react'
@@ -10113,8 +10463,8 @@ packages:
peerDependencies:
postcss: ^8.1.0
dependencies:
- browserslist: 4.23.0
- caniuse-lite: 1.0.30001625
+ browserslist: 4.23.2
+ caniuse-lite: 1.0.30001642
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
@@ -10465,15 +10815,15 @@ packages:
pako: 0.2.9
dev: true
- /browserslist@4.23.0:
- resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
+ /browserslist@4.23.2:
+ resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
- caniuse-lite: 1.0.30001625
- electron-to-chromium: 1.4.786
+ caniuse-lite: 1.0.30001642
+ electron-to-chromium: 1.4.829
node-releases: 2.0.14
- update-browserslist-db: 1.0.13(browserslist@4.23.0)
+ update-browserslist-db: 1.1.0(browserslist@4.23.2)
/bser@2.1.1:
resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
@@ -10588,13 +10938,13 @@ packages:
/caniuse-api@3.0.0:
resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
dependencies:
- browserslist: 4.23.0
- caniuse-lite: 1.0.30001625
+ browserslist: 4.23.2
+ caniuse-lite: 1.0.30001642
lodash.memoize: 4.1.2
lodash.uniq: 4.5.0
- /caniuse-lite@1.0.30001625:
- resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==}
+ /caniuse-lite@1.0.30001642:
+ resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==}
/cat-names@3.1.0:
resolution: {integrity: sha512-cW5oH6EdBF8g/XovpPyM/5CHne6tsX63IBqGVpeZxDcHrIUpqmbXhRkptsMwHXiwSyDd+/bEndsib3kn4Q1qtQ==}
@@ -10963,7 +11313,7 @@ packages:
/core-js-compat@3.34.0:
resolution: {integrity: sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==}
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
/core-js@2.6.12:
resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==}
@@ -11681,8 +12031,8 @@ packages:
jake: 10.8.7
dev: true
- /electron-to-chromium@1.4.786:
- resolution: {integrity: sha512-i/A2UB0sxYViMN0M2zIotQFRIOt1jLuVXudACHBDiJ5gGuAUzf/crZxwlBTdA0O52Hy4CNtTzS7AKRAacs/08Q==}
+ /electron-to-chromium@1.4.829:
+ resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==}
/emittery@0.13.1:
resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
@@ -11896,6 +12246,10 @@ packages:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
+ /escalade@3.1.2:
+ resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ engines: {node: '>=6'}
+
/escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
@@ -16034,6 +16388,9 @@ packages:
/picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ /picocolors@1.0.1:
+ resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
@@ -16116,7 +16473,7 @@ packages:
peerDependencies:
postcss: ^8.2.15
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
caniuse-api: 3.0.0
colord: 2.9.3
postcss: 8.4.32
@@ -16128,7 +16485,7 @@ packages:
peerDependencies:
postcss: ^8.2.15
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
postcss: 8.4.32
postcss-value-parser: 4.2.0
@@ -16193,7 +16550,7 @@ packages:
peerDependencies:
postcss: ^8.2.15
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
caniuse-api: 3.0.0
cssnano-utils: 3.1.0(postcss@8.4.32)
postcss: 8.4.32
@@ -16225,7 +16582,7 @@ packages:
peerDependencies:
postcss: ^8.2.15
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
cssnano-utils: 3.1.0(postcss@8.4.32)
postcss: 8.4.32
postcss-value-parser: 4.2.0
@@ -16388,7 +16745,7 @@ packages:
peerDependencies:
postcss: ^8.2.15
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
postcss: 8.4.32
postcss-value-parser: 4.2.0
@@ -16427,7 +16784,7 @@ packages:
peerDependencies:
postcss: ^8.2.15
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
caniuse-api: 3.0.0
postcss: 8.4.32
@@ -16985,7 +17342,7 @@ packages:
use-callback-ref: 1.3.0(@types/react@18.2.42)(react@18.2.0)
use-sidecar: 1.1.2(@types/react@18.2.42)(react@18.2.0)
- /react-remove-scroll@2.5.7(react@18.2.0):
+ /react-remove-scroll@2.5.7(@types/react@18.2.42)(react@18.2.0):
resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
engines: {node: '>=10'}
peerDependencies:
@@ -16995,6 +17352,7 @@ packages:
'@types/react':
optional: true
dependencies:
+ '@types/react': 18.2.42
react: 18.2.0
react-remove-scroll-bar: 2.3.4(@types/react@18.2.42)(react@18.2.0)
react-style-singleton: 2.2.1(@types/react@18.2.42)(react@18.2.0)
@@ -18238,7 +18596,7 @@ packages:
peerDependencies:
postcss: ^8.2.15
dependencies:
- browserslist: 4.23.0
+ browserslist: 4.23.2
postcss: 8.4.32
postcss-selector-parser: 6.0.13
@@ -18932,15 +19290,15 @@ packages:
engines: {node: '>=8'}
dev: true
- /update-browserslist-db@1.0.13(browserslist@4.23.0):
- resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ /update-browserslist-db@1.1.0(browserslist@4.23.2):
+ resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
hasBin: true
peerDependencies:
browserslist: latest
dependencies:
- browserslist: 4.23.0
- escalade: 3.1.1
- picocolors: 1.0.0
+ browserslist: 4.23.2
+ escalade: 3.1.2
+ picocolors: 1.0.1
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -19339,7 +19697,7 @@ packages:
'@webassemblyjs/wasm-parser': 1.11.6
acorn: 8.11.2
acorn-import-assertions: 1.9.0(acorn@8.11.2)
- browserslist: 4.23.0
+ browserslist: 4.23.2
chrome-trace-event: 1.0.3
enhanced-resolve: 5.15.0
es-module-lexer: 1.4.1
diff --git a/packages/core/config/jest.config.json b/packages/core/config/jest.config.json
index 94ba6036a4..1a388c20a8 100644
--- a/packages/core/config/jest.config.json
+++ b/packages/core/config/jest.config.json
@@ -2,10 +2,10 @@
"extends": "@priceline/heft-component-rig/profiles/react/config/jest.config.json",
"coverageThreshold": {
"global": {
- "statements": 94,
+ "statements": 93,
"branches": 88,
- "functions": 88,
- "lines": 94
+ "functions": 87,
+ "lines": 93
}
}
}
diff --git a/packages/core/package.json b/packages/core/package.json
index b5f4129a06..4d8112b686 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -76,6 +76,7 @@
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-tabs": "^1.0.4",
"@radix-ui/react-visually-hidden": "^1.0.3",
+ "@radix-ui/react-popover": "^1.0.5",
"@styled-system/theme-get": "^5.1.2",
"@types/styled-system": "^5.1.22",
"deepmerge": "^4.3.1",
diff --git a/packages/core/src/CloseButton/CloseButton.tsx b/packages/core/src/CloseButton/CloseButton.tsx
index 0c3a65d40f..efb7126692 100644
--- a/packages/core/src/CloseButton/CloseButton.tsx
+++ b/packages/core/src/CloseButton/CloseButton.tsx
@@ -24,6 +24,7 @@ export type CloseButtonProps = IStyledSystemProps & {
size?: CloseButtonSize
title?: string
variant?: CloseButtonVariant
+ as?: unknown
}
/** @public */
@@ -42,6 +43,7 @@ export const CloseButton = ({
size = 'md',
title = 'close',
variant,
+ as,
...props
}: MotionButtonProps) => {
const [hover, setHover] = useState(false)
diff --git a/packages/core/src/Popover/Overlay.tsx b/packages/core/src/Popover/Overlay.tsx
new file mode 100644
index 0000000000..e0aa43f16b
--- /dev/null
+++ b/packages/core/src/Popover/Overlay.tsx
@@ -0,0 +1,33 @@
+import React from 'react'
+import styled from 'styled-components'
+import { Box } from '../Box/Box'
+
+const StyledOverlay = styled(Box)`
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ opacity: ${({ overlayOpacity }) => overlayOpacity};
+ cursor: pointer;
+ display: ${({ popoverOpen }) => (popoverOpen ? 'block' : 'none')};
+`
+
+export type OverlayProps = {
+ overlayOpacity?: number
+ zIndex?: number
+}
+
+const Overlay = ({ overlayOpacity, isOpen }) => {
+ return (
+
+ )
+}
+
+export default Overlay
diff --git a/packages/core/src/Popover/Popover.stories.args.tsx b/packages/core/src/Popover/Popover.stories.args.tsx
new file mode 100644
index 0000000000..b38fda20ee
--- /dev/null
+++ b/packages/core/src/Popover/Popover.stories.args.tsx
@@ -0,0 +1,97 @@
+import React from 'react'
+import { action } from '@storybook/addon-actions'
+import { Button, IconButton } from '..'
+import { InformationOutline } from 'pcln-icons'
+
+const Children = {
+ Button: ,
+ Icon: (
+ }
+ title='More Information'
+ type='button'
+ />
+ ),
+}
+
+export const defaultArgs = {
+ borderRadius: 'lg',
+ children: 'Button',
+ openOnFocus: false,
+ placement: 'top',
+ onClose: action('Popover Close'),
+ onOpen: action('Popover Open'),
+ disableFloating: false,
+}
+
+export const argTypes = {
+ children: {
+ options: Object.keys(Children),
+ mapping: Children,
+ control: {
+ type: 'select',
+ },
+ },
+ color: {
+ type: 'string',
+ },
+ disableFloating: {
+ name: 'disableFloating',
+ description: 'Disable floating-ui',
+ table: {
+ defaultValue: { summary: 'Sets crossAxis and mainAxis in the floating-ui' },
+ },
+ type: { name: 'boolean', required: false },
+ control: { type: 'boolean' },
+ },
+ width: {
+ name: 'width',
+ type: { name: 'string', required: false },
+ description: 'Popover width',
+ },
+ onClose: { action: true },
+ onMinimize: { action: true },
+ placement: {
+ name: 'placement',
+ type: { name: 'string', required: true },
+ options: [
+ 'top',
+ 'top-start',
+ 'top-end',
+ 'bottom',
+ 'bottom-start',
+ 'bottom-end',
+ 'left',
+ 'left-start',
+ 'left-end',
+ 'right',
+ 'right-start',
+ 'right-end',
+ ],
+ control: { type: 'select' },
+ },
+ overlayOpacity: {
+ name: 'overlayOpacity',
+ type: { name: 'number', required: false },
+ description: 'Overlay opacity',
+ control: { type: 'number' },
+ },
+ toggleIsOpenOnClick: {
+ name: 'toggleIsOpenOnClick',
+ type: { name: 'boolean', required: false },
+ description: 'Toggle isOpen on click',
+ control: { type: 'boolean' },
+ },
+ isOpen: {
+ name: 'isOpen',
+ type: { name: 'boolean', required: false },
+ description: 'Is the popover open?',
+ control: { type: 'boolean' },
+ },
+ openOnHover: {
+ name: 'openOnHover',
+ type: { name: 'boolean', required: false },
+ description: 'Open the popover when trigger is hovered',
+ control: { type: 'boolean' },
+ },
+}
diff --git a/packages/core/src/Popover/Popover.stories.tsx b/packages/core/src/Popover/Popover.stories.tsx
new file mode 100644
index 0000000000..37b68c0a8c
--- /dev/null
+++ b/packages/core/src/Popover/Popover.stories.tsx
@@ -0,0 +1,69 @@
+import { Button, Flex, Text, ThemeProvider } from '..'
+import React from 'react'
+import { Popover } from './Popover'
+import { argTypes, defaultArgs } from './Popover.stories.args'
+import { action } from '@storybook/addon-actions'
+
+export default {
+ title: 'Popover',
+ component: Popover,
+ args: defaultArgs,
+ argTypes: argTypes,
+}
+
+const TemplateContent = ({ ...args }) => (
+
+ (
+ e.stopPropagation()}>
+
+ Tip:
+
+
+ Use arrow keys to navigate the calendar
+
+
+ )}
+ overlayOpacity={0.3}
+ width={350}
+ p={2}
+ {...args}
+ >
+
+
+
+)
+
+const BaseTemplate = ({ children, theme, ...args }) => {
+ return
+}
+
+export const _Popover = BaseTemplate.bind({})
+
+export const OpenOnMount = BaseTemplate.bind({})
+OpenOnMount.args = { openOnMount: true }
+
+export const CustomPlacement = BaseTemplate.bind({})
+CustomPlacement.args = { placement: 'bottom-end', openOnMount: true }
+
+export const ForcedOpen = BaseTemplate.bind({})
+ForcedOpen.args = { isOpen: true }
+
+export const WithoutOverlay = BaseTemplate.bind({})
+WithoutOverlay.args = { hideOverlay: true, openOnMount: true }
+
+const CustomThemeTemplate = ({ children, theme, ...args }) => {
+ return (
+
+
+
+ )
+}
+
+export const ContentUsesContextualTheme = CustomThemeTemplate.bind({})
+ContentUsesContextualTheme.args = { openOnMount: true }
diff --git a/packages/core/src/Popover/Popover.styles.tsx b/packages/core/src/Popover/Popover.styles.tsx
new file mode 100644
index 0000000000..6228e9e511
--- /dev/null
+++ b/packages/core/src/Popover/Popover.styles.tsx
@@ -0,0 +1,12 @@
+import styled from 'styled-components'
+import { getPaletteColor } from '../utils'
+
+export const FixedCloseButton = styled.div`
+ position: fixed;
+ top: 4px;
+ right: 4px;
+`
+
+export const StyledArrow = styled.div`
+ fill: ${({ color }) => getPaletteColor(color)};
+`
diff --git a/packages/core/src/Popover/Popover.tsx b/packages/core/src/Popover/Popover.tsx
new file mode 100644
index 0000000000..afd16478f1
--- /dev/null
+++ b/packages/core/src/Popover/Popover.tsx
@@ -0,0 +1,165 @@
+import * as Popover from '@radix-ui/react-popover'
+import React, { useEffect, useRef } from 'react'
+import { SpaceProps } from 'styled-system'
+import { useTheme } from 'styled-components'
+import { Box, BoxProps } from '../Box/Box'
+import { CloseButton } from '../CloseButton/CloseButton'
+import { ThemeProvider } from '../ThemeProvider/ThemeProvider'
+import Overlay from './Overlay'
+import { FixedCloseButton, StyledArrow } from './Popover.styles'
+
+export type PopoverProps = {
+ renderContent: () => React.ReactNode
+ idx: string
+ isOpen?: boolean
+ color?: string
+ children?: React.ReactNode
+ hideArrow?: boolean
+ hideOverlay?: boolean
+ onOpen?: () => void
+ onClose?: () => void
+ openOnHover?: boolean
+ borderRadius?: BoxProps['borderRadius']
+ width?: string | number
+ trapFocus?: boolean
+ toggleIsOpenOnClick?: boolean
+ openOnMount?: boolean
+ overlayOpacity?: number
+ p?: SpaceProps['p']
+ placement?:
+ | 'top'
+ | 'top-start'
+ | 'top-end'
+ | 'bottom'
+ | 'bottom-start'
+ | 'bottom-end'
+ | 'left'
+ | 'left-start'
+ | 'left-end'
+ | 'right'
+ | 'right-start'
+ | 'right-end'
+}
+
+function parsePlacement(placement: PopoverProps['placement']): {
+ side: 'top' | 'bottom' | 'left' | 'right'
+ align: 'start' | 'end' | 'center'
+} {
+ const match = /([a-z]+)-?([a-z]+)?/.exec(placement)
+ if (match) {
+ return {
+ // @ts-ignore
+ side: match[1],
+ // @ts-ignore
+ align: match[2],
+ }
+ }
+}
+
+const DsPopover = ({
+ borderRadius = 'xl',
+ children,
+ color = 'background.lightest',
+ hideArrow,
+ hideOverlay = false,
+ idx,
+ isOpen,
+ onClose,
+ onOpen,
+ openOnMount,
+ openOnHover,
+ overlayOpacity = 0.5,
+ p,
+ placement = 'top',
+ toggleIsOpenOnClick = true,
+ renderContent: RenderContent,
+ width,
+}: PopoverProps) => {
+ const [isOpenState, setIsOpenState] = React.useState(openOnMount || isOpen)
+ const theme = useTheme()
+ const firstUpdate = useRef(true)
+
+ useEffect(() => {
+ // When using openOnMount, we don't want to update the open state on the first render.
+ // This would cause the overlay to be hidden if isOpen is falsy.
+ if (firstUpdate.current) {
+ firstUpdate.current = false
+ return
+ }
+
+ if (isOpen !== isOpenState) {
+ setIsOpenState(isOpen)
+ }
+ }, [isOpen])
+
+ function handleOnOpenChange(open: boolean) {
+ // Handle the controlled state when we want to force the popover open
+ if (isOpen) {
+ return
+ }
+
+ setIsOpenState(open)
+ if (open) {
+ onOpen?.()
+ } else {
+ onClose?.()
+ }
+ }
+
+ function handleTriggerClick(event) {
+ if (!toggleIsOpenOnClick) {
+ event.preventDefault()
+ }
+ }
+
+ function handleMouseEnter() {
+ if (openOnHover) {
+ setIsOpenState(true)
+ }
+ }
+
+ function handleMouseLeave() {
+ if (openOnHover) {
+ setIsOpenState(false)
+ }
+ }
+
+ const { side, align } = parsePlacement(placement)
+
+ return (
+
+
+ {children}
+
+
+
+
+
+
+
+
+
+
+ {!hideArrow && }
+
+
+
+
+ {!(hideOverlay || openOnHover) && }
+
+ )
+}
+
+// Old Popover props todo:
+// onBeforeOpen: PropTypes.func,
+// onBeforeClose: PropTypes.func,
+
+// Currently broken in plcn-popover:
+// borderColor: PropTypes.string,
+
+export { DsPopover as Popover }
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index 78f1ede705..3f283790e9 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -113,6 +113,7 @@ export {
export { Motion, type MotionProps } from './Motion/Motion'
export { PasswordInput, type PasswordInputProps } from './PasswordInput/PasswordInput'
export { PlaceholderImage, type PlaceholderImageProps } from './PlaceholderImage/PlaceholderImage'
+export { Popover, type PopoverProps } from './Popover/Popover'
export { Popout, type PopoutProps } from './Popout/Popout'
export { ProgressBar, type ProgressBarProps } from './ProgressBar/ProgressBar'
export { Radio, type RadioProps } from './Radio/Radio'
diff --git a/tools/eslint-config/index.js b/tools/eslint-config/index.js
index 5ced8ccc2a..c7f895d3d7 100644
--- a/tools/eslint-config/index.js
+++ b/tools/eslint-config/index.js
@@ -30,12 +30,7 @@ module.exports = {
'progress/activate': 0,
// React
- 'react/prop-types': [
- 'error',
- {
- ignore: ['children'],
- },
- ],
+ 'react/prop-types': 'off',
'react/jsx-curly-brace-presence': [2, { props: 'never', children: 'never' }],
// React hooks