├── public ├── assets │ ├── presets │ │ ├── banner-1.png │ │ ├── 2021-09-30-pg9vzqpe7bf.jpeg │ │ └── logo-5-1.png │ ├── logo.png │ ├── avatar.png │ ├── avatar-2.png │ ├── cta-demo.png │ ├── icons │ │ ├── ok.png │ │ ├── qq.png │ │ ├── rss.png │ │ ├── vk.png │ │ ├── web.png │ │ ├── houzz.png │ │ ├── shop.png │ │ ├── skype.png │ │ ├── slack.png │ │ ├── teams.png │ │ ├── xing.png │ │ ├── yelp.png │ │ ├── zoom.png │ │ ├── behance.png │ │ ├── diaspora.png │ │ ├── discord.png │ │ ├── dribbble.png │ │ ├── facebook.png │ │ ├── github.png │ │ ├── gitlab.png │ │ ├── gitter.png │ │ ├── hangouts.png │ │ ├── linkedin.png │ │ ├── mastodon.png │ │ ├── reddit.png │ │ ├── replit.png │ │ ├── signal.png │ │ ├── spotify.png │ │ ├── telegram.png │ │ ├── tiktok.png │ │ ├── twitter.png │ │ ├── unsplash.png │ │ ├── wechat.png │ │ ├── whatsapp.png │ │ ├── whereby.png │ │ ├── youtube.png │ │ ├── zillow.png │ │ ├── instagram.png │ │ ├── pinterest.png │ │ ├── soundcloud.png │ │ ├── apple-music.png │ │ ├── stackoverflow.png │ │ └── google-business.png │ ├── app-store-badge.png │ ├── google-play-badge.png │ ├── templates │ │ ├── template-1.png │ │ ├── template-2.png │ │ ├── template-3.png │ │ ├── template-4.png │ │ ├── template-5.png │ │ ├── template-6.png │ │ ├── template-7.png │ │ ├── template-8.png │ │ └── template-9.png │ └── mysigmail-promo-banner.png └── favicon.ico ├── src ├── vite-env.d.ts ├── components │ ├── ui │ │ ├── shadcn │ │ │ ├── input │ │ │ │ ├── index.ts │ │ │ │ └── Input.vue │ │ │ ├── label │ │ │ │ ├── index.ts │ │ │ │ └── Label.vue │ │ │ ├── slider │ │ │ │ ├── index.ts │ │ │ │ └── Slider.vue │ │ │ ├── switch │ │ │ │ ├── index.ts │ │ │ │ └── Switch.vue │ │ │ ├── textarea │ │ │ │ ├── index.ts │ │ │ │ └── Textarea.vue │ │ │ ├── toggle-group │ │ │ │ ├── index.ts │ │ │ │ ├── ToggleGroup.vue │ │ │ │ └── ToggleGroupItem.vue │ │ │ ├── form │ │ │ │ ├── injectionKeys.ts │ │ │ │ ├── index.ts │ │ │ │ ├── FormControl.vue │ │ │ │ ├── FormDescription.vue │ │ │ │ ├── FormItem.vue │ │ │ │ ├── FormMessage.vue │ │ │ │ ├── FormLabel.vue │ │ │ │ └── useFormField.ts │ │ │ ├── popover │ │ │ │ ├── index.ts │ │ │ │ ├── PopoverAnchor.vue │ │ │ │ ├── PopoverTrigger.vue │ │ │ │ ├── Popover.vue │ │ │ │ └── PopoverContent.vue │ │ │ ├── dialog │ │ │ │ ├── DialogClose.vue │ │ │ │ ├── DialogTrigger.vue │ │ │ │ ├── DialogFooter.vue │ │ │ │ ├── DialogHeader.vue │ │ │ │ ├── Dialog.vue │ │ │ │ ├── index.ts │ │ │ │ ├── DialogTitle.vue │ │ │ │ ├── DialogDescription.vue │ │ │ │ ├── DialogOverlay.vue │ │ │ │ ├── DialogContent.vue │ │ │ │ └── DialogScrollContent.vue │ │ │ ├── select │ │ │ │ ├── SelectGroup.vue │ │ │ │ ├── SelectValue.vue │ │ │ │ ├── SelectItemText.vue │ │ │ │ ├── Select.vue │ │ │ │ ├── SelectLabel.vue │ │ │ │ ├── SelectSeparator.vue │ │ │ │ ├── index.ts │ │ │ │ ├── SelectScrollUpButton.vue │ │ │ │ ├── SelectScrollDownButton.vue │ │ │ │ ├── SelectItem.vue │ │ │ │ ├── SelectTrigger.vue │ │ │ │ └── SelectContent.vue │ │ │ ├── dropdown-menu │ │ │ │ ├── DropdownMenuGroup.vue │ │ │ │ ├── DropdownMenuShortcut.vue │ │ │ │ ├── DropdownMenuTrigger.vue │ │ │ │ ├── DropdownMenu.vue │ │ │ │ ├── DropdownMenuSub.vue │ │ │ │ ├── DropdownMenuRadioGroup.vue │ │ │ │ ├── DropdownMenuSeparator.vue │ │ │ │ ├── DropdownMenuLabel.vue │ │ │ │ ├── index.ts │ │ │ │ ├── DropdownMenuSubTrigger.vue │ │ │ │ ├── DropdownMenuSubContent.vue │ │ │ │ ├── DropdownMenuRadioItem.vue │ │ │ │ ├── DropdownMenuCheckboxItem.vue │ │ │ │ ├── DropdownMenuContent.vue │ │ │ │ └── DropdownMenuItem.vue │ │ │ ├── alert │ │ │ │ ├── AlertTitle.vue │ │ │ │ ├── AlertDescription.vue │ │ │ │ ├── Alert.vue │ │ │ │ └── index.ts │ │ │ ├── button │ │ │ │ ├── Button.vue │ │ │ │ └── index.ts │ │ │ └── toggle │ │ │ │ ├── Toggle.vue │ │ │ │ └── index.ts │ │ ├── field-form │ │ │ ├── Description.vue │ │ │ ├── keys.ts │ │ │ ├── Label.vue │ │ │ ├── Index.vue │ │ │ └── Item.vue │ │ ├── sonner │ │ │ ├── types.ts │ │ │ └── Sonner.vue │ │ └── color-picker │ │ │ └── ColorPicker.vue │ ├── templates │ │ ├── components │ │ │ ├── special │ │ │ │ ├── index.ts │ │ │ │ └── Branding.vue │ │ │ ├── base │ │ │ │ ├── Link.vue │ │ │ │ ├── index.ts │ │ │ │ ├── SeparateLine.vue │ │ │ │ └── Table.vue │ │ │ ├── main │ │ │ │ ├── index.ts │ │ │ │ ├── Avatar.vue │ │ │ │ ├── Field.vue │ │ │ │ ├── Social.vue │ │ │ │ └── JobFields.vue │ │ │ ├── addons │ │ │ │ ├── index.ts │ │ │ │ ├── Disclaimer.vue │ │ │ │ ├── Banner.vue │ │ │ │ ├── Logo.vue │ │ │ │ ├── MobileApp.vue │ │ │ │ ├── Cta.vue │ │ │ │ └── VideoConference.vue │ │ │ └── utils │ │ │ │ └── index.ts │ │ ├── Template1.vue │ │ ├── Template9.vue │ │ ├── Template3.vue │ │ └── Template6.vue │ ├── preview │ │ ├── header │ │ │ ├── composables │ │ │ │ └── index.ts │ │ │ ├── UpdateDialog.vue │ │ │ └── Header.vue │ │ ├── Preview.vue │ │ ├── Skeleton.vue │ │ ├── Footer.vue │ │ └── Signature.vue │ ├── sidebar │ │ ├── Sidebar.vue │ │ └── nav │ │ │ ├── Item.vue │ │ │ ├── Nav.vue │ │ │ └── navigation.ts │ ├── addons │ │ ├── list │ │ │ ├── Item.vue │ │ │ ├── List.vue │ │ │ └── ItemInstaled.vue │ │ ├── MobileApp.vue │ │ ├── Disclaimer.vue │ │ ├── Logo.vue │ │ ├── Banner.vue │ │ ├── VideoConference.vue │ │ └── Cta.vue │ ├── social │ │ ├── UrlInput.vue │ │ └── list │ │ │ ├── Item.vue │ │ │ └── List.vue │ ├── layouts │ │ └── Default.vue │ ├── basic │ │ ├── Form.vue │ │ ├── AddNewFiled.vue │ │ └── FormItem.vue │ └── header │ │ ├── ColorMode.vue │ │ └── Header.vue ├── views │ ├── Basic.vue │ ├── Addons.vue │ ├── Options.vue │ ├── Social.vue │ └── Templates.vue ├── main.ts ├── lib │ └── utils.ts ├── icons-shim.d.ts ├── App.vue ├── utils │ └── index.ts ├── composables │ ├── useSonner.ts │ ├── useCopySignature.ts │ └── signatures │ │ └── types │ │ └── index.ts ├── router │ └── index.ts └── data │ ├── addons.ts │ ├── analytics.ts │ ├── attributes.ts │ ├── socials.ts │ └── disclaimer-pressets.ts ├── .vscode └── extensions.json ├── .github ├── hero.png ├── logo-black.png ├── logo-white.png ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ └── bug_report.yml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── issue-close-require.yml │ └── issue-labeled.yml ├── .prettierrc ├── tsconfig.json ├── index.html ├── .gitignore ├── commitlint.config.js ├── components.json ├── tsconfig.app.json ├── tsconfig.node.json ├── eslint.config.js ├── vite.config.ts ├── CONTRIBUTING.md ├── package.json └── CODE_OF_CONDUCT.md /public/assets/presets/banner-1.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/presets/2021-09-30-pg9vzqpe7bf.jpeg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /.github/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/.github/hero.png -------------------------------------------------------------------------------- /src/components/ui/shadcn/input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Input } from './Input.vue' 2 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/label/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Label } from './Label.vue' 2 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/slider/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Slider } from './Slider.vue' 2 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/switch/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Switch } from './Switch.vue' 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "printWidth": 100 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /.github/logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/.github/logo-black.png -------------------------------------------------------------------------------- /.github/logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/.github/logo-white.png -------------------------------------------------------------------------------- /public/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/logo.png -------------------------------------------------------------------------------- /src/components/ui/shadcn/textarea/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Textarea } from './Textarea.vue' 2 | -------------------------------------------------------------------------------- /public/assets/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/avatar.png -------------------------------------------------------------------------------- /public/assets/avatar-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/avatar-2.png -------------------------------------------------------------------------------- /public/assets/cta-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/cta-demo.png -------------------------------------------------------------------------------- /public/assets/icons/ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/ok.png -------------------------------------------------------------------------------- /public/assets/icons/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/qq.png -------------------------------------------------------------------------------- /public/assets/icons/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/rss.png -------------------------------------------------------------------------------- /public/assets/icons/vk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/vk.png -------------------------------------------------------------------------------- /public/assets/icons/web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/web.png -------------------------------------------------------------------------------- /src/components/templates/components/special/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Branding } from './Branding.vue' 2 | -------------------------------------------------------------------------------- /public/assets/icons/houzz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/houzz.png -------------------------------------------------------------------------------- /public/assets/icons/shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/shop.png -------------------------------------------------------------------------------- /public/assets/icons/skype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/skype.png -------------------------------------------------------------------------------- /public/assets/icons/slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/slack.png -------------------------------------------------------------------------------- /public/assets/icons/teams.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/teams.png -------------------------------------------------------------------------------- /public/assets/icons/xing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/xing.png -------------------------------------------------------------------------------- /public/assets/icons/yelp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/yelp.png -------------------------------------------------------------------------------- /public/assets/icons/zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/zoom.png -------------------------------------------------------------------------------- /public/assets/icons/behance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/behance.png -------------------------------------------------------------------------------- /public/assets/icons/diaspora.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/diaspora.png -------------------------------------------------------------------------------- /public/assets/icons/discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/discord.png -------------------------------------------------------------------------------- /public/assets/icons/dribbble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/dribbble.png -------------------------------------------------------------------------------- /public/assets/icons/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/facebook.png -------------------------------------------------------------------------------- /public/assets/icons/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/github.png -------------------------------------------------------------------------------- /public/assets/icons/gitlab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/gitlab.png -------------------------------------------------------------------------------- /public/assets/icons/gitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/gitter.png -------------------------------------------------------------------------------- /public/assets/icons/hangouts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/hangouts.png -------------------------------------------------------------------------------- /public/assets/icons/linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/linkedin.png -------------------------------------------------------------------------------- /public/assets/icons/mastodon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/mastodon.png -------------------------------------------------------------------------------- /public/assets/icons/reddit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/reddit.png -------------------------------------------------------------------------------- /public/assets/icons/replit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/replit.png -------------------------------------------------------------------------------- /public/assets/icons/signal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/signal.png -------------------------------------------------------------------------------- /public/assets/icons/spotify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/spotify.png -------------------------------------------------------------------------------- /public/assets/icons/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/telegram.png -------------------------------------------------------------------------------- /public/assets/icons/tiktok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/tiktok.png -------------------------------------------------------------------------------- /public/assets/icons/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/twitter.png -------------------------------------------------------------------------------- /public/assets/icons/unsplash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/unsplash.png -------------------------------------------------------------------------------- /public/assets/icons/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/wechat.png -------------------------------------------------------------------------------- /public/assets/icons/whatsapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/whatsapp.png -------------------------------------------------------------------------------- /public/assets/icons/whereby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/whereby.png -------------------------------------------------------------------------------- /public/assets/icons/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/youtube.png -------------------------------------------------------------------------------- /public/assets/icons/zillow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/zillow.png -------------------------------------------------------------------------------- /public/assets/app-store-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/app-store-badge.png -------------------------------------------------------------------------------- /public/assets/icons/instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/instagram.png -------------------------------------------------------------------------------- /public/assets/icons/pinterest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/pinterest.png -------------------------------------------------------------------------------- /public/assets/icons/soundcloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/soundcloud.png -------------------------------------------------------------------------------- /public/assets/presets/logo-5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/presets/logo-5-1.png -------------------------------------------------------------------------------- /public/assets/google-play-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/google-play-badge.png -------------------------------------------------------------------------------- /public/assets/icons/apple-music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/apple-music.png -------------------------------------------------------------------------------- /public/assets/icons/stackoverflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/stackoverflow.png -------------------------------------------------------------------------------- /public/assets/icons/google-business.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/icons/google-business.png -------------------------------------------------------------------------------- /public/assets/templates/template-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-1.png -------------------------------------------------------------------------------- /public/assets/templates/template-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-2.png -------------------------------------------------------------------------------- /public/assets/templates/template-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-3.png -------------------------------------------------------------------------------- /public/assets/templates/template-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-4.png -------------------------------------------------------------------------------- /public/assets/templates/template-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-5.png -------------------------------------------------------------------------------- /public/assets/templates/template-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-6.png -------------------------------------------------------------------------------- /public/assets/templates/template-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-7.png -------------------------------------------------------------------------------- /public/assets/templates/template-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-8.png -------------------------------------------------------------------------------- /public/assets/templates/template-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/templates/template-9.png -------------------------------------------------------------------------------- /public/assets/mysigmail-promo-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonreshetov/mysigmail/HEAD/public/assets/mysigmail-promo-banner.png -------------------------------------------------------------------------------- /src/views/Basic.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/views/Addons.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/views/Options.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/views/Social.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: antonreshetov 4 | open_collective: mysigmail 5 | custom: http://paypal.me/antongithub 6 | -------------------------------------------------------------------------------- /src/components/preview/header/composables/index.ts: -------------------------------------------------------------------------------- 1 | const openDialog = ref(false) 2 | 3 | export function useHeaderPreview() { 4 | return { 5 | openDialog, 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/toggle-group/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ToggleGroup } from './ToggleGroup.vue' 2 | export { default as ToggleGroupItem } from './ToggleGroupItem.vue' 3 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | 3 | import './style.css' 4 | import App from './App.vue' 5 | import { router } from './router' 6 | 7 | createApp(App).use(router).mount('#app') 8 | -------------------------------------------------------------------------------- /src/components/ui/field-form/Description.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/components/templates/components/base/Link.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/injectionKeys.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable symbol-description */ 2 | import type { InjectionKey } from 'vue' 3 | 4 | export const FORM_ITEM_INJECTION_KEY = Symbol() as InjectionKey 5 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import type { ClassValue } from 'clsx' 2 | 3 | import { clsx } from 'clsx' 4 | import { twMerge } from 'tailwind-merge' 5 | 6 | export function cn(...inputs: ClassValue[]) { 7 | return twMerge(clsx(inputs)) 8 | } 9 | -------------------------------------------------------------------------------- /src/components/sidebar/Sidebar.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /src/icons-shim.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable ts/no-empty-object-type */ 2 | declare module '~icons/*' { 3 | import type { DefineComponent } from 'vue' 4 | 5 | const component: DefineComponent<{}, {}, any> 6 | export default component 7 | } 8 | -------------------------------------------------------------------------------- /src/components/ui/field-form/keys.ts: -------------------------------------------------------------------------------- 1 | import type { InjectionKey } from 'vue' 2 | 3 | interface FormProps { 4 | labelWidth: string 5 | labelPosition: 'left' | 'top' 6 | } 7 | 8 | export const formKeys: InjectionKey = Symbol('formKeys') 9 | -------------------------------------------------------------------------------- /src/components/templates/components/main/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Avatar } from './Avatar.vue' 2 | export { default as Field } from './Field.vue' 3 | export { default as JobFields } from './JobFields.vue' 4 | export { default as Social } from './Social.vue' 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Questions & Discussions 4 | url: https://github.com/antonreshetov/mysigmail/discussions 5 | about: Use GitHub discussions for message-board style questions and discussions. 6 | -------------------------------------------------------------------------------- /src/components/templates/components/base/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Branding } from '../special/Branding.vue' 2 | export { default as Link } from './Link.vue' 3 | export { default as SeparateLine } from './SeparateLine.vue' 4 | export { default as Table } from './Table.vue' 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["./src/*"] 6 | } 7 | }, 8 | "references": [ 9 | { "path": "./tsconfig.app.json" }, 10 | { "path": "./tsconfig.node.json" } 11 | ], 12 | "files": [] 13 | } 14 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Popover } from './Popover.vue' 2 | export { default as PopoverAnchor } from './PopoverAnchor.vue' 3 | export { default as PopoverContent } from './PopoverContent.vue' 4 | export { default as PopoverTrigger } from './PopoverTrigger.vue' 5 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 16 | -------------------------------------------------------------------------------- /src/components/ui/sonner/types.ts: -------------------------------------------------------------------------------- 1 | export interface Props { 2 | title: string 3 | description?: string 4 | component?: Component 5 | type?: 'default' | 'success' | 'error' 6 | closeButton?: boolean 7 | duration?: number 8 | action?: { 9 | label: string 10 | onClick: () => void 11 | } 12 | onClose?: () => void 13 | } 14 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### What kind of change does this PR introduce? 2 | 3 | > check at least one 4 | 5 | - [ ] Bugfix 6 | - [ ] Feature 7 | - [ ] Refactor 8 | - [ ] Other, please describe: 9 | 10 | ### Validations 11 | 12 | - [ ] Follow our [CONTRIBUTING](https://github.com/antonreshetov/mysigmail/blob/master/CONTRIBUTING.md) guide 13 | -------------------------------------------------------------------------------- /src/components/ui/field-form/Label.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export function clone(obj: T): T { 2 | return JSON.parse(JSON.stringify(obj)) 3 | } 4 | 5 | export function normalizeUrl(link: string) { 6 | const re = /^https?:|skype:|tg:|whatsapp:/ 7 | let url 8 | 9 | if (re.test(link)) { 10 | url = link 11 | } 12 | else { 13 | url = `https://${link}` 14 | } 15 | 16 | return url 17 | } 18 | -------------------------------------------------------------------------------- /src/components/templates/components/addons/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Banner } from './Banner.vue' 2 | export { default as Cta } from './Cta.vue' 3 | export { default as Disclaimer } from './Disclaimer.vue' 4 | export { default as Logo } from './Logo.vue' 5 | export { default as MobileApp } from './MobileApp.vue' 6 | export { default as VideoConference } from './VideoConference.vue' 7 | -------------------------------------------------------------------------------- /src/components/preview/Preview.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/DialogClose.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/SelectGroup.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/SelectValue.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/DialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/popover/PopoverAnchor.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | MySigMail 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/popover/PopoverTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/SelectItemText.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | pnpm-debug.log* 6 | lerna-debug.log* 7 | 8 | node_modules 9 | dist 10 | dist-ssr 11 | *.local 12 | auto-imports.d.ts 13 | components.d.ts 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | # Local env files 27 | .env 28 | .env.* 29 | !.env.example 30 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/DialogFooter.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/DialogHeader.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /.github/workflows/issue-close-require.yml: -------------------------------------------------------------------------------- 1 | name: Issue Close Require 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | 7 | jobs: 8 | close-issues: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: need reproduction 12 | uses: actions-cool/issues-helper@v3 13 | with: 14 | actions: close-issues 15 | token: ${{ secrets.GITHUB_TOKEN }} 16 | labels: need reproduction 17 | inactive-day: 3 18 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | extends: ['@commitlint/config-conventional'], 3 | rules: { 4 | 'type-enum': [ 5 | 2, 6 | 'always', 7 | [ 8 | 'build', 9 | 'chore', 10 | 'docs', 11 | 'feat', 12 | 'fix', 13 | 'polish', 14 | 'refactor', 15 | 'release', 16 | 'revert', 17 | 'style', 18 | 'test', 19 | 'types', 20 | ], 21 | ], 22 | }, 23 | } 24 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/alert/AlertTitle.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/index.ts: -------------------------------------------------------------------------------- 1 | export { default as FormControl } from './FormControl.vue' 2 | export { default as FormDescription } from './FormDescription.vue' 3 | export { default as FormItem } from './FormItem.vue' 4 | export { default as FormLabel } from './FormLabel.vue' 5 | export { default as FormMessage } from './FormMessage.vue' 6 | export { FORM_ITEM_INJECTION_KEY } from './injectionKeys' 7 | export { Form, Field as FormField, FieldArray as FormFieldArray } from 'vee-validate' 8 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://shadcn-vue.com/schema.json", 3 | "style": "new-york", 4 | "typescript": true, 5 | "tailwind": { 6 | "config": "", 7 | "css": "src/style.css", 8 | "baseColor": "neutral", 9 | "cssVariables": true, 10 | "prefix": "" 11 | }, 12 | "aliases": { 13 | "components": "@/components", 14 | "composables": "@/composables", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui/shadcn", 17 | "lib": "@/lib" 18 | }, 19 | "iconLibrary": "lucide" 20 | } 21 | -------------------------------------------------------------------------------- /src/composables/useSonner.ts: -------------------------------------------------------------------------------- 1 | import { toast } from 'vue-sonner' 2 | 3 | import type { Props } from '@/components/ui/sonner/types' 4 | 5 | import Sonner from '@/components/ui/sonner/Sonner.vue' 6 | 7 | export function useSonner() { 8 | const sonner = (config: Props) => { 9 | toast.custom(markRaw(Sonner), { 10 | componentProps: config, 11 | duration: config.action ? Infinity : config.duration || 5000, 12 | onDismiss: config.onClose, 13 | }) 14 | } 15 | 16 | return { 17 | sonner, 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/Dialog.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/Select.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /src/components/templates/components/base/SeparateLine.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/FormControl.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 19 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/popover/Popover.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /src/components/addons/list/Item.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 25 | -------------------------------------------------------------------------------- /src/components/preview/Skeleton.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 14 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/SelectLabel.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /src/components/social/UrlInput.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 25 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/alert/AlertDescription.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/alert/Alert.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 25 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/FormDescription.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenu.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 24 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuSub.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 24 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/FormItem.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /src/components/ui/field-form/Index.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 28 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "compilerOptions": { 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 5 | "baseUrl": ".", 6 | "paths": { 7 | "@/*": [ 8 | "./src/*" 9 | ] 10 | }, 11 | "strict": true, 12 | "noFallthroughCasesInSwitch": true, 13 | "noUnusedLocals": true, 14 | "noUnusedParameters": true, 15 | "erasableSyntaxOnly": true, 16 | "noUncheckedSideEffectImports": true 17 | }, 18 | "include": [ 19 | "src/**/*.ts", 20 | "src/**/*.tsx", 21 | "src/**/*.vue", 22 | "./auto-imports.d.ts", 23 | "./components.d.ts" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 24 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2023", 5 | "lib": ["ES2023"], 6 | "moduleDetection": "force", 7 | "module": "ESNext", 8 | "moduleResolution": "bundler", 9 | "allowImportingTsExtensions": true, 10 | "strict": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "noUnusedLocals": true, 13 | "noUnusedParameters": true, 14 | "noEmit": true, 15 | "verbatimModuleSyntax": true, 16 | "erasableSyntaxOnly": true, 17 | "skipLibCheck": true, 18 | "noUncheckedSideEffectImports": true 19 | }, 20 | "include": ["vite.config.ts"] 21 | } 22 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Dialog } from './Dialog.vue' 2 | export { default as DialogClose } from './DialogClose.vue' 3 | export { default as DialogContent } from './DialogContent.vue' 4 | export { default as DialogDescription } from './DialogDescription.vue' 5 | export { default as DialogFooter } from './DialogFooter.vue' 6 | export { default as DialogHeader } from './DialogHeader.vue' 7 | export { default as DialogOverlay } from './DialogOverlay.vue' 8 | export { default as DialogScrollContent } from './DialogScrollContent.vue' 9 | export { default as DialogTitle } from './DialogTitle.vue' 10 | export { default as DialogTrigger } from './DialogTrigger.vue' 11 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/FormMessage.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 27 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/SelectSeparator.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 22 | -------------------------------------------------------------------------------- /src/components/sidebar/nav/Item.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 31 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/FormLabel.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 25 | -------------------------------------------------------------------------------- /src/components/social/list/Item.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import antfu from '@antfu/eslint-config' 2 | 3 | export default antfu({ 4 | formatters: { 5 | css: true, 6 | }, 7 | ignores: ['**/generated/'], 8 | rules: { 9 | 'eslint-comments/no-unlimited-disable': 'off', 10 | 'perfectionist/sort-imports': [ 11 | 'error', 12 | { 13 | type: 'natural', 14 | order: 'asc', 15 | }, 16 | ], 17 | 'perfectionist/sort-objects': [ 18 | 'error', 19 | { 20 | destructureOnly: true, 21 | ignoreCase: true, 22 | order: 'asc', 23 | type: 'alphabetical', 24 | }, 25 | ], 26 | 'vue/max-attributes-per-line': [ 27 | 'error', 28 | { 29 | singleline: 1, 30 | }, 31 | ], 32 | }, 33 | }) 34 | -------------------------------------------------------------------------------- /src/components/templates/components/special/Branding.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 23 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuSeparator.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 26 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Select } from './Select.vue' 2 | export { default as SelectContent } from './SelectContent.vue' 3 | export { default as SelectGroup } from './SelectGroup.vue' 4 | export { default as SelectItem } from './SelectItem.vue' 5 | export { default as SelectItemText } from './SelectItemText.vue' 6 | export { default as SelectLabel } from './SelectLabel.vue' 7 | export { default as SelectScrollDownButton } from './SelectScrollDownButton.vue' 8 | export { default as SelectScrollUpButton } from './SelectScrollUpButton.vue' 9 | export { default as SelectSeparator } from './SelectSeparator.vue' 10 | export { default as SelectTrigger } from './SelectTrigger.vue' 11 | export { default as SelectValue } from './SelectValue.vue' 12 | -------------------------------------------------------------------------------- /src/views/Templates.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 26 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/DialogTitle.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 26 | -------------------------------------------------------------------------------- /src/components/templates/components/base/Table.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/components/sidebar/nav/Nav.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 35 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/DialogDescription.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 26 | -------------------------------------------------------------------------------- /src/components/sidebar/nav/navigation.ts: -------------------------------------------------------------------------------- 1 | import UilBrushAlt from '~icons/uil/brush-alt' 2 | import UilCreateDashboard from '~icons/uil/create-dashboard' 3 | import UilPostcard from '~icons/uil/postcard' 4 | import UilTwitterAlt from '~icons/uil/twitter-alt' 5 | import UilUserCircle from '~icons/uil/user-circle' 6 | 7 | export const main = [ 8 | { 9 | name: 'Basic', 10 | path: '/basic', 11 | icon: UilUserCircle, 12 | }, 13 | { 14 | name: 'Social', 15 | path: '/social', 16 | icon: UilTwitterAlt, 17 | }, 18 | { 19 | name: 'Options', 20 | path: '/options', 21 | icon: UilBrushAlt, 22 | }, 23 | { 24 | name: 'Addons', 25 | path: '/addons', 26 | icon: UilCreateDashboard, 27 | }, 28 | { 29 | name: 'Templates', 30 | path: '/templates', 31 | icon: UilPostcard, 32 | }, 33 | ] 34 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/button/Button.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 34 | -------------------------------------------------------------------------------- /src/components/templates/components/utils/index.ts: -------------------------------------------------------------------------------- 1 | import type { AnchorHTMLAttributes } from 'vue' 2 | 3 | import type { BasicTool } from '@/composables/signatures/types' 4 | 5 | import { normalizeUrl } from '@/utils' 6 | 7 | export function getAnchorAttrs( 8 | tool: BasicTool, 9 | textColor: string, 10 | ): AnchorHTMLAttributes | undefined { 11 | if (tool.type === 'link') { 12 | return { 13 | href: normalizeUrl(tool.value), 14 | style: { 15 | color: textColor, 16 | }, 17 | } 18 | } 19 | 20 | if (tool.type === 'email') { 21 | return { 22 | href: `mailto:${tool.value}`, 23 | style: { 24 | color: textColor, 25 | }, 26 | } 27 | } 28 | 29 | if (tool.type === 'phone') { 30 | return { 31 | href: `tel:${tool.value}`, 32 | style: { 33 | color: textColor, 34 | }, 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dialog/DialogOverlay.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | -------------------------------------------------------------------------------- /.github/workflows/issue-labeled.yml: -------------------------------------------------------------------------------- 1 | name: Issue Labeled 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | 7 | jobs: 8 | reply-labeled: 9 | runs-on: ubuntu-latest 10 | steps: 11 | 12 | - name: need reproduction 13 | if: github.event.label.name == 'need reproduction' 14 | uses: actions-cool/issues-helper@v3 15 | with: 16 | actions: 'create-comment, remove-labels' 17 | token: ${{ secrets.GITHUB_TOKEN }} 18 | issue-number: ${{ github.event.issue.number }} 19 | body: | 20 | Hello @${{ github.event.issue.user.login }}. Please describe in detail the sequence of actions that leads to the bug (skip it if it's already there). Add screenshots of errors from the console. If possible add a video. Issues marked with `need reproduction` will be closed if they have no activity within 3 days. 21 | labels: pending triage 22 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/label/Label.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuLabel.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /src/components/addons/MobileApp.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 31 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/SelectScrollUpButton.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 29 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/select/SelectScrollDownButton.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 29 | -------------------------------------------------------------------------------- /src/components/layouts/Default.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 37 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/alert/index.ts: -------------------------------------------------------------------------------- 1 | import type { VariantProps } from 'class-variance-authority' 2 | 3 | import { cva } from 'class-variance-authority' 4 | 5 | export { default as Alert } from './Alert.vue' 6 | export { default as AlertDescription } from './AlertDescription.vue' 7 | export { default as AlertTitle } from './AlertTitle.vue' 8 | 9 | export const alertVariants = cva( 10 | 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current', 11 | { 12 | variants: { 13 | variant: { 14 | default: 'bg-card text-card-foreground', 15 | destructive: 16 | 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90', 17 | }, 18 | }, 19 | defaultVariants: { 20 | variant: 'default', 21 | }, 22 | }, 23 | ) 24 | 25 | export type AlertVariants = VariantProps 26 | -------------------------------------------------------------------------------- /src/components/templates/components/addons/Disclaimer.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 42 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/form/useFormField.ts: -------------------------------------------------------------------------------- 1 | import { 2 | FieldContextKey, 3 | useFieldError, 4 | useIsFieldDirty, 5 | useIsFieldTouched, 6 | useIsFieldValid, 7 | } from 'vee-validate' 8 | import { inject } from 'vue' 9 | 10 | import { FORM_ITEM_INJECTION_KEY } from './injectionKeys' 11 | 12 | export function useFormField() { 13 | const fieldContext = inject(FieldContextKey) 14 | const fieldItemContext = inject(FORM_ITEM_INJECTION_KEY) 15 | 16 | if (!fieldContext) 17 | throw new Error('useFormField should be used within ') 18 | 19 | const { name } = fieldContext 20 | const id = fieldItemContext 21 | 22 | const fieldState = { 23 | valid: useIsFieldValid(name), 24 | isDirty: useIsFieldDirty(name), 25 | isTouched: useIsFieldTouched(name), 26 | error: useFieldError(name), 27 | } 28 | 29 | return { 30 | id, 31 | name, 32 | formItemId: `${id}-form-item`, 33 | formDescriptionId: `${id}-form-item-description`, 34 | formMessageId: `${id}-form-item-message`, 35 | ...fieldState, 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/components/preview/Footer.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 42 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | 3 | const routes = [ 4 | { 5 | path: '/basic', 6 | component: () => import('@/views/Basic.vue'), 7 | meta: { 8 | title: 'Basic signature details', 9 | }, 10 | }, 11 | { 12 | path: '/social', 13 | component: () => import('@/views/Social.vue'), 14 | meta: { 15 | title: 'Social media links', 16 | }, 17 | }, 18 | { 19 | path: '/options', 20 | component: () => import('@/views/Options.vue'), 21 | meta: { 22 | title: 'Signature options', 23 | }, 24 | }, 25 | { 26 | path: '/addons', 27 | component: () => import('@/views/Addons.vue'), 28 | meta: { 29 | title: 'Signature addons', 30 | }, 31 | }, 32 | { 33 | path: '/templates', 34 | component: () => import('@/views/Templates.vue'), 35 | meta: { 36 | title: 'Templates', 37 | }, 38 | }, 39 | { 40 | path: '/:pathMatch(.*)*', 41 | redirect: '/basic', 42 | }, 43 | ] 44 | 45 | export const router = createRouter({ 46 | history: createWebHistory(), 47 | routes, 48 | }) 49 | -------------------------------------------------------------------------------- /src/components/basic/Form.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 42 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DropdownMenu } from './DropdownMenu.vue' 2 | 3 | export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue' 4 | export { default as DropdownMenuContent } from './DropdownMenuContent.vue' 5 | export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue' 6 | export { default as DropdownMenuItem } from './DropdownMenuItem.vue' 7 | export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue' 8 | export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue' 9 | export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue' 10 | export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue' 11 | export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue' 12 | export { default as DropdownMenuSub } from './DropdownMenuSub.vue' 13 | export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue' 14 | export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue' 15 | export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue' 16 | export { DropdownMenuPortal } from 'reka-ui' 17 | -------------------------------------------------------------------------------- /src/components/templates/components/addons/Banner.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 44 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/toggle/Toggle.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 45 | -------------------------------------------------------------------------------- /src/components/addons/Disclaimer.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 43 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import tailwindcss from '@tailwindcss/vite' 2 | import vue from '@vitejs/plugin-vue' 3 | import path from 'node:path' 4 | import AutoImport from 'unplugin-auto-import/vite' 5 | import IconsResolver from 'unplugin-icons/resolver' 6 | import Icons from 'unplugin-icons/vite' 7 | import Components from 'unplugin-vue-components/vite' 8 | import { defineConfig } from 'vite' 9 | 10 | // https://vite.dev/config/ 11 | export default defineConfig({ 12 | plugins: [ 13 | vue(), 14 | tailwindcss(), 15 | AutoImport({ 16 | imports: ['vue', 'vue-router'], 17 | dirs: ['./src/composables/**'], 18 | }), 19 | Components({ 20 | dts: true, 21 | directoryAsNamespace: true, 22 | collapseSamePrefixes: true, 23 | globalNamespaces: ['shadcn'], 24 | types: [ 25 | { 26 | from: 'vue-router', 27 | names: ['RouterLink', 'RouterView'], 28 | }, 29 | ], 30 | resolvers: [ 31 | IconsResolver({ 32 | prefix: false, 33 | }), 34 | ], 35 | }), 36 | Icons({ 37 | compiler: 'vue3', 38 | }), 39 | ], 40 | resolve: { 41 | alias: { 42 | '@': path.resolve(__dirname, './src'), 43 | }, 44 | }, 45 | }) 46 | -------------------------------------------------------------------------------- /src/components/addons/Logo.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 44 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/dropdown-menu/DropdownMenuSubTrigger.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 34 | -------------------------------------------------------------------------------- /src/components/templates/components/addons/Logo.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 49 | -------------------------------------------------------------------------------- /src/components/ui/shadcn/textarea/Textarea.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 |