From 74f12e2c1d18762a4d0cabe6638c81c5b0a4e09e Mon Sep 17 00:00:00 2001 From: ZhymabekRoman Date: Sat, 19 Oct 2024 23:29:36 +0500 Subject: [PATCH] feat(ui): implement new dialog and dropdown components --- .gitignore | 2 +- new-web/bun.lockb | Bin 86622 -> 87768 bytes new-web/package.json | 6 +- .../lib/components/ui/button/button.svelte | 25 +++ new-web/src/lib/components/ui/button/index.ts | 49 ++++++ .../ui/dialog/dialog-content.svelte | 39 +++++ .../ui/dialog/dialog-description.svelte | 16 ++ .../components/ui/dialog/dialog-footer.svelte | 16 ++ .../components/ui/dialog/dialog-header.svelte | 13 ++ .../ui/dialog/dialog-overlay.svelte | 21 +++ .../components/ui/dialog/dialog-portal.svelte | 8 + .../components/ui/dialog/dialog-title.svelte | 16 ++ new-web/src/lib/components/ui/dialog/index.ts | 37 ++++ .../dropdown-menu-checkbox-item.svelte | 35 ++++ .../dropdown-menu-content.svelte | 27 +++ .../dropdown-menu/dropdown-menu-item.svelte | 31 ++++ .../dropdown-menu/dropdown-menu-label.svelte | 19 +++ .../dropdown-menu-radio-group.svelte | 11 ++ .../dropdown-menu-radio-item.svelte | 35 ++++ .../dropdown-menu-separator.svelte | 14 ++ .../dropdown-menu-shortcut.svelte | 13 ++ .../dropdown-menu-sub-content.svelte | 30 ++++ .../dropdown-menu-sub-trigger.svelte | 32 ++++ .../lib/components/ui/dropdown-menu/index.ts | 48 ++++++ new-web/src/lib/components/ui/input/index.ts | 29 ++++ .../src/lib/components/ui/input/input.svelte | 42 +++++ .../lib/components/ui/radio-group/index.ts | 15 ++ .../ui/radio-group/radio-group-item.svelte | 28 +++ .../ui/radio-group/radio-group.svelte | 14 ++ new-web/src/lib/components/ui/sonner/index.ts | 1 + .../lib/components/ui/sonner/sonner.svelte | 20 +++ .../src/lib/components/ui/textarea/index.ts | 28 +++ .../components/ui/textarea/textarea.svelte | 38 +++++ new-web/src/lib/elements/Advertise.svelte | 5 + new-web/src/lib/elements/BlogCard.svelte | 70 ++++++++ .../src/lib/elements/BookmarkButton.svelte | 93 ++++++++++ new-web/src/lib/elements/CodeBlock.svelte | 7 + .../src/lib/elements/ExtensionsButton.svelte | 56 ++++++ new-web/src/lib/elements/Header.svelte | 54 ++++++ new-web/src/lib/elements/HomeBanner.svelte | 14 ++ new-web/src/lib/elements/Mansonry.svelte | 49 ++++++ new-web/src/lib/elements/PayButtons.svelte | 20 +++ new-web/src/lib/elements/ProgressLine.svelte | 33 ++++ new-web/src/lib/elements/ReportProblem.svelte | 86 ++++++++++ new-web/src/lib/elements/ThemeToggle.svelte | 36 ++++ new-web/src/lib/elements/UrlBox.svelte | 44 +++++ new-web/src/lib/index.ts | 1 + new-web/src/lib/utils.ts | 62 +++++++ new-web/src/lib/utils/index.ts | 52 ++++++ new-web/src/routes/+page.svelte | 159 +++++++++++++----- 50 files changed, 1552 insertions(+), 47 deletions(-) create mode 100644 new-web/src/lib/components/ui/button/button.svelte create mode 100644 new-web/src/lib/components/ui/button/index.ts create mode 100644 new-web/src/lib/components/ui/dialog/dialog-content.svelte create mode 100644 new-web/src/lib/components/ui/dialog/dialog-description.svelte create mode 100644 new-web/src/lib/components/ui/dialog/dialog-footer.svelte create mode 100644 new-web/src/lib/components/ui/dialog/dialog-header.svelte create mode 100644 new-web/src/lib/components/ui/dialog/dialog-overlay.svelte create mode 100644 new-web/src/lib/components/ui/dialog/dialog-portal.svelte create mode 100644 new-web/src/lib/components/ui/dialog/dialog-title.svelte create mode 100644 new-web/src/lib/components/ui/dialog/index.ts create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte create mode 100644 new-web/src/lib/components/ui/dropdown-menu/index.ts create mode 100644 new-web/src/lib/components/ui/input/index.ts create mode 100644 new-web/src/lib/components/ui/input/input.svelte create mode 100644 new-web/src/lib/components/ui/radio-group/index.ts create mode 100644 new-web/src/lib/components/ui/radio-group/radio-group-item.svelte create mode 100644 new-web/src/lib/components/ui/radio-group/radio-group.svelte create mode 100644 new-web/src/lib/components/ui/sonner/index.ts create mode 100644 new-web/src/lib/components/ui/sonner/sonner.svelte create mode 100644 new-web/src/lib/components/ui/textarea/index.ts create mode 100644 new-web/src/lib/components/ui/textarea/textarea.svelte create mode 100644 new-web/src/lib/elements/Advertise.svelte create mode 100644 new-web/src/lib/elements/BlogCard.svelte create mode 100644 new-web/src/lib/elements/BookmarkButton.svelte create mode 100644 new-web/src/lib/elements/CodeBlock.svelte create mode 100644 new-web/src/lib/elements/ExtensionsButton.svelte create mode 100644 new-web/src/lib/elements/Header.svelte create mode 100644 new-web/src/lib/elements/HomeBanner.svelte create mode 100644 new-web/src/lib/elements/Mansonry.svelte create mode 100644 new-web/src/lib/elements/PayButtons.svelte create mode 100644 new-web/src/lib/elements/ProgressLine.svelte create mode 100644 new-web/src/lib/elements/ReportProblem.svelte create mode 100644 new-web/src/lib/elements/ThemeToggle.svelte create mode 100644 new-web/src/lib/elements/UrlBox.svelte create mode 100644 new-web/src/lib/index.ts create mode 100644 new-web/src/lib/utils.ts create mode 100644 new-web/src/lib/utils/index.ts 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 0ec3c1f5718b7e42ae101127621a665363793b07..bbaa631d2faa5dcbc3d26e6edf61ac9bdc5af27d 100755 GIT binary patch delta 15278 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 delta 14776 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 U?gthJiaYTl_Q3osG05xx0f6D==>Px# 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} + + +
+ + + +