diff --git a/.gitignore b/.gitignore index eb508b0..7b85048 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ dist/ downloads/ eggs/ .eggs/ -lib/ +# lib/ lib64/ parts/ sdist/ diff --git a/new-web/bun.lockb b/new-web/bun.lockb index 0ec3c1f..bbaa631 100755 Binary files a/new-web/bun.lockb and b/new-web/bun.lockb differ diff --git a/new-web/package.json b/new-web/package.json index c098060..33882d9 100644 --- a/new-web/package.json +++ b/new-web/package.json @@ -17,7 +17,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.0", "autoprefixer": "^10.4.20", "clsx": "^2.1.1", - "lucide-svelte": "^0.452.0", + "lucide-svelte": "^0.453.0", "mode-watcher": "^0.4.1", "postcss": "^8.4.47", "prettier": "^3.1.1", @@ -34,6 +34,8 @@ "type": "module", "dependencies": { "@iconify/svelte": "^4.0.2", - "bits-ui": "^0.21.16" + "bits-ui": "^0.21.16", + "copy-to-clipboard": "^3.3.3", + "svelte-bricks": "^0.2.1" } } diff --git a/new-web/src/lib/components/ui/button/button.svelte b/new-web/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..86827f3 --- /dev/null +++ b/new-web/src/lib/components/ui/button/button.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/new-web/src/lib/components/ui/button/index.ts b/new-web/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..af1e188 --- /dev/null +++ b/new-web/src/lib/components/ui/button/index.ts @@ -0,0 +1,49 @@ +import { type VariantProps, tv } from "tailwind-variants"; +import type { Button as ButtonPrimitive } from "bits-ui"; +import Root from "./button.svelte"; + +const buttonVariants = tv({ + base: "ring-offset-background focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border-input bg-background hover:bg-accent hover:text-accent-foreground border", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, +}); + +type Variant = VariantProps["variant"]; +type Size = VariantProps["size"]; + +type Props = ButtonPrimitive.Props & { + variant?: Variant; + size?: Size; +}; + +type Events = ButtonPrimitive.Events; + +export { + Root, + type Props, + type Events, + // + Root as Button, + type Props as ButtonProps, + type Events as ButtonEvents, + buttonVariants, +}; diff --git a/new-web/src/lib/components/ui/dialog/dialog-content.svelte b/new-web/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 0000000..9f7eab8 --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,39 @@ + + + + + +
+ + + + Close + +
+
+
diff --git a/new-web/src/lib/components/ui/dialog/dialog-description.svelte b/new-web/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 0000000..8bc70cc --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dialog/dialog-footer.svelte b/new-web/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 0000000..a235d1f --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,16 @@ + + +
+ +
diff --git a/new-web/src/lib/components/ui/dialog/dialog-header.svelte b/new-web/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 0000000..6b4448c --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/new-web/src/lib/components/ui/dialog/dialog-overlay.svelte b/new-web/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 0000000..1d376e4 --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,21 @@ + + + diff --git a/new-web/src/lib/components/ui/dialog/dialog-portal.svelte b/new-web/src/lib/components/ui/dialog/dialog-portal.svelte new file mode 100644 index 0000000..eb5d0a5 --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/dialog-portal.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dialog/dialog-title.svelte b/new-web/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 0000000..06574f3 --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dialog/index.ts b/new-web/src/lib/components/ui/dialog/index.ts new file mode 100644 index 0000000..b17ba5e --- /dev/null +++ b/new-web/src/lib/components/ui/dialog/index.ts @@ -0,0 +1,37 @@ +import { Dialog as DialogPrimitive } from "bits-ui"; + +import Title from "./dialog-title.svelte"; +import Portal from "./dialog-portal.svelte"; +import Footer from "./dialog-footer.svelte"; +import Header from "./dialog-header.svelte"; +import Overlay from "./dialog-overlay.svelte"; +import Content from "./dialog-content.svelte"; +import Description from "./dialog-description.svelte"; + +const Root = DialogPrimitive.Root; +const Trigger = DialogPrimitive.Trigger; +const Close = DialogPrimitive.Close; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, +}; diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte new file mode 100644 index 0000000..6f1595f --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 0000000..d6af313 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 0000000..c99fff2 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 0000000..43f1527 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte new file mode 100644 index 0000000..1c74ae1 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 0000000..ea3c441 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 0000000..8b16e03 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,14 @@ + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 0000000..d8c7378 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 0000000..034ed06 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,30 @@ + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 0000000..7f368ce --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,32 @@ + + + + + + diff --git a/new-web/src/lib/components/ui/dropdown-menu/index.ts b/new-web/src/lib/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..c1749e9 --- /dev/null +++ b/new-web/src/lib/components/ui/dropdown-menu/index.ts @@ -0,0 +1,48 @@ +import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui"; +import Item from "./dropdown-menu-item.svelte"; +import Label from "./dropdown-menu-label.svelte"; +import Content from "./dropdown-menu-content.svelte"; +import Shortcut from "./dropdown-menu-shortcut.svelte"; +import RadioItem from "./dropdown-menu-radio-item.svelte"; +import Separator from "./dropdown-menu-separator.svelte"; +import RadioGroup from "./dropdown-menu-radio-group.svelte"; +import SubContent from "./dropdown-menu-sub-content.svelte"; +import SubTrigger from "./dropdown-menu-sub-trigger.svelte"; +import CheckboxItem from "./dropdown-menu-checkbox-item.svelte"; + +const Sub = DropdownMenuPrimitive.Sub; +const Root = DropdownMenuPrimitive.Root; +const Trigger = DropdownMenuPrimitive.Trigger; +const Group = DropdownMenuPrimitive.Group; + +export { + Sub, + Root, + Item, + Label, + Group, + Trigger, + Content, + Shortcut, + Separator, + RadioItem, + SubContent, + SubTrigger, + RadioGroup, + CheckboxItem, + // + Root as DropdownMenu, + Sub as DropdownMenuSub, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + Group as DropdownMenuGroup, + Content as DropdownMenuContent, + Trigger as DropdownMenuTrigger, + Shortcut as DropdownMenuShortcut, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + RadioGroup as DropdownMenuRadioGroup, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + CheckboxItem as DropdownMenuCheckboxItem, +}; diff --git a/new-web/src/lib/components/ui/input/index.ts b/new-web/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..75e3bc2 --- /dev/null +++ b/new-web/src/lib/components/ui/input/index.ts @@ -0,0 +1,29 @@ +import Root from "./input.svelte"; + +export type FormInputEvent = T & { + currentTarget: EventTarget & HTMLInputElement; +}; +export type InputEvents = { + blur: FormInputEvent; + change: FormInputEvent; + click: FormInputEvent; + focus: FormInputEvent; + focusin: FormInputEvent; + focusout: FormInputEvent; + keydown: FormInputEvent; + keypress: FormInputEvent; + keyup: FormInputEvent; + mouseover: FormInputEvent; + mouseenter: FormInputEvent; + mouseleave: FormInputEvent; + mousemove: FormInputEvent; + paste: FormInputEvent; + input: FormInputEvent; + wheel: FormInputEvent; +}; + +export { + Root, + // + Root as Input, +}; diff --git a/new-web/src/lib/components/ui/input/input.svelte b/new-web/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..cab1457 --- /dev/null +++ b/new-web/src/lib/components/ui/input/input.svelte @@ -0,0 +1,42 @@ + + + diff --git a/new-web/src/lib/components/ui/radio-group/index.ts b/new-web/src/lib/components/ui/radio-group/index.ts new file mode 100644 index 0000000..feefa79 --- /dev/null +++ b/new-web/src/lib/components/ui/radio-group/index.ts @@ -0,0 +1,15 @@ +import { RadioGroup as RadioGroupPrimitive } from "bits-ui"; + +import Root from "./radio-group.svelte"; +import Item from "./radio-group-item.svelte"; +const Input = RadioGroupPrimitive.Input; + +export { + Root, + Input, + Item, + // + Root as RadioGroup, + Input as RadioGroupInput, + Item as RadioGroupItem, +}; diff --git a/new-web/src/lib/components/ui/radio-group/radio-group-item.svelte b/new-web/src/lib/components/ui/radio-group/radio-group-item.svelte new file mode 100644 index 0000000..e061d97 --- /dev/null +++ b/new-web/src/lib/components/ui/radio-group/radio-group-item.svelte @@ -0,0 +1,28 @@ + + + +
+ + + +
+
diff --git a/new-web/src/lib/components/ui/radio-group/radio-group.svelte b/new-web/src/lib/components/ui/radio-group/radio-group.svelte new file mode 100644 index 0000000..301a925 --- /dev/null +++ b/new-web/src/lib/components/ui/radio-group/radio-group.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/new-web/src/lib/components/ui/sonner/index.ts b/new-web/src/lib/components/ui/sonner/index.ts new file mode 100644 index 0000000..1ad9f4a --- /dev/null +++ b/new-web/src/lib/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from "./sonner.svelte"; diff --git a/new-web/src/lib/components/ui/sonner/sonner.svelte b/new-web/src/lib/components/ui/sonner/sonner.svelte new file mode 100644 index 0000000..7d5b2f1 --- /dev/null +++ b/new-web/src/lib/components/ui/sonner/sonner.svelte @@ -0,0 +1,20 @@ + + + diff --git a/new-web/src/lib/components/ui/textarea/index.ts b/new-web/src/lib/components/ui/textarea/index.ts new file mode 100644 index 0000000..6eb6ba3 --- /dev/null +++ b/new-web/src/lib/components/ui/textarea/index.ts @@ -0,0 +1,28 @@ +import Root from "./textarea.svelte"; + +type FormTextareaEvent = T & { + currentTarget: EventTarget & HTMLTextAreaElement; +}; + +type TextareaEvents = { + blur: FormTextareaEvent; + change: FormTextareaEvent; + click: FormTextareaEvent; + focus: FormTextareaEvent; + keydown: FormTextareaEvent; + keypress: FormTextareaEvent; + keyup: FormTextareaEvent; + mouseover: FormTextareaEvent; + mouseenter: FormTextareaEvent; + mouseleave: FormTextareaEvent; + paste: FormTextareaEvent; + input: FormTextareaEvent; +}; + +export { + Root, + // + Root as Textarea, + type TextareaEvents, + type FormTextareaEvent, +}; diff --git a/new-web/src/lib/components/ui/textarea/textarea.svelte b/new-web/src/lib/components/ui/textarea/textarea.svelte new file mode 100644 index 0000000..d0da1d4 --- /dev/null +++ b/new-web/src/lib/components/ui/textarea/textarea.svelte @@ -0,0 +1,38 @@ + + + diff --git a/new-web/src/lib/elements/Advertise.svelte b/new-web/src/lib/elements/Advertise.svelte new file mode 100644 index 0000000..e3a5847 --- /dev/null +++ b/new-web/src/lib/elements/Advertise.svelte @@ -0,0 +1,5 @@ +
+

+ Advertise here and support our project! Reach out to us at admin@freedium.cfd +

+
diff --git a/new-web/src/lib/elements/BlogCard.svelte b/new-web/src/lib/elements/BlogCard.svelte new file mode 100644 index 0000000..b6ce6bd --- /dev/null +++ b/new-web/src/lib/elements/BlogCard.svelte @@ -0,0 +1,70 @@ + + + +
+ {#if imageUrl} + {title} + {/if} +
+

{title}

+

{excerpt}

+ +
+ + {#if collection} +
+ {collection.name.charAt(0)} +

{collection.name}

+
+ · + {/if} + {creator} + · + ~{readingTime} min read + · + {publishedAt} +
+
+ {#if bottomImageUrl} + {title} + {/if} +
+
diff --git a/new-web/src/lib/elements/BookmarkButton.svelte b/new-web/src/lib/elements/BookmarkButton.svelte new file mode 100644 index 0000000..46343cb --- /dev/null +++ b/new-web/src/lib/elements/BookmarkButton.svelte @@ -0,0 +1,93 @@ + + + + + $event.preventDefault()}> + + Bookmark + + + + + Add Bookmark for Medium Bypass + +
+ +

+ Credit: blazeknifecatcher on Reddit +

+ +
+
+

Option 1: Redirect in Current Tab

+ +
+

Create a new bookmark with the following code as the URL:

+ + +
+ +
+
+

Option 2: Open in New Tab

+ +
+ +

For opening in a new tab, use this code instead:

+ +
+ +

Click the bookmark on any Medium page to bypass the paywall using Freedium.

+
+
+ + Close + +
+
diff --git a/new-web/src/lib/elements/CodeBlock.svelte b/new-web/src/lib/elements/CodeBlock.svelte new file mode 100644 index 0000000..1698a91 --- /dev/null +++ b/new-web/src/lib/elements/CodeBlock.svelte @@ -0,0 +1,7 @@ + + +
+{code}
+
diff --git a/new-web/src/lib/elements/ExtensionsButton.svelte b/new-web/src/lib/elements/ExtensionsButton.svelte new file mode 100644 index 0000000..1a510f9 --- /dev/null +++ b/new-web/src/lib/elements/ExtensionsButton.svelte @@ -0,0 +1,56 @@ + + + + + + + + Browser Extensions + + Note: These solutions are not developed or controlled by the Freedium developers team. Use + at your own risk. + + + Freedium is not responsible for any damages or losses caused by these solutions. + + + + + + Firefox + + + + + Chrome + + + + + + + + Userscript - only Medium + + + + + + + diff --git a/new-web/src/lib/elements/Header.svelte b/new-web/src/lib/elements/Header.svelte new file mode 100644 index 0000000..8fb002f --- /dev/null +++ b/new-web/src/lib/elements/Header.svelte @@ -0,0 +1,54 @@ + + + diff --git a/new-web/src/lib/elements/HomeBanner.svelte b/new-web/src/lib/elements/HomeBanner.svelte new file mode 100644 index 0000000..bf383b8 --- /dev/null +++ b/new-web/src/lib/elements/HomeBanner.svelte @@ -0,0 +1,14 @@ + + +
+
+
+

+ Freedium: Your paywall breakthrough for Medium! +

+ +
+
+ diff --git a/new-web/src/lib/elements/Mansonry.svelte b/new-web/src/lib/elements/Mansonry.svelte new file mode 100644 index 0000000..93d27e6 --- /dev/null +++ b/new-web/src/lib/elements/Mansonry.svelte @@ -0,0 +1,49 @@ + + +
+ +
+ + \ No newline at end of file diff --git a/new-web/src/lib/elements/PayButtons.svelte b/new-web/src/lib/elements/PayButtons.svelte new file mode 100644 index 0000000..c94d2df --- /dev/null +++ b/new-web/src/lib/elements/PayButtons.svelte @@ -0,0 +1,20 @@ + + + diff --git a/new-web/src/lib/elements/ProgressLine.svelte b/new-web/src/lib/elements/ProgressLine.svelte new file mode 100644 index 0000000..10f3237 --- /dev/null +++ b/new-web/src/lib/elements/ProgressLine.svelte @@ -0,0 +1,33 @@ + + +
diff --git a/new-web/src/lib/elements/ReportProblem.svelte b/new-web/src/lib/elements/ReportProblem.svelte new file mode 100644 index 0000000..9cf4985 --- /dev/null +++ b/new-web/src/lib/elements/ReportProblem.svelte @@ -0,0 +1,86 @@ + + + + +
+ + Report a problem +
+
+
+ + + Report a Problem + +
+ +

+ Please describe the problem you're experiencing. We'll look into it as soon as possible. +

+
+
+ Problem Type + +
+ + UI problem +
+
+ + Article is not full +
+
+ + Suggestion +
+
+ + Other +
+
+
+
+ + Problem Description + + +

+ The current opened link will be automatically attached to your report. +

+
+
+ +
+ + Cancel + + +
+
+
+
diff --git a/new-web/src/lib/elements/ThemeToggle.svelte b/new-web/src/lib/elements/ThemeToggle.svelte new file mode 100644 index 0000000..b5d4738 --- /dev/null +++ b/new-web/src/lib/elements/ThemeToggle.svelte @@ -0,0 +1,36 @@ + + + diff --git a/new-web/src/lib/elements/UrlBox.svelte b/new-web/src/lib/elements/UrlBox.svelte new file mode 100644 index 0000000..bced9b0 --- /dev/null +++ b/new-web/src/lib/elements/UrlBox.svelte @@ -0,0 +1,44 @@ + + +
+
+ + + + + + +
+
diff --git a/new-web/src/lib/index.ts b/new-web/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/new-web/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/new-web/src/lib/utils.ts b/new-web/src/lib/utils.ts new file mode 100644 index 0000000..8871245 --- /dev/null +++ b/new-web/src/lib/utils.ts @@ -0,0 +1,62 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; + +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 } +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + + const scaleConversion = ( + valueA: number, + scaleA: [number, number], + scaleB: [number, number] + ) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = ( + style: Record + ): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + `${key}:${style[key]};`; + }, ""); + }; + + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + + return styleToString({ + transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, + opacity: t + }); + }, + easing: cubicOut + }; +}; \ No newline at end of file diff --git a/new-web/src/lib/utils/index.ts b/new-web/src/lib/utils/index.ts new file mode 100644 index 0000000..f952b4f --- /dev/null +++ b/new-web/src/lib/utils/index.ts @@ -0,0 +1,52 @@ +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; + +type FlyAndScaleParams = { + y?: number; + start?: number; + duration?: number; +}; + +const defaultFlyAndScaleParams = { y: -8, start: 0.95, duration: 200 }; + +export function flyAndScale(node: Element, params?: FlyAndScaleParams): TransitionConfig { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + const withDefaults = { ...defaultFlyAndScaleParams, ...params }; + + const scaleConversion = ( + valueA: number, + scaleA: [number, number], + scaleB: [number, number] + ) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = (style: Record): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return `${str}${key}:${style[key]};`; + }, ""); + }; + + return { + duration: withDefaults.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [withDefaults.y, 0]); + const scale = scaleConversion(t, [0, 1], [withDefaults.start, 1]); + + return styleToString({ + transform: `${transform} translate3d(0, ${y}px, 0) scale(${scale})`, + opacity: t, + }); + }, + easing: cubicOut, + }; +} \ No newline at end of file diff --git a/new-web/src/routes/+page.svelte b/new-web/src/routes/+page.svelte index 2799ef4..d284597 100644 --- a/new-web/src/routes/+page.svelte +++ b/new-web/src/routes/+page.svelte @@ -1,48 +1,116 @@ @@ -50,7 +118,10 @@
- -{#each randomParagraphs as paragraph} -

{@html paragraph}

-{/each} + + +
+ + + +