mirror of https://github.com/ghostfolio/ghostfolio
Browse Source
- Add @Input() hover3d property to enable/disable 3D hover effect - Implement 8 hover zones for dynamic 3D tilt effect - Add CSS-only 3D transformations based on mouse position - Update Storybook stories with hover3dpull/5966/head
4 changed files with 285 additions and 46 deletions
@ -1,50 +1,62 @@ |
|||||
<div |
<div class="card-wrapper" [class.hover-3d-enabled]="hover3d"> |
||||
class="card-container position-relative" |
<div |
||||
[ngClass]="{ premium: name === 'Premium' }" |
class="card-container position-relative" |
||||
> |
[ngClass]="{ premium: name === 'Premium' }" |
||||
<a |
|
||||
class="card-item d-flex flex-column justify-content-between p-4" |
|
||||
[routerLink]="routerLinkPricing" |
|
||||
> |
> |
||||
<div class="d-flex justify-content-end"> |
<a |
||||
<gf-logo |
class="card-item d-flex flex-column justify-content-between p-4" |
||||
size="large" |
[routerLink]="routerLinkPricing" |
||||
[ngClass]="{ 'text-muted': name === 'Basic' }" |
> |
||||
[showLabel]="false" |
<div class="d-flex justify-content-end"> |
||||
/> |
<gf-logo |
||||
</div> |
size="large" |
||||
@if (hasPermissionToCreateApiKey) { |
[ngClass]="{ 'text-muted': name === 'Basic' }" |
||||
<div class="mt-5"> |
[showLabel]="false" |
||||
<div class="heading text-muted" i18n>API Key</div> |
/> |
||||
<div class="align-items-center d-flex"> |
|
||||
<div class="text-monospace value">* * * * * * * * *</div> |
|
||||
<div class="ml-1"> |
|
||||
<button |
|
||||
class="no-min-width" |
|
||||
i18n-title |
|
||||
mat-button |
|
||||
title="Generate Ghostfolio Premium Data Provider API key for self-hosted environments..." |
|
||||
(click)="onGenerateApiKey($event)" |
|
||||
> |
|
||||
<ion-icon name="refresh-outline" /> |
|
||||
</button> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
</div> |
||||
} |
@if (hasPermissionToCreateApiKey) { |
||||
<div class="d-flex justify-content-between"> |
<div class="mt-5"> |
||||
<div> |
<div class="heading text-muted" i18n>API Key</div> |
||||
<div class="heading text-muted" i18n>Membership</div> |
<div class="align-items-center d-flex"> |
||||
<div class="text-truncate value">{{ name }}</div> |
<div class="text-monospace value">* * * * * * * * *</div> |
||||
</div> |
<div class="ml-1"> |
||||
@if (expiresAt) { |
<button |
||||
<div> |
class="no-min-width" |
||||
<div class="heading text-muted" i18n>Valid until</div> |
i18n-title |
||||
<div class="text-truncate value"> |
mat-button |
||||
{{ expiresAt }} |
title="Generate Ghostfolio Premium Data Provider API key for self-hosted environments..." |
||||
|
(click)="onGenerateApiKey($event)" |
||||
|
> |
||||
|
<ion-icon name="refresh-outline" /> |
||||
|
</button> |
||||
|
</div> |
||||
</div> |
</div> |
||||
</div> |
</div> |
||||
} |
} |
||||
</div> |
<div class="d-flex justify-content-between"> |
||||
</a> |
<div> |
||||
|
<div class="heading text-muted" i18n>Membership</div> |
||||
|
<div class="text-truncate value">{{ name }}</div> |
||||
|
</div> |
||||
|
@if (expiresAt) { |
||||
|
<div> |
||||
|
<div class="heading text-muted" i18n>Valid until</div> |
||||
|
<div class="text-truncate value"> |
||||
|
{{ expiresAt }} |
||||
|
</div> |
||||
|
</div> |
||||
|
} |
||||
|
</div> |
||||
|
</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> |
||||
|
} |
||||
</div> |
</div> |
||||
|
|||||
Loading…
Reference in new issue