Browse Source

refactoring

pull/5966/head
David Requeno 3 weeks ago
parent
commit
df2de50b8e
  1. 18
      libs/ui/src/lib/membership-card/membership-card.component.html
  2. 104
      libs/ui/src/lib/membership-card/membership-card.component.scss
  3. 12
      libs/ui/src/lib/membership-card/membership-card.component.stories.ts

18
libs/ui/src/lib/membership-card/membership-card.component.html

@ -1,8 +1,5 @@
<div class="card-wrapper" [class.hover-3d-enabled]="hover3d">
<div
class="card-container position-relative"
[ngClass]="{ premium: name === 'Premium' }"
>
<div class="card-wrapper position-relative" [class.hover-3d]="hover3d">
<div class="card-container" [ngClass]="{ premium: name === 'Premium' }">
<a
class="card-item d-flex flex-column justify-content-between p-4"
[routerLink]="routerLinkPricing"
@ -50,13 +47,8 @@
</a>
</div>
@if (hover3d) {
<div class="hover-zone"></div>
<div class="hover-zone"></div>
<div class="hover-zone"></div>
<div class="hover-zone"></div>
<div class="hover-zone"></div>
<div class="hover-zone"></div>
<div class="hover-zone"></div>
<div class="hover-zone"></div>
@for (zone of [1, 2, 3, 4, 5, 6, 7, 8]; track zone) {
<a class="hover-zone" [routerLink]="routerLinkPricing"></a>
}
}
</div>

104
libs/ui/src/lib/membership-card/membership-card.component.scss

@ -1,6 +1,8 @@
:host {
--borderRadius: 1rem;
--borderWidth: 2px;
--hover3dGradientOpacity: 0.15;
--hover3dGradientOpacityHover: 0.2;
display: block;
max-width: 25rem;
@ -8,12 +10,9 @@
width: 100%;
.card-wrapper {
position: relative;
&.hover-3d-enabled {
&.hover-3d {
perspective: 1000px;
}
}
.card-container {
border-radius: var(--borderRadius);
@ -27,8 +26,8 @@
content: '';
height: calc(100% + var(--borderWidth) * 2);
left: calc(-1 * var(--borderWidth));
top: calc(-1 * var(--borderWidth));
position: absolute;
top: calc(-1 * var(--borderWidth));
width: calc(100% + var(--borderWidth) * 2);
z-index: -1;
@ -78,63 +77,67 @@
}
}
.hover-3d-enabled {
&.hover-3d {
.card-container {
transition:
transform 300ms ease,
box-shadow 300ms ease;
position: relative;
transform-style: preserve-3d;
transition:
box-shadow 300ms ease,
transform 300ms ease;
will-change: transform;
position: relative;
.card-item {
pointer-events: none;
}
&::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
circle at 50% 0%,
rgba(255, 255, 255, 0.25),
rgba(255, 255, 255, var(--hover3dGradientOpacity)),
transparent 60%
);
opacity: 0;
border-radius: var(--borderRadius);
content: '';
inset: 0;
mix-blend-mode: screen;
transition: opacity 300ms ease;
opacity: 0;
pointer-events: none;
border-radius: var(--borderRadius);
position: absolute;
transition: opacity 300ms ease;
z-index: 1;
}
}
.hover-zone {
position: absolute;
width: 33.333%;
height: 33.333%;
pointer-events: auto;
position: absolute;
width: 33.333%;
z-index: 2;
&:nth-child(3) {
top: 0;
left: 0;
top: 0;
}
&:nth-child(4) {
top: 0;
left: 33.333%;
top: 0;
}
&:nth-child(5) {
top: 0;
right: 0;
top: 0;
}
&:nth-child(6) {
top: 33.333%;
left: 0;
top: 33.333%;
}
&:nth-child(7) {
top: 33.333%;
right: 0;
top: 33.333%;
}
&:nth-child(8) {
@ -154,131 +157,132 @@
}
&:has(.hover-zone:nth-child(3):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(5deg) rotateY(-5deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 0% 0%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
&:has(.hover-zone:nth-child(4):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(5deg) rotateY(0deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 50% 0%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
&:has(.hover-zone:nth-child(5):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(5deg) rotateY(5deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 100% 0%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
&:has(.hover-zone:nth-child(6):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(0deg) rotateY(-5deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 0% 50%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
&:has(.hover-zone:nth-child(7):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(0deg) rotateY(5deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 100% 50%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
&:has(.hover-zone:nth-child(8):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(-5deg) rotateY(-5deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 0% 100%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
&:has(.hover-zone:nth-child(9):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(-5deg) rotateY(0deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 50% 100%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
&:has(.hover-zone:nth-child(10):hover) .card-container {
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
transform: perspective(1000px) rotateX(-5deg) rotateY(5deg)
translateY(-2px);
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.3);
&::before {
opacity: 1;
background: radial-gradient(
circle at 100% 100%,
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, var(--hover3dGradientOpacityHover)),
transparent 60%
);
opacity: 1;
}
}
}
}
@media (prefers-reduced-motion: reduce) {
.hover-3d-enabled {
.card-wrapper.hover-3d {
.card-container {
transition: none !important;
transform: none !important;
transition: none !important;
&::before {
transition: none !important;

12
libs/ui/src/lib/membership-card/membership-card.component.stories.ts

@ -26,12 +26,12 @@ export default {
})
],
argTypes: {
hover3d: {
control: { type: 'boolean' }
},
name: {
control: { type: 'select' },
options: ['Basic', 'Premium']
},
hover3d: {
control: { type: 'boolean' }
}
}
} as Meta<GfMembershipCardComponent>;
@ -40,8 +40,7 @@ type Story = StoryObj<GfMembershipCardComponent>;
export const Basic: Story = {
args: {
name: 'Basic',
hover3d: false
name: 'Basic'
}
};
@ -49,7 +48,6 @@ export const Premium: Story = {
args: {
expiresAt: addYears(new Date(), 1).toLocaleDateString(),
hasPermissionToCreateApiKey: true,
name: 'Premium',
hover3d: false
name: 'Premium'
}
};

Loading…
Cancel
Save