- {is_locked &&
}
{archived_at && (
@@ -88,16 +87,6 @@ export const PageExtraOptions: React.FC
= observer((props) => {
)}
- {canCurrentUserFavoritePage && (
-
- )}
-
-
);
});
diff --git a/web/styles/animations.css b/web/styles/animations.css
new file mode 100644
index 0000000000..6eb4c68257
--- /dev/null
+++ b/web/styles/animations.css
@@ -0,0 +1,87 @@
+/* Lock icon animations */
+@keyframes textSlideIn {
+ 0% {
+ opacity: 0;
+ transform: translateX(-8px);
+ max-width: 0px;
+ }
+ 40% {
+ opacity: 0.7;
+ max-width: 60px;
+ }
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ max-width: 60px;
+ }
+}
+
+@keyframes textFadeOut {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translateX(8px);
+ }
+}
+
+@keyframes lockIconAnimation {
+ 0% {
+ transform: rotate(-5deg) scale(1);
+ }
+ 25% {
+ transform: rotate(0deg) scale(1.15);
+ }
+ 50% {
+ transform: rotate(5deg) scale(1.08);
+ }
+ 100% {
+ transform: rotate(0deg) scale(1);
+ }
+}
+
+@keyframes unlockIconAnimation {
+ 0% {
+ transform: rotate(0deg) scale(1);
+ }
+ 40% {
+ transform: rotate(-8deg) scale(1.15);
+ }
+ 80% {
+ transform: rotate(3deg) scale(1.05);
+ }
+ 100% {
+ transform: rotate(0deg) scale(1);
+ }
+}
+
+@keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+
+.animate-text-slide-in {
+ animation: textSlideIn 400ms ease-out forwards;
+}
+
+.animate-text-fade-out {
+ animation: textFadeOut 600ms ease-in 300ms forwards;
+}
+
+.animate-lock-icon {
+ animation: lockIconAnimation 600ms ease-out forwards;
+}
+
+.animate-unlock-icon {
+ animation: unlockIconAnimation 600ms ease-out forwards;
+}
+
+.animate-fade-out {
+ animation: fadeOut 500ms ease-in 100ms forwards;
+}
diff --git a/web/styles/globals.css b/web/styles/globals.css
index 7d44ad0d1f..32fdaa0b8b 100644
--- a/web/styles/globals.css
+++ b/web/styles/globals.css
@@ -1,4 +1,5 @@
@import url("fonts/main.css");
+@import url("animations.css");
@tailwind base;
@tailwind components;