diff --git a/.gitignore b/.gitignore
index 06dc2511..c8ac1b7f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,5 +12,4 @@ dist
**/.vitepress/cache
packages/**/tsconfig.json
-packages/jsx-email/README.md
-!packages/jsx-email/src/cli/preview-app/tsconfig.json
\ No newline at end of file
+packages/jsx-email/README.md
\ No newline at end of file
diff --git a/apps/preview/moon.yml b/apps/preview/moon.yml
index dbcfe5cb..9ccbccba 100644
--- a/apps/preview/moon.yml
+++ b/apps/preview/moon.yml
@@ -11,4 +11,4 @@ tasks:
options:
cache: false
outputStyle: 'stream'
- runDepsInParallel: false
\ No newline at end of file
+ runDepsInParallel: false
diff --git a/docs/components/qrcode.md b/docs/components/qrcode.md
index 6acb80dc..b735c664 100644
--- a/docs/components/qrcode.md
+++ b/docs/components/qrcode.md
@@ -81,7 +81,5 @@ width?: number;
(Optional) The width of the wrapping image in pixels. If not provided, the `size` value will be used.
::: tip
-This component also expresses all of the [Common Component Props](https://react.dev/reference/react-dom/components/common) for `ComponentProps<'img'>`
+This component also expresses all of the [Common Component Props](https://react.dev/reference/react-dom/components/common) for `ComponentProps<'img'>`
:::
-
-
diff --git a/packages/jsx-email/moon.yml b/packages/jsx-email/moon.yml
index 3595eeea..a9f0a00d 100644
--- a/packages/jsx-email/moon.yml
+++ b/packages/jsx-email/moon.yml
@@ -12,7 +12,6 @@ tasks:
- ~:clean.dist
- ~:compile
- ~:copy.assets
- - ~:copy.preview
- ~:copy.readme
inputs:
- src
@@ -42,11 +41,6 @@ tasks:
options:
cache: false
- copy.preview:
- command: cp -r src/cli/preview-app dist
- options:
- cache: false
-
copy.readme:
command: cp -r ../../README.md README.md
options:
diff --git a/packages/jsx-email/package.json b/packages/jsx-email/package.json
index 67f1e5f2..c3b3e66a 100644
--- a/packages/jsx-email/package.json
+++ b/packages/jsx-email/package.json
@@ -9,9 +9,9 @@
"repository": {
"type": "git",
"url": "https://github.com/shellscape/jsx-email.git",
- "directory": "packages/render"
+ "directory": "packages/jsx-email"
},
- "homepage": "https://jsx.email/docs/core/render",
+ "homepage": "https://jsx.email/",
"main": "dist/index.js",
"bin": {
"email": "./dist/cli/index.js"
@@ -45,14 +45,9 @@
},
"dependencies": {
"@dot/log": "^0.1.3",
- "@jspm/core": "^2.0.1",
+ "@jsx-email/app-preview": "workspace:*",
"@jsx-email/doiuse-email": "^1.0.1",
- "@radix-ui/colors": "1.0.1",
- "@radix-ui/react-collapsible": "1.0.3",
- "@radix-ui/react-popover": "1.0.6",
"@radix-ui/react-slot": "1.0.2",
- "@radix-ui/react-toggle-group": "1.0.4",
- "@radix-ui/react-tooltip": "1.0.6",
"@unocss/core": "^0.57.7",
"@unocss/preset-typography": "^0.57.7",
"@unocss/preset-uno": "^0.57.7",
@@ -65,8 +60,6 @@
"classnames": "2.3.2",
"debug": "^4.3.4",
"esbuild": "^0.19.3",
- "esbuild-plugin-copy": "^2.1.1",
- "framer-motion": "8.5.5",
"globby": "11.0.4",
"hash-it": "^6.0.0",
"html-to-text": "9.0.5",
@@ -80,19 +73,15 @@
"pretty": "2.0.0",
"pretty-bytes": "^5.6.0",
"qrcode": "^1.5.3",
- "react": "18.2.0",
- "react-dom": "18.2.0",
- "react-router-dom": "6.16.0",
"rehype": "^13.0.1",
"rehype-preset-minify": "^7.0.0",
"rehype-stringify": "^10.0.0",
"rollup-plugin-hypothetical": "^2.1.1",
- "shikiji": "^0.6.8",
+ "shikiji": "^0.8.0",
"source-map-js": "^1.0.2",
"source-map-support": "^0.5.21",
"std-env": "^3.6.0",
"superstruct": "^1.0.3",
- "tailwindcss": "3.3.3",
"titleize": "^4.0.0",
"unist-util-visit": "^5.0.0",
"vite": "^4.4.9",
@@ -104,14 +93,10 @@
"@types/html-minifier-terser": "^7.0.0",
"@types/html-to-text": "^9.0.2",
"@types/import-local": "^3.1.2",
- "@types/object-hash": "^3.0.6",
- "@types/postcss-css-variables": "^0.18.3",
"@types/pretty": "^2.0.1",
"@types/source-map-support": "^0.5.10",
"@types/yargs-parser": "^21.0.3",
- "hast": "^1.0.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
+ "hast": "^1.0.0"
},
"types": "dist/index.d.mts",
"funding": {
diff --git a/packages/jsx-email/src/cli/commands/preview.ts b/packages/jsx-email/src/cli/commands/preview.ts
index 64f75d6e..2f542cfb 100644
--- a/packages/jsx-email/src/cli/commands/preview.ts
+++ b/packages/jsx-email/src/cli/commands/preview.ts
@@ -54,8 +54,7 @@ export const start = async (targetPath: string, argv: PreviewOptions) => {
}
const { host = false, open = true, port = 55420 } = argv;
- const { viteConfig } = await import('./vite.config');
-
+ const { viteConfig } = await import('./vite');
const mergedConfig = {
configFile: false,
...viteConfig,
@@ -70,7 +69,7 @@ export const start = async (targetPath: string, argv: PreviewOptions) => {
const server = await createServer(mergedConfig);
- info(chalk`\n 🚀 {yellow JSX email} Preview\n`);
+ info(chalk`\n 🚀 {yellow jsx-email} Preview\n`);
await server.listen();
diff --git a/packages/jsx-email/src/cli/commands/vite.config.ts b/packages/jsx-email/src/cli/commands/vite.ts
similarity index 92%
rename from packages/jsx-email/src/cli/commands/vite.config.ts
rename to packages/jsx-email/src/cli/commands/vite.ts
index c87cb326..d0b2a471 100644
--- a/packages/jsx-email/src/cli/commands/vite.config.ts
+++ b/packages/jsx-email/src/cli/commands/vite.ts
@@ -1,4 +1,4 @@
-import { resolve } from 'path';
+import { dirname, join } from 'path';
import react from '@vitejs/plugin-react';
import { createLogger, defineConfig } from 'vite';
@@ -8,12 +8,11 @@ import { nodePolyfills } from 'vite-plugin-node-polyfills';
// eslint-disable-next-line
import hypothetical from 'rollup-plugin-hypothetical';
-const root = resolve(__dirname, '../preview-app');
-
-process.chdir(root);
-
const logger = createLogger();
const { warnOnce: og } = logger;
+const root = join(dirname(require.resolve('@jsx-email/app-preview')), 'app');
+
+process.chdir(root);
logger.warnOnce = (message, options) => {
// Note: ignore `Sourcemap for "${file}" points to missing source files` errors
diff --git a/packages/jsx-email/src/cli/preview-app/.eslintrc.js b/packages/jsx-email/src/cli/preview-app/.eslintrc.js
deleted file mode 100644
index 5b1bfab4..00000000
--- a/packages/jsx-email/src/cli/preview-app/.eslintrc.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- rules: {
- 'import/extensions': 'off',
- 'import/no-default-export': 'off'
- }
-};
diff --git a/packages/jsx-email/src/cli/preview-app/README.md b/packages/jsx-email/src/cli/preview-app/README.md
deleted file mode 100644
index 7bddada0..00000000
--- a/packages/jsx-email/src/cli/preview-app/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# jsx-email CLI Preview App
-
-These files are not meant to be compiled, but rather shipped as-is with the package, and will be loaded and evaluated by `vite dev` at runtime. Do not compile these files.
diff --git a/packages/jsx-email/src/cli/preview-app/index.html b/packages/jsx-email/src/cli/preview-app/index.html
deleted file mode 100644
index 5b412429..00000000
--- a/packages/jsx-email/src/cli/preview-app/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- JSX Email
-
-
-
-
-
-
diff --git a/packages/jsx-email/src/cli/preview-app/postcss.config.js b/packages/jsx-email/src/cli/preview-app/postcss.config.js
deleted file mode 100644
index cd1a2b94..00000000
--- a/packages/jsx-email/src/cli/preview-app/postcss.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- plugins: {
- autoprefixer: {},
- tailwindcss: {}
- }
-};
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/code-container.tsx b/packages/jsx-email/src/cli/preview-app/src/components/code-container.tsx
deleted file mode 100644
index 8f2966e7..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/code-container.tsx
+++ /dev/null
@@ -1,94 +0,0 @@
-import classNames from 'classnames';
-import * as React from 'react';
-
-import { type PreviewLanguage, copyTextToClipboard } from '../helpers';
-
-import { Code } from './code';
-import { IconButton, IconCheck, IconClipboard, IconDownload } from './icons';
-import { Tooltip } from './tooltip';
-
-interface RawProps {
- content: string;
- language: PreviewLanguage;
-}
-
-interface CodeContainerProps {
- activeView: string;
- raws: RawProps[];
- setActiveView: (lang: string) => void;
-}
-
-export const CodeContainer: React.FC> = ({
- activeView,
- raws
- // setActiveLang
-}) => {
- const [isCopied, setIsCopied] = React.useState(false);
-
- const renderDownloadIcon = () => {
- const value = raws.find((raw) => raw.language === activeView);
- const file = new File([value!.content], `email.${value!.language}`);
- const url = URL.createObjectURL(file);
-
- return (
-
-
-
- );
- };
-
- const renderClipboardIcon = () => {
- const handleClipboard = async () => {
- const activeContent = raws.filter(({ language }) => activeView === language);
- setIsCopied(true);
- await copyTextToClipboard(activeContent[0].content);
- setTimeout(() => setIsCopied(false), 3000);
- };
-
- return (
-
- {isCopied ? : }
-
- );
- };
-
- React.useEffect(() => {
- setIsCopied(false);
- }, [activeView]);
-
- return (
- <>
-
-
- {renderClipboardIcon()}
-
- Copy to Clipboard
-
-
-
- {renderDownloadIcon()}
-
- Download
-
- {raws.map(({ language, content }) => (
-
- {content.trim()}
-
- ))}
- >
- );
-};
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/code.tsx b/packages/jsx-email/src/cli/preview-app/src/components/code.tsx
deleted file mode 100644
index fa65117b..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/code.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import classnames from 'classnames';
-import { getHighlighter } from 'shikiji';
-
-import { type PreviewLanguage } from '../helpers';
-
-interface CodeProps {
- children: string;
- className?: string;
- language?: PreviewLanguage;
-}
-
-const theme = 'dark-plus';
-const shiki = await getHighlighter({
- langs: ['html', 'tsx'],
- themes: [theme]
-});
-
-export const Code = ({ children: value, language = 'html' }: CodeProps) => {
- // const [isCopied, setIsCopied] = React.useState(false);
- const lang = language === 'jsx' ? 'tsx' : language;
- const code = language === 'plain' ? value : shiki.codeToHtml(value, { lang, theme });
- const lines = value.split('\n').length;
- const css = `
- .${language} .shiki .line:before {
- width: calc(${lines.toString().length} * 12px + 12px);
- }`;
-
- return (
- <>
-
-
- >
- );
-};
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/heading.tsx b/packages/jsx-email/src/cli/preview-app/src/components/heading.tsx
deleted file mode 100644
index 774eadc1..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/heading.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import * as SlotPrimitive from '@radix-ui/react-slot';
-import classnames from 'classnames';
-import * as React from 'react';
-
-import { type As, unreachable } from '../helpers';
-
-export type HeadingSize = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10';
-export type HeadingColor = 'white' | 'gray';
-export type HeadingWeight = 'medium' | 'bold';
-
-interface HeadingOwnProps {
- color?: HeadingColor;
- size?: HeadingSize;
- weight?: HeadingWeight;
-}
-
-type HeadingProps = As<'h1', 'h2', 'h3', 'h4', 'h5', 'h6'> & HeadingOwnProps;
-
-const getSizesClassNames = (size: HeadingSize | undefined) => {
- switch (size) {
- case '1':
- return 'text-xs';
- case '2':
- return 'text-sm';
- case undefined:
- case '3':
- return 'text-base';
- case '4':
- return 'text-lg';
- case '5':
- return 'text-xl tracking-[-0.16px]';
- case '6':
- return 'text-2xl tracking-[-0.288px]';
- case '7':
- return 'text-[28px] leading-[34px] tracking-[-0.416px]';
- case '8':
- return 'text-[35px] leading-[42px] tracking-[-0.64px]';
- case '9':
- return 'text-6xl leading-[73px] tracking-[-0.896px]';
- case '10':
- return [
- 'text-[38px] leading-[46px]',
- 'md:text-[70px] md:leading-[85px] tracking-[-1.024px;]'
- ];
- default:
- return unreachable(size);
- }
-};
-
-const getWeightClassNames = (weight: HeadingWeight | undefined) => {
- switch (weight) {
- case 'medium':
- return 'font-medium';
- case 'bold':
- case undefined:
- return 'font-bold';
- default:
- return unreachable(weight);
- }
-};
-
-export const Heading = React.forwardRef>(
- (
- { as: Tag = 'h1', size = '3', className, children, weight = 'bold', ...props },
- forwardedRef
- ) => (
-
- {children}
-
- )
-);
-
-Heading.displayName = 'Heading';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/icons.tsx b/packages/jsx-email/src/cli/preview-app/src/components/icons.tsx
deleted file mode 100644
index 572e5bb5..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/icons.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import classnames from 'classnames';
-import * as React from 'react';
-
-export type IconElement = React.ElementRef<'svg'>;
-export type RootProps = React.ComponentPropsWithoutRef<'svg'>;
-
-export interface IconProps extends RootProps {
- size?: number;
-}
-
-export const IconBase = React.forwardRef>(
- ({ size = 20, ...props }, forwardedRef) => (
-
- )
-);
-
-IconBase.displayName = 'IconBase';
-
-export interface IconButtonProps extends React.ComponentPropsWithoutRef<'button'> {}
-
-export const IconButton = React.forwardRef>(
- ({ children, className, ...props }, forwardedRef) => (
-
- )
-);
-
-IconButton.displayName = 'IconButton';
-
-export const IconCheck = React.forwardRef>(
- ({ ...props }, forwardedRef) => (
-
-
-
- )
-);
-
-IconCheck.displayName = 'IconCheck';
-
-export const IconClipboard = React.forwardRef>(
- ({ ...props }, forwardedRef) => (
-
-
-
-
-
-
- )
-);
-
-IconClipboard.displayName = 'IconClipboard';
-
-export const IconDownload = React.forwardRef>(
- ({ ...props }, forwardedRef) => (
-
-
-
- )
-);
-
-IconDownload.displayName = 'IconDownload';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/index.ts b/packages/jsx-email/src/cli/preview-app/src/components/index.ts
deleted file mode 100644
index 61f907a3..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export * from './code';
-export * from './heading';
-export * from './icons';
-export * from './logo';
-export * from './sidebar';
-export * from './text';
-export * from './topbar';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/logo.tsx b/packages/jsx-email/src/cli/preview-app/src/components/logo.tsx
deleted file mode 100644
index 59cb1eee..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/logo.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import * as React from 'react';
-
-type LogoElement = React.ElementRef<'svg'>;
-type RootProps = React.ComponentPropsWithoutRef<'svg'>;
-
-export const Logo = React.forwardRef>((_, __) => (
-
-));
-
-Logo.displayName = 'Logo';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/shell.tsx b/packages/jsx-email/src/cli/preview-app/src/components/shell.tsx
deleted file mode 100644
index 38598fa4..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/shell.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import classNames from 'classnames';
-import * as React from 'react';
-
-import { Sidebar } from './sidebar';
-import { Topbar } from './topbar';
-
-type ShellElement = React.ElementRef<'div'>;
-type RootProps = React.ComponentPropsWithoutRef<'div'>;
-
-interface ShellProps extends RootProps {
- activeView?: string;
- html?: string;
- setActiveView?: (view: string) => void;
- templateNames: string[];
-}
-
-export const Shell = React.forwardRef>(
- ({ title, templateNames, children, html, activeView, setActiveView }, forwardedRef) => {
- const [showNav] = React.useState(false);
- return (
-
-
-
-
- {title && (
-
- )}
-
-
-
-
- );
- }
-);
-
-Shell.displayName = 'Shell';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/sidebar.tsx b/packages/jsx-email/src/cli/preview-app/src/components/sidebar.tsx
deleted file mode 100644
index 6bcb080a..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/sidebar.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import * as Collapsible from '@radix-ui/react-collapsible';
-import classnames from 'classnames';
-import { LayoutGroup, motion } from 'framer-motion';
-import * as React from 'react';
-import { Link } from 'react-router-dom';
-
-import { Heading } from './heading';
-import { Logo } from './logo';
-
-type SidebarElement = React.ElementRef<'aside'>;
-type RootProps = React.ComponentPropsWithoutRef<'aside'>;
-
-interface SidebarProps extends RootProps {
- templateNames: string[];
- title?: string;
-}
-
-export const Sidebar = React.forwardRef>(
- ({ className, templateNames, title, ...props }, forwardedRef) => (
-
- )
-);
-
-Sidebar.displayName = 'Sidebar';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/text.tsx b/packages/jsx-email/src/cli/preview-app/src/components/text.tsx
deleted file mode 100644
index b23cb13e..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/text.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import * as SlotPrimitive from '@radix-ui/react-slot';
-import classnames from 'classnames';
-import * as React from 'react';
-
-import { type As, unreachable } from '../helpers';
-
-export type TextSize = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
-export type TextColor = 'gray' | 'white';
-export type TextTransform = 'uppercase' | 'lowercase' | 'capitalize';
-export type TextWeight = 'normal' | 'medium';
-
-interface TextOwnProps {
- color?: TextColor;
- size?: TextSize;
- transform?: TextTransform;
- weight?: TextWeight;
-}
-
-type TextProps = As<'span', 'div', 'p'> & TextOwnProps;
-
-const getSizesClassNames = (size: TextSize | undefined) => {
- switch (size) {
- case '1':
- return 'text-xs';
- case undefined:
- case '2':
- return 'text-sm';
- case '3':
- return 'text-base';
- case '4':
- return 'text-lg';
- case '5':
- return ['text-17px', 'md:text-xl tracking-[-0.16px]'];
- case '6':
- return 'text-2xl tracking-[-0.288px]';
- case '7':
- return 'text-[28px] leading-[34px] tracking-[-0.416px]';
- case '8':
- return 'text-[35px] leading-[42px] tracking-[-0.64px]';
- case '9':
- return 'text-6xl leading-[73px] tracking-[-0.896px]';
- default:
- return unreachable(size);
- }
-};
-
-const getWeightClassNames = (weight: TextWeight | undefined) => {
- switch (weight) {
- case undefined:
- case 'normal':
- return 'font-normal';
- case 'medium':
- return 'font-medium';
- default:
- return unreachable(weight);
- }
-};
-
-export const Text = React.forwardRef>(
- (
- { as: Tag = 'span', size = '2', transform, weight = 'normal', className, children, ...props },
- forwardedRef
- ) => (
-
- {children}
-
- )
-);
-
-Text.displayName = 'Text';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/tooltip-content.tsx b/packages/jsx-email/src/cli/preview-app/src/components/tooltip-content.tsx
deleted file mode 100644
index 731d98da..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/tooltip-content.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import * as TooltipPrimitive from '@radix-ui/react-tooltip';
-import classnames from 'classnames';
-import * as React from 'react';
-
-type ContentElement = React.ElementRef;
-type ContentProps = React.ComponentPropsWithoutRef;
-
-export interface TooltipProps extends ContentProps {}
-
-export const TooltipContent = React.forwardRef>(
- ({ sideOffset = 6, children, ...props }, forwardedRef) => (
-
-
- {children}
-
-
- )
-);
-
-TooltipContent.displayName = 'TooltipContent';
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/tooltip.tsx b/packages/jsx-email/src/cli/preview-app/src/components/tooltip.tsx
deleted file mode 100644
index 247d8093..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/tooltip.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as TooltipPrimitive from '@radix-ui/react-tooltip';
-import * as React from 'react';
-
-import { TooltipContent } from './tooltip-content';
-
-type RootProps = React.ComponentPropsWithoutRef;
-
-export interface TooltipProps extends RootProps {}
-
-export const TooltipRoot: React.FC> = ({ children, ...props }) => (
- {children}
-);
-
-export const Tooltip = Object.assign(TooltipRoot, {
- Arrow: TooltipPrimitive.TooltipArrow,
- Content: TooltipContent,
- Provider: TooltipPrimitive.TooltipProvider,
- Trigger: TooltipPrimitive.TooltipTrigger
-});
diff --git a/packages/jsx-email/src/cli/preview-app/src/components/topbar.tsx b/packages/jsx-email/src/cli/preview-app/src/components/topbar.tsx
deleted file mode 100644
index 3d335067..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/components/topbar.tsx
+++ /dev/null
@@ -1,140 +0,0 @@
-import * as ToggleGroup from '@radix-ui/react-toggle-group';
-import classnames from 'classnames';
-import { LayoutGroup, motion } from 'framer-motion';
-import * as React from 'react';
-
-import { Heading } from './heading';
-
-type TopbarElement = React.ElementRef<'header'>;
-type RootProps = React.ComponentPropsWithoutRef<'header'>;
-
-interface TopbarProps extends RootProps {
- activeView?: string;
- markup?: string;
- setActiveView?: (view: string) => void;
- title: string;
-}
-
-export const Topbar = React.forwardRef>(
- ({ className, title, markup, activeView, setActiveView, ...props }, forwardedRef) => {
- const button = 'text-sm font-medium px-3 py-2 transition ease-in-out duration-200 relative';
- const span = 'absolute left-0 right-0 top-0 bottom-0 bg-cta-bg';
-
- return (
-
-
-
- {title}
-
-
-
-
-
- {setActiveView && (
- {
- if (!value) return;
- setActiveView(value);
- }}
- >
-
-
- {activeView === 'desktop' && (
-
- )}
-
- Desktop
-
-
-
-
-
- {activeView === 'jsx' && (
-
- )}
-
- JSX
-
-
-
-
-
- {activeView === 'html' && (
-
- )}
-
- HTML
-
-
-
-
-
- {activeView === 'plain' && (
-
- )}
-
- Plain Text
-
-
-
-
- )}
-
-
-
- );
- }
-);
-
-Topbar.displayName = 'Topbar';
diff --git a/packages/jsx-email/src/cli/preview-app/src/css/globals.css b/packages/jsx-email/src/cli/preview-app/src/css/globals.css
deleted file mode 100644
index 31946efd..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/css/globals.css
+++ /dev/null
@@ -1,53 +0,0 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-@layer base {
- html,
- body {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
- font-weight: 300;
- }
-
- .shiki {
- background: inherit !important;
- counter-reset: line 0;
- display: block;
- gap: 0.3em;
- grid-auto-rows: 1em;
- grid-template-columns: min-content 1fr;
- }
-
- .shiki .line {
- display: inline-block;
- line-height: 20px;
- min-height: auto;
- vertical-align: middle;
- white-space: pre;
- }
-
- .shiki .line:last-child:before,
- .shiki .line:last-child span {
- padding-bottom: 30px;
- }
-
- .shiki .line:first-child:before,
- .shiki .line:first-child span {
- padding-top: 10px;
- }
-
- .shiki .line:before {
- background: #3d3a3a;
- color: #777;
- content: counter(line);
- counter-increment: line;
- display: inline-block;
- margin-right: 10px;
- padding-right: 10px;
- text-align: right;
- }
-
- .plainText .shiki .line:before {
- display: none;
- }
-}
diff --git a/packages/jsx-email/src/cli/preview-app/src/error.tsx b/packages/jsx-email/src/cli/preview-app/src/error.tsx
deleted file mode 100644
index a0a5f07b..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/error.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useRouteError } from 'react-router-dom';
-
-const { error } = console;
-
-export const Error = () => {
- const err: any = useRouteError();
- error(err);
-
- return (
-
-
Oops!
-
Sorry, an unexpected error has occurred.
-
- {err.statusText || err.message}
-
-
- );
-};
diff --git a/packages/jsx-email/src/cli/preview-app/src/helpers.ts b/packages/jsx-email/src/cli/preview-app/src/helpers.ts
deleted file mode 100644
index 12776f1b..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/helpers.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-export type As<
- DefaultTag extends React.ElementType,
- T1 extends React.ElementType,
- T2 extends React.ElementType = T1,
- T3 extends React.ElementType = T1,
- T4 extends React.ElementType = T1,
- T5 extends React.ElementType = T1
-> =
- | (React.ComponentPropsWithRef & {
- as?: DefaultTag;
- })
- | (React.ComponentPropsWithRef & {
- as: T1;
- })
- | (React.ComponentPropsWithRef & {
- as: T2;
- })
- | (React.ComponentPropsWithRef & {
- as: T3;
- })
- | (React.ComponentPropsWithRef & {
- as: T4;
- })
- | (React.ComponentPropsWithRef & {
- as: T5;
- });
-
-export type PreviewLanguage = 'html' | 'jsx' | 'plain';
-
-export const copyTextToClipboard = async (text: string) => {
- try {
- await navigator.clipboard.writeText(text);
- } catch {
- throw new Error('Not able to copy');
- }
-};
-
-export const languageMap = {
- html: '',
- jsx: '',
- plainText: 'Plain Text'
-};
-
-export const unreachable = (
- condition: never,
- message = `Entered unreachable code. Received '${condition}'.`
-): never => {
- throw new TypeError(message);
-};
diff --git a/packages/jsx-email/src/cli/preview-app/src/home.tsx b/packages/jsx-email/src/cli/preview-app/src/home.tsx
deleted file mode 100644
index a6c362c2..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/home.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-'use client';
-
-import * as SlotPrimitive from '@radix-ui/react-slot';
-import React from 'react';
-
-import { Heading, Text } from './components';
-import { Shell } from './components/shell';
-
-export const Home = ({ templateNames }: { templateNames: string[] }) => {
- React.useEffect(() => {
- document.title = 'JSX email';
- }, []);
-
- return (
-
-
-
- JSX Email Preview
-
-
- Start creating an email template by running{' '}
- email create <template-name>
-
-
- Run email help create
for a list of options
-
-
- Happy coding!
-
-
-
-
- Read our Documentation
-
-
-
-
- );
-};
diff --git a/packages/jsx-email/src/cli/preview-app/src/layout.tsx b/packages/jsx-email/src/cli/preview-app/src/layout.tsx
deleted file mode 100644
index 4e0fe02d..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/layout.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-/* eslint-disable import/first */
-import './css/globals.css';
-
-export const Layout = ({ children }: { children: React.ReactNode }) => (
-
-);
diff --git a/packages/jsx-email/src/cli/preview-app/src/main.tsx b/packages/jsx-email/src/cli/preview-app/src/main.tsx
deleted file mode 100644
index 514fef2a..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/main.tsx
+++ /dev/null
@@ -1,96 +0,0 @@
-// eslint-disable-next-line import/no-extraneous-dependencies
-import { render, renderPlainText } from 'jsx-email';
-import React from 'react';
-import ReactDOM from 'react-dom/client';
-import { createBrowserRouter, type RouteObject, RouterProvider } from 'react-router-dom';
-import { create, type Struct } from 'superstruct';
-import titleize from 'titleize';
-
-import { Error } from './error.tsx';
-import { Home } from './home.tsx';
-import { Layout } from './layout.tsx';
-import { Preview } from './preview.tsx';
-
-interface TemplateExports {
- Name?: string;
- PreviewProps?: () => any;
- Template: React.ExoticComponent;
- TemplateStruct?: Struct;
-}
-
-interface TemplateData extends TemplateExports {
- jsx: string;
-}
-
-const { warn } = console;
-
-const addSpacesForCamelCaseName = (str: string) => str.replace(/([a-z])([A-Z])/g, '$1 $2');
-
-const parseName = (path: string) => {
- const chunks = path.replace('\\', '/').split('/');
- const segment = chunks.at(-1);
- const basename = segment!.split(/\.[^.]+$/)[0];
-
- return titleize(addSpacesForCamelCaseName(basename));
-};
-
-const modules = import.meta.glob('@/*.{jsx,tsx}', { eager: true });
-const sources = import.meta.glob('@/*.{jsx,tsx}', { as: 'raw', eager: true });
-
-const templates = await Promise.all(
- Object.entries(modules).map>(async ([path, mod]) => {
- const component = mod as TemplateExports;
- const result: TemplateData = {
- jsx: sources[path],
- Name: component.Name || parseName(path),
- PreviewProps: component.PreviewProps,
- Template: component.Template || (component as any).default,
- TemplateStruct: component.TemplateStruct
- };
- return result;
- })
-);
-
-const templateNames = templates.map((template) => template.Name!);
-
-const templateRoutes = templates.map(async (template) => {
- const { Name, PreviewProps, Template, TemplateStruct } = template;
- let props: any;
-
- if (TemplateStruct) props = create({}, TemplateStruct);
- else if (PreviewProps) props = PreviewProps();
- else if ((Template as any).PreviewProps) {
- warn(
- `jsx-email: ${Name} → PreviewProps as a property of a component is deprecated. Please used a named export.`
- );
- props = (Template as any).PreviewProps;
- }
-
- const html = await render(, { pretty: true });
- const plainText = await renderPlainText();
- const element = (
-
-
-
- );
- return { element, path: `/${template.Name}` } as RouteObject;
-});
-
-const router = createBrowserRouter([
- {
- element: (
-
-
-
- ),
- errorElement: ,
- path: '/'
- },
- ...(await Promise.all(templateRoutes))
-]);
-
-ReactDOM.createRoot(document.getElementById('root')!).render(
-
-
-
-);
diff --git a/packages/jsx-email/src/cli/preview-app/src/preview.tsx b/packages/jsx-email/src/cli/preview-app/src/preview.tsx
deleted file mode 100644
index fc797271..00000000
--- a/packages/jsx-email/src/cli/preview-app/src/preview.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-'use client';
-
-import React from 'react';
-import { useLocation, useNavigate, useSearchParams } from 'react-router-dom';
-
-import { CodeContainer } from './components/code-container';
-import { Shell } from './components/shell';
-import { Tooltip } from './components/tooltip';
-
-interface PreviewProps {
- html: string;
- jsx: string;
- plainText: string;
- templateNames: string[];
- title: string;
-}
-
-export const Preview = ({ html, jsx, plainText, templateNames, title }: PreviewProps) => {
- const { pathname } = useLocation();
- const navigate = useNavigate();
- const [searchParams] = useSearchParams();
-
- const [activeView, setActiveView] = React.useState('desktop');
-
- React.useEffect(() => {
- document.title = `JSX email • ${title}`;
-
- const view = searchParams.get('view');
-
- if (view && ['desktop', 'html', 'jsx', 'plainText'].includes(view)) setActiveView(view);
- }, [searchParams]);
-
- const handleViewChange = (view: string) => {
- setActiveView(view);
- navigate(`${pathname}?view=${view}`);
- };
-
- return (
-
- {activeView === 'desktop' ? (
-
- ) : (
-
-
-
-
-
- )}
-
- );
-};
diff --git a/packages/jsx-email/src/cli/preview-app/tailwind.config.js b/packages/jsx-email/src/cli/preview-app/tailwind.config.js
deleted file mode 100644
index 5940c251..00000000
--- a/packages/jsx-email/src/cli/preview-app/tailwind.config.js
+++ /dev/null
@@ -1,101 +0,0 @@
-const colors = require('@radix-ui/colors');
-const plugin = require('tailwindcss/plugin');
-
-const iOsHeight = plugin(({ addUtilities }) => {
- const supportsTouchRule = '@supports (-webkit-touch-callout: none)';
- const webkitFillAvailable = '-webkit-fill-available';
-
- const utilities = {
- '.h-screen-ios': {
- [supportsTouchRule]: {
- height: webkitFillAvailable
- }
- },
- '.min-h-screen-ios': {
- [supportsTouchRule]: {
- minHeight: webkitFillAvailable
- }
- }
- };
-
- addUtilities(utilities, ['responsive']);
-});
-
-/** @type {import('tailwindcss').Config} */
-module.exports = {
- content: [
- // app content
- `src/**/*.{js,ts,jsx,tsx}`,
- // include packages if not transpiling
- '../../../packages/**/*.{js,ts,jsx,tsx}'
- ],
- plugins: [iOsHeight],
- theme: {
- colors: {
- 'button-bg': '#3d3a3a',
- 'code-bg': '#353436',
- 'cta-bg': '#ffd152',
- 'cta-bg-hover': '#ffc31f',
- 'cta-text': '#343233',
- 'dark-bg': '#343233',
- 'dark-bg-border': '#1a191a',
- 'dark-bg-text': '#efdab9',
- 'darker-bg': '#2c2a2b',
- 'light-bg': '#efeae1',
- 'light-bg-text': '#574c4f',
- link: '#ffd152',
- 'link-hover': '#ebac00',
- 'tab-bg': '#47504E'
- },
- extend: {
- backgroundImage: {
- gradient:
- 'linear-gradient(145.37deg, rgba(255, 255, 255, 0.09) -8.75%, rgba(255, 255, 255, 0.027) 83.95%)',
- gradientHover:
- 'linear-gradient(145.37deg, rgba(255, 255, 255, 0.1) -8.75%, rgba(255, 255, 255, 0.057) 83.95%)',
- shine:
- 'linear-gradient(45deg, rgba(255,255,255,0) 45%,rgba(255,255,255,1) 50%,rgba(255,255,255,0) 55%,rgba(255,255,255,0) 100%)'
- },
- colors: {
- cyan: {
- 1: colors.cyanDarkA.cyanA1,
- 2: colors.cyanDarkA.cyanA2,
- 3: colors.cyanDarkA.cyanA3,
- 4: colors.cyanDarkA.cyanA4,
- 5: colors.cyanDarkA.cyanA5,
- 6: colors.cyanDarkA.cyanA6,
- 7: colors.cyanDarkA.cyanA7,
- 8: colors.cyanDarkA.cyanA8,
- 9: colors.cyanDarkA.cyanA9,
- 10: colors.cyanDarkA.cyanA10,
- 11: colors.cyanDarkA.cyanA11,
- 12: colors.cyanDarkA.cyanA12
- },
- slate: {
- 1: colors.slateDarkA.slateA1,
- 2: colors.slateDarkA.slateA2,
- 3: colors.slateDarkA.slateA3,
- 4: colors.slateDarkA.slateA4,
- 5: colors.slateDarkA.slateA5,
- 6: colors.slateDarkA.slateA6,
- 7: colors.slateDarkA.slateA7,
- 8: colors.slateDarkA.slateA8,
- 9: colors.slateDarkA.slateA9,
- 10: colors.slateDarkA.slateA10,
- 11: colors.slateDarkA.slateA11,
- 12: colors.slateDarkA.slateA12
- }
- },
- keyframes: {
- dash: {
- '0%': { strokeDashoffset: 1000 },
- '100%': { strokeDashoffset: 0 }
- },
- shine: {
- '0%': { backgroundPosition: '-100%' },
- '100%': { backgroundPosition: '100%' }
- }
- }
- }
- }
-};
diff --git a/packages/jsx-email/src/cli/preview-app/tsconfig.json b/packages/jsx-email/src/cli/preview-app/tsconfig.json
deleted file mode 100644
index b0f89eea..00000000
--- a/packages/jsx-email/src/cli/preview-app/tsconfig.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "compilerOptions": {
- "allowImportingTsExtensions": true,
- "allowSyntheticDefaultImports": true,
- "composite": true,
- "jsx": "react-jsx",
- "module": "ESNext",
- "moduleResolution": "bundler",
- "noEmit": true,
- "skipLibCheck": true,
- "target": "ESNext",
- "types": ["vite/client"]
- },
- "include": ["src"]
-}
diff --git a/packages/jsx-email/src/cli/preview-app/vite-env.d.ts b/packages/jsx-email/src/cli/preview-app/vite-env.d.ts
deleted file mode 100644
index 11f02fe2..00000000
--- a/packages/jsx-email/src/cli/preview-app/vite-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/packages/jsx-email/tsup.config.ts b/packages/jsx-email/tsup.config.ts
index 0ae72359..7b054b87 100644
--- a/packages/jsx-email/tsup.config.ts
+++ b/packages/jsx-email/tsup.config.ts
@@ -7,7 +7,6 @@ const base: Options = {
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
keepNames: true,
- // noExternal: ['vite-plugin-jspm'],
outDir: 'dist',
sourcemap: true,
target: ['es2022', 'node18']
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0a3b5343..c32d2b85 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -200,30 +200,15 @@ importers:
'@dot/log':
specifier: ^0.1.3
version: 0.1.3
- '@jspm/core':
- specifier: ^2.0.1
- version: 2.0.1
+ '@jsx-email/app-preview':
+ specifier: workspace:*
+ version: link:../../apps/preview
'@jsx-email/doiuse-email':
specifier: ^1.0.1
version: 1.0.1
- '@radix-ui/colors':
- specifier: 1.0.1
- version: 1.0.1
- '@radix-ui/react-collapsible':
- specifier: 1.0.3
- version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-popover':
- specifier: 1.0.6
- version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot':
specifier: 1.0.2
version: 1.0.2(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-toggle-group':
- specifier: 1.0.4
- version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-tooltip':
- specifier: 1.0.6
- version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
'@unocss/core':
specifier: ^0.57.7
version: 0.57.7
@@ -260,12 +245,6 @@ importers:
esbuild:
specifier: ^0.19.3
version: 0.19.3
- esbuild-plugin-copy:
- specifier: ^2.1.1
- version: 2.1.1(esbuild@0.19.3)
- framer-motion:
- specifier: 8.5.5
- version: 8.5.5(react-dom@18.2.0)(react@18.2.0)
globby:
specifier: 11.0.4
version: 11.0.4
@@ -308,12 +287,6 @@ importers:
react:
specifier: 18.2.0
version: 18.2.0
- react-dom:
- specifier: 18.2.0
- version: 18.2.0(react@18.2.0)
- react-router-dom:
- specifier: 6.16.0
- version: 6.16.0(react-dom@18.2.0)(react@18.2.0)
rehype:
specifier: ^13.0.1
version: 13.0.1
@@ -327,8 +300,8 @@ importers:
specifier: ^2.1.1
version: 2.1.1
shikiji:
- specifier: ^0.6.8
- version: 0.6.8
+ specifier: ^0.8.0
+ version: 0.8.7
source-map-js:
specifier: ^1.0.2
version: 1.0.2
@@ -341,9 +314,6 @@ importers:
superstruct:
specifier: ^1.0.3
version: 1.0.3
- tailwindcss:
- specifier: 3.3.3
- version: 3.3.3(ts-node@10.9.1)
titleize:
specifier: ^4.0.0
version: 4.0.0
@@ -372,12 +342,6 @@ importers:
'@types/import-local':
specifier: ^3.1.2
version: 3.1.2
- '@types/object-hash':
- specifier: ^3.0.6
- version: 3.0.6
- '@types/postcss-css-variables':
- specifier: ^0.18.3
- version: 0.18.3
'@types/pretty':
specifier: ^2.0.1
version: 2.0.1
@@ -1377,10 +1341,6 @@ packages:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
- /@jspm/core@2.0.1:
- resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==}
- dev: false
-
/@jsx-email/doiuse-email@1.0.1:
resolution: {integrity: sha512-PeiQhXTXSbYpR4uuXsaSDX6KwNUgRu9I7utaMSEYysXjDvKFx19bjwzS/sJttl8dJ4kfzVSWFeyUFwdKcWqhiw==}
engines: {node: '>=18.0.0'}
@@ -1465,53 +1425,6 @@ packages:
dev: true
optional: true
- /@motionone/animation@10.15.1:
- resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==}
- dependencies:
- '@motionone/easing': 10.15.1
- '@motionone/types': 10.15.1
- '@motionone/utils': 10.15.1
- tslib: 2.6.2
- dev: false
-
- /@motionone/dom@10.16.2:
- resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==}
- dependencies:
- '@motionone/animation': 10.15.1
- '@motionone/generators': 10.15.1
- '@motionone/types': 10.15.1
- '@motionone/utils': 10.15.1
- hey-listen: 1.0.8
- tslib: 2.6.2
- dev: false
-
- /@motionone/easing@10.15.1:
- resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==}
- dependencies:
- '@motionone/utils': 10.15.1
- tslib: 2.6.2
- dev: false
-
- /@motionone/generators@10.15.1:
- resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==}
- dependencies:
- '@motionone/types': 10.15.1
- '@motionone/utils': 10.15.1
- tslib: 2.6.2
- dev: false
-
- /@motionone/types@10.15.1:
- resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==}
- dev: false
-
- /@motionone/utils@10.15.1:
- resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==}
- dependencies:
- '@motionone/types': 10.15.1
- hey-listen: 1.0.8
- tslib: 2.6.2
- dev: false
-
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -1534,10 +1447,6 @@ packages:
resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
dev: false
- /@radix-ui/colors@1.0.1:
- resolution: {integrity: sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg==}
- dev: false
-
/@radix-ui/colors@3.0.0:
resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==}
dev: false
@@ -1669,31 +1578,6 @@ packages:
react: 18.2.0
dev: false
- /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==}
- peerDependencies:
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.15
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.22)(react@18.2.0)
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
/@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==}
peerDependencies:
@@ -1733,29 +1617,6 @@ packages:
react: 18.2.0
dev: false
- /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==}
- peerDependencies:
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.15
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
/@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==}
peerDependencies:
@@ -1802,41 +1663,6 @@ packages:
react: 18.2.0
dev: false
- /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==}
- peerDependencies:
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.15
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- aria-hidden: 1.2.3
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-remove-scroll: 2.5.5(@types/react@18.2.22)(react@18.2.0)
- dev: false
-
/@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==}
peerDependencies:
@@ -1872,36 +1698,6 @@ packages:
react-remove-scroll: 2.5.5(@types/react@18.2.22)(react@18.2.0)
dev: false
- /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==}
- peerDependencies:
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.15
- '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/rect': 1.0.1
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
/@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==}
peerDependencies:
@@ -1932,27 +1728,6 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==}
- peerDependencies:
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.15
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
/@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==}
peerDependencies:
@@ -2152,38 +1927,6 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==}
- peerDependencies:
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
- dependencies:
- '@babel/runtime': 7.22.15
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0)
- '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.22
- '@types/react-dom': 18.2.7
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
-
/@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.22)(react@18.2.0):
resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
peerDependencies:
@@ -2619,16 +2362,6 @@ packages:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true
- /@types/object-hash@3.0.6:
- resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==}
- dev: true
-
- /@types/postcss-css-variables@0.18.3:
- resolution: {integrity: sha512-E7puBJg4Pxo39BgIRklr1ycHgjiyZ3PrYNKq3cguhPBltASIHMiB4+rTiTGOepBhoIIDTX4g4Y41PRr6cHFx5A==}
- dependencies:
- postcss: 8.4.32
- dev: true
-
/@types/pretty@2.0.1:
resolution: {integrity: sha512-l18spTC0Q2OEUIHGPyw37XBOacFI4Kng1fgfFjgDTg2FR9wqJ/NY9zWyXv87NRUlFDU6JA+E/GVnNJiWgyon6A==}
dev: true
@@ -4180,18 +3913,6 @@ packages:
is-symbol: 1.0.4
dev: true
- /esbuild-plugin-copy@2.1.1(esbuild@0.19.3):
- resolution: {integrity: sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==}
- peerDependencies:
- esbuild: '>= 0.14.0'
- dependencies:
- chalk: 4.1.2
- chokidar: 3.5.3
- esbuild: 0.19.3
- fs-extra: 10.1.0
- globby: 11.0.4
- dev: false
-
/esbuild@0.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
@@ -4746,30 +4467,6 @@ packages:
'@emotion/is-prop-valid': 0.8.8
dev: false
- /framer-motion@8.5.5(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-5IDx5bxkjWHWUF3CVJoSyUVOtrbAxtzYBBowRE2uYI/6VYhkEBD+rbTHEGuUmbGHRj6YqqSfoG7Aa1cLyWCrBA==}
- peerDependencies:
- react: 18.2.0
- react-dom: 18.2.0
- dependencies:
- '@motionone/dom': 10.16.2
- hey-listen: 1.0.8
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- tslib: 2.6.2
- optionalDependencies:
- '@emotion/is-prop-valid': 0.8.8
- dev: false
-
- /fs-extra@10.1.0:
- resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
- engines: {node: '>=12'}
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.0
- dev: false
-
/fs-extra@11.1.1:
resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
engines: {node: '>=14.14'}
@@ -4963,6 +4660,7 @@ packages:
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: true
/grapheme-splitter@1.0.4:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
@@ -5226,10 +4924,6 @@ packages:
space-separated-tokens: 2.0.2
dev: false
- /hey-listen@1.0.8:
- resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
- dev: false
-
/hmac-drbg@1.0.1:
resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
dependencies:
@@ -5686,6 +5380,7 @@ packages:
universalify: 2.0.0
optionalDependencies:
graceful-fs: 4.2.11
+ dev: true
/jsonparse@1.3.1:
resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
@@ -7318,12 +7013,6 @@ packages:
vscode-textmate: 8.0.0
dev: true
- /shikiji@0.6.8:
- resolution: {integrity: sha512-K0axxNAdB9KvLUflU7QoLC7p6i2p1R2MFG0eP+iclbjtuEZqng99jHcg3VJL0GWRO67yozTICnykjo1HjOzdkg==}
- dependencies:
- hast-util-to-html: 9.0.0
- dev: false
-
/shikiji@0.8.7:
resolution: {integrity: sha512-j5usxwI0yHkDTHOuhuSJl9+wT5CNYeYO82dJMSJBlJ/NYT5SIebGcPoL6y9QOyH15wGrJC4LOP2nz5k8mUDGRQ==}
dependencies:
@@ -7612,37 +7301,6 @@ packages:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
dev: true
- /tailwindcss@3.3.3(ts-node@10.9.1):
- resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==}
- engines: {node: '>=14.0.0'}
- hasBin: true
- dependencies:
- '@alloc/quick-lru': 5.2.0
- arg: 5.0.2
- chokidar: 3.5.3
- didyoumean: 1.2.2
- dlv: 1.1.3
- fast-glob: 3.3.1
- glob-parent: 6.0.2
- is-glob: 4.0.3
- jiti: 1.20.0
- lilconfig: 2.1.0
- micromatch: 4.0.5
- normalize-path: 3.0.0
- object-hash: 3.0.0
- picocolors: 1.0.0
- postcss: 8.4.32
- postcss-import: 15.1.0(postcss@8.4.32)
- postcss-js: 4.0.1(postcss@8.4.32)
- postcss-load-config: 4.0.1(postcss@8.4.32)(ts-node@10.9.1)
- postcss-nested: 6.0.1(postcss@8.4.32)
- postcss-selector-parser: 6.0.13
- resolve: 1.22.4
- sucrase: 3.34.0
- transitivePeerDependencies:
- - ts-node
- dev: false
-
/tailwindcss@3.4.0(ts-node@10.9.1):
resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==}
engines: {node: '>=14.0.0'}
@@ -8027,6 +7685,7 @@ packages:
/universalify@2.0.0:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
engines: {node: '>= 10.0.0'}
+ dev: true
/update-browserslist-db@1.0.11(browserslist@4.21.10):
resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}