From 2bf348c39c9b4c786c962e7b275d09e3b5b58bbb Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 23 Nov 2024 16:41:43 +0600 Subject: [PATCH 01/24] feat: refactor variables --- packages/render/src/maily.tsx | 73 +++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/packages/render/src/maily.tsx b/packages/render/src/maily.tsx index 492ac256..3dc6ce9e 100644 --- a/packages/render/src/maily.tsx +++ b/packages/render/src/maily.tsx @@ -762,22 +762,11 @@ export class Maily { return <>; } - let formattedVariable = this.variableFormatter({ + const formattedVariable = this.getVariableValue( variable, fallback, - }); - - // If `shouldReplaceVariableValues` is true, replace the variable values - // Otherwise, just return the formatted variable - if (this.shouldReplaceVariableValues) { - formattedVariable = - (typeof payloadValue === 'object' - ? payloadValue[variable] - : payloadValue) ?? - this.variableValues.get(variable) ?? - fallback ?? - formattedVariable; - } + payloadValue + ); if (node?.marks) { return this.renderMark({ @@ -789,6 +778,30 @@ export class Maily { return <>{formattedVariable}; } + private getVariableValue( + variable: string, + fallback: string | undefined = undefined, + payloadValue: PayloadValue | undefined = undefined + ): string { + let formattedVariable = this.variableFormatter({ + variable, + fallback, + }); + + // If `shouldReplaceVariableValues` is true, replace the variable values + // Otherwise, just return the formatted variable + if (this.shouldReplaceVariableValues) { + if (typeof payloadValue === 'object' && variable in payloadValue) { + formattedVariable = payloadValue[variable]; + } else { + formattedVariable = + this.variableValues.get(variable) ?? fallback ?? formattedVariable; + } + } + + return formattedVariable; + } + private horizontalRule(_: JSONContent, __?: NodeOptions): JSX.Element { return (
; } - let { payloadValue } = options || {}; - payloadValue = typeof payloadValue === 'object' ? payloadValue : {}; - - const values = this.payloadValues.get(each) ?? payloadValue[each] ?? []; + const values = this.getPayloadValue(each, options) || []; if (!Array.isArray(values)) { throw new Error(`Payload value for each "${each}" is not an array`); } + // if(this.isForList(node)) { + + // } + return ( <> {values.map((value) => { @@ -1505,14 +1519,31 @@ export class Maily { ); } + private isForList(node: JSONContent): JSONContent | null { + const content = node?.content || []; + if (content.length !== 1) { + return null; + } + + const firstNode = content[0]; + return firstNode?.type === 'bulletList' || firstNode?.type === 'orderedList' + ? firstNode + : null; + } + + private getPayloadValue(key: string, options?: NodeOptions): any { + let { payloadValue } = options || {}; + payloadValue = typeof payloadValue === 'object' ? payloadValue : {}; + + return this.payloadValues.get(key) ?? payloadValue?.[key]; + } + private shouldShow(node: JSONContent, options?: NodeOptions): boolean { const showIfKey = node?.attrs?.showIfKey ?? ''; if (!showIfKey) { return true; } - let { payloadValue } = options || {}; - payloadValue = typeof payloadValue === 'object' ? payloadValue : {}; - return !!(this.payloadValues.get(showIfKey) ?? payloadValue[showIfKey]); + return !!this.getPayloadValue(showIfKey, options); } } From d4d8862a965e6b2b03f7f3828e590ee5e2e893c8 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 23 Nov 2024 17:03:51 +0600 Subject: [PATCH 02/24] feat: maily transformer --- packages/render/readme.md | 2 - packages/render/src/maily.tsx | 4 +- packages/render/tsup.config.ts | 3 - packages/transformer/license | 21 +++ packages/transformer/package.json | 60 ++++++++ packages/transformer/readme.md | 52 +++++++ packages/transformer/src/index.ts | 2 + packages/transformer/src/transformer.ts | 194 ++++++++++++++++++++++++ packages/transformer/src/types.ts | 84 ++++++++++ packages/transformer/tsconfig.json | 5 + packages/transformer/tsup.config.ts | 11 ++ pnpm-lock.yaml | 27 ++++ 12 files changed, 458 insertions(+), 7 deletions(-) create mode 100644 packages/transformer/license create mode 100644 packages/transformer/package.json create mode 100644 packages/transformer/readme.md create mode 100644 packages/transformer/src/index.ts create mode 100644 packages/transformer/src/transformer.ts create mode 100644 packages/transformer/src/types.ts create mode 100644 packages/transformer/tsconfig.json create mode 100644 packages/transformer/tsup.config.ts diff --git a/packages/render/readme.md b/packages/render/readme.md index a62a1710..ad5689c5 100644 --- a/packages/render/readme.md +++ b/packages/render/readme.md @@ -24,8 +24,6 @@ Install `@maily-to/render` from your command line. pnpm add @maily-to/render ``` -
- ## Getting started Convert React components into a HTML string. diff --git a/packages/render/src/maily.tsx b/packages/render/src/maily.tsx index 3dc6ce9e..8647344a 100644 --- a/packages/render/src/maily.tsx +++ b/packages/render/src/maily.tsx @@ -1499,9 +1499,9 @@ export class Maily { } // if(this.isForList(node)) { - + // } - + return ( <> {values.map((value) => { diff --git a/packages/render/tsup.config.ts b/packages/render/tsup.config.ts index 6c69f896..24605a03 100644 --- a/packages/render/tsup.config.ts +++ b/packages/render/tsup.config.ts @@ -4,9 +4,6 @@ import { defineConfig } from 'tsup'; export default defineConfig({ entry: ['src/index.ts'], format: ['cjs', 'esm'], - banner: { - js: '// @ts-nocheck\n', - }, dts: true, clean: true, minify: true, diff --git a/packages/transformer/license b/packages/transformer/license new file mode 100644 index 00000000..40f08fe4 --- /dev/null +++ b/packages/transformer/license @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) Arik Chakma + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/transformer/package.json b/packages/transformer/package.json new file mode 100644 index 00000000..61a5d870 --- /dev/null +++ b/packages/transformer/package.json @@ -0,0 +1,60 @@ +{ + "name": "@maily-to/transformer", + "version": "0.0.1", + "private": false, + "description": "A transformer that converts a React component to a Maily JSON object.", + "sideEffects": false, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**" + ], + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "license": "MIT", + "scripts": { + "dev": "tsup --watch", + "clean": "rm -rf dist", + "build": "tsup", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "test:watch": "vitest", + "test": "vitest run" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/arikchakma/maily.to.git", + "directory": "packages/transformer" + }, + "author": "Arik Chakma ", + "keywords": [ + "maily.to", + "react", + "email" + ], + "engines": { + "node": ">=18.0.0" + }, + "devDependencies": { + "tsconfig": "workspace:*", + "typescript": "^5.6.3" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2" + } +} diff --git a/packages/transformer/readme.md b/packages/transformer/readme.md new file mode 100644 index 00000000..a49f315a --- /dev/null +++ b/packages/transformer/readme.md @@ -0,0 +1,52 @@ +
+
+ +
@maily-to/transformer
+
Transform React Email markup to Maily content.
+
+ +

+ + + + + Get Maily Editor + +

+ +
+ +## Install + +Install `@maily-to/transformer` from your command line. + +```sh +pnpm add @maily-to/transformer +``` + +## Getting started + +Transform JSX content into structured `ParsedNode` JSON. + +```ts +import { Transformer } from '@maily-to/transformer'; + +const transformer = new Transformer(); +const parsed = await transformer.transform( + ` Hello World Maily This is just a simple paragraph text ` +); + +console.log(JSON.stringify(parsed, null, 2)); +``` + +### Output + +> In Progress + +## Contributions + +We welcome contributions of any kind! Feel free to submit pull requests, create issues, or share your ideas. + +## License + +MIT © [Arik Chakma](https://twitter.com/imarikchakma) diff --git a/packages/transformer/src/index.ts b/packages/transformer/src/index.ts new file mode 100644 index 00000000..2b6d74c1 --- /dev/null +++ b/packages/transformer/src/index.ts @@ -0,0 +1,2 @@ +export * from './transformer'; +export * from './types'; diff --git a/packages/transformer/src/transformer.ts b/packages/transformer/src/transformer.ts new file mode 100644 index 00000000..147e10f4 --- /dev/null +++ b/packages/transformer/src/transformer.ts @@ -0,0 +1,194 @@ +import { + Parser as AcornParser, + ExpressionStatement, + ObjectExpression, + Property, + Identifier, + Literal, +} from 'acorn'; +import jsx from 'acorn-jsx'; +import type { + JSXAttribute, + JSXElement, + JSXExpressionContainer, + JSXIdentifier, + JSXText, + ParsedNode, + Options, +} from './types'; + +export class Transformer { + protected jsx: typeof AcornParser; + + constructor() { + this.jsx = AcornParser.extend(jsx()); + } + + /** + * Parses JSX content into an AST. + * @param content - The JSX content to parse + * @returns The AST of the parsed content + */ + public ast(content: string) { + return this.jsx.parse(content, { + sourceType: 'module', + ecmaVersion: 'latest', + }); + } + + /** + * Cleans the content by removing newlines and tabs. + * @param content - The content to clean + * @returns The cleaned content + */ + private clean(content: string) { + return ( + content + .trim() + // remove all newlines and tabs + .replace(/(\r\n\t|\n|\r\t)/gm, '') + // remove all spaces between tags + .replace(/\>\s+\<') + ); + } + + /** + * Transforms JSX content into a simplified structured tree. + * + * - Cleans and parses the input JSX content. + * - Iterates over the AST nodes to convert them into a ParsedNode tree. + * + * @param content - The JSX content to transform. + * @returns The root ParsedNode object containing the transformed JSX tree. + */ + public async transform(content: string): Promise { + content = this.clean(content); + const ast = this.ast(content); + + const children: ParsedNode[] = []; + for (const node of ast.body) { + children.push(this.transformNode(node)); + } + + return { + type: 'root', + children, + }; + } + + private transformNode(node: unknown, options?: Options) { + // @ts-ignore + if (node?.type in this) { + // @ts-ignore + return this[node.type](node, options); + } else { + console.log('Unknown node type:', node); + } + } + + private ExpressionStatement(node: ExpressionStatement) { + return this.transformNode(node.expression); + } + + private JSXElement(node: JSXElement) { + const element = node; + const attributes: Record = {}; + for (const attr of element?.openingElement?.attributes) { + attributes[this.transformNode(attr.name)] = this.transformNode( + attr.value + ); + } + + const children: ParsedNode[] = []; + const isSingleChildElement = element.children.length === 1; + element.children.forEach((child, index) => { + children.push( + this.transformNode( + child, + child.type === 'JSXText' + ? { + trimStart: index === 0, + trimEnd: index === element.children.length - 1, + trim: isSingleChildElement, + } + : undefined + ) + ); + }); + + let type = element.openingElement.name.name.toLowerCase(); + // Convert text to paragraph to avoid conflicts with the text node + if (type === 'text') { + type = 'paragraph'; + } + + const parsedNode: ParsedNode = { + type, + attributes, + children, + }; + + return parsedNode; + } + + private JSXExpressionContainer(node: JSXExpressionContainer) { + return this.transformNode(node.expression); + } + + private JSXAttribute(node: JSXAttribute) { + return { + name: node.name.name, + value: this.transformNode(node.value), + }; + } + + private JSXIdentifier(node: JSXIdentifier) { + return node.name; + } + + private ObjectExpression(node: ObjectExpression) { + const object: Record = {}; + for (const prop of node.properties as Property[]) { + object[this.transformNode(prop.key)] = this.transformNode(prop.value); + } + + return object; + } + + private Property(node: Property) { + return { + name: this.transformNode(node.key), + value: this.transformNode(node.value), + }; + } + + private Identifier(node: Identifier) { + return node.name; + } + + private Literal(node: Literal) { + return node.value; + } + + private JSXText(node: JSXText, options?: Options) { + const { trimStart, trimEnd, trim } = options ?? {}; + let text = node.value; + + if (trimStart) { + text = text.trimStart(); + } + + if (trimEnd) { + text = text.trimEnd(); + } + + if (trim) { + text = text.trim(); + } + + return { + type: 'text', + text, + }; + } +} diff --git a/packages/transformer/src/types.ts b/packages/transformer/src/types.ts new file mode 100644 index 00000000..146afe8a --- /dev/null +++ b/packages/transformer/src/types.ts @@ -0,0 +1,84 @@ +import type { Node as AcornNode, Expression } from 'acorn'; + +export interface JSXIdentifier extends AcornNode { + type: 'JSXIdentifier'; + name: string; +} + +export interface JSXAttribute extends AcornNode { + type: 'JSXAttribute'; + name: JSXIdentifier; + value: AcornNode | null; +} + +export interface JSXOpeningElement extends AcornNode { + type: 'JSXOpeningElement'; + name: JSXIdentifier; + attributes: JSXAttribute[]; + selfClosing: boolean; +} + +export interface JSXClosingElement extends AcornNode { + type: 'JSXClosingElement'; + name: JSXIdentifier; +} + +export interface JSXText extends AcornNode { + type: 'JSXText'; + value: string; + raw: string; +} + +export interface JSXExpressionContainer extends AcornNode { + type: 'JSXExpressionContainer'; + expression: Expression; +} + +export type JSXChild = JSXElement | JSXText | JSXExpressionContainer; + +export interface JSXElement extends AcornNode { + type: 'JSXElement'; + openingElement: JSXOpeningElement; + closingElement: JSXClosingElement | null; + children: JSXChild[]; +} + +export interface JSXFragment extends AcornNode { + type: 'JSXFragment'; + openingFragment: JSXOpeningFragment; + closingFragment: JSXClosingFragment; + children: JSXChild[]; +} + +export interface JSXOpeningFragment extends AcornNode { + type: 'JSXOpeningFragment'; +} + +export interface JSXClosingFragment extends AcornNode { + type: 'JSXClosingFragment'; +} + +export type JSXNode = + | JSXElement + | JSXFragment + | JSXIdentifier + | JSXAttribute + | JSXOpeningElement + | JSXClosingElement + | JSXText + | JSXExpressionContainer; + +export interface ParsedNode { + type: string; + attributes?: Record; + children?: ParsedNode[]; + text?: string; + [key: string]: any; +} + +export interface Options { + trimStart?: boolean; + trimEnd?: boolean; + trim?: boolean; + [key: string]: any; +} diff --git a/packages/transformer/tsconfig.json b/packages/transformer/tsconfig.json new file mode 100644 index 00000000..cd6c94d6 --- /dev/null +++ b/packages/transformer/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "tsconfig/react-library.json", + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} diff --git a/packages/transformer/tsup.config.ts b/packages/transformer/tsup.config.ts new file mode 100644 index 00000000..24605a03 --- /dev/null +++ b/packages/transformer/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsup'; + +// eslint-disable-next-line import/no-default-export +export default defineConfig({ + entry: ['src/index.ts'], + format: ['cjs', 'esm'], + dts: true, + clean: true, + minify: true, + external: ['react'], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21070eb5..e2a91235 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -351,6 +351,22 @@ importers: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.14) + packages/transformer: + dependencies: + acorn: + specifier: ^8.14.0 + version: 8.14.0 + acorn-jsx: + specifier: ^5.3.2 + version: 5.3.2(acorn@8.14.0) + devDependencies: + tsconfig: + specifier: workspace:* + version: link:../tsconfig + typescript: + specifier: ^5.6.3 + version: 5.6.3 + packages/tsconfig: {} packages: @@ -1840,6 +1856,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} @@ -5113,8 +5134,14 @@ snapshots: dependencies: acorn: 8.13.0 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn@8.13.0: {} + acorn@8.14.0: {} + agent-base@7.1.1: dependencies: debug: 4.3.7 From 9b3ed1d6a418fcd4d9efa11b76a2810b351b08df Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 23 Nov 2024 17:28:21 +0600 Subject: [PATCH 03/24] feat: transformer playground --- apps/transformer/.gitignore | 24 + apps/transformer/README.md | 0 apps/transformer/index.html | 13 + apps/transformer/package.json | 31 + apps/transformer/public/brand/icon.svg | 3 + apps/transformer/public/brand/logo.png | Bin 0 -> 19934 bytes apps/transformer/public/brand/logo.svg | 15 + apps/transformer/src/app.tsx | 103 +++ apps/transformer/src/index.css | 1 + apps/transformer/src/main.tsx | 10 + apps/transformer/src/vite-env.d.ts | 1 + apps/transformer/tsconfig.app.json | 21 + apps/transformer/tsconfig.json | 7 + apps/transformer/tsconfig.node.json | 21 + apps/transformer/vite.config.ts | 8 + pnpm-lock.yaml | 890 ++++++++++++++++++++++++- 16 files changed, 1126 insertions(+), 22 deletions(-) create mode 100644 apps/transformer/.gitignore create mode 100644 apps/transformer/README.md create mode 100644 apps/transformer/index.html create mode 100644 apps/transformer/package.json create mode 100644 apps/transformer/public/brand/icon.svg create mode 100644 apps/transformer/public/brand/logo.png create mode 100644 apps/transformer/public/brand/logo.svg create mode 100644 apps/transformer/src/app.tsx create mode 100644 apps/transformer/src/index.css create mode 100644 apps/transformer/src/main.tsx create mode 100644 apps/transformer/src/vite-env.d.ts create mode 100644 apps/transformer/tsconfig.app.json create mode 100644 apps/transformer/tsconfig.json create mode 100644 apps/transformer/tsconfig.node.json create mode 100644 apps/transformer/vite.config.ts diff --git a/apps/transformer/.gitignore b/apps/transformer/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/apps/transformer/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/transformer/README.md b/apps/transformer/README.md new file mode 100644 index 00000000..e69de29b diff --git a/apps/transformer/index.html b/apps/transformer/index.html new file mode 100644 index 00000000..40929a5e --- /dev/null +++ b/apps/transformer/index.html @@ -0,0 +1,13 @@ + + + + + + + Maily Transformer + + +
+ + + diff --git a/apps/transformer/package.json b/apps/transformer/package.json new file mode 100644 index 00000000..7db96588 --- /dev/null +++ b/apps/transformer/package.json @@ -0,0 +1,31 @@ +{ + "name": "transformer", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@maily-to/transformer": "workspace:*", + "@tailwindcss/vite": "4.0.0-beta.2", + "prismjs": "^1.29.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-simple-code-editor": "^0.14.1", + "tailwindcss": "4.0.0-beta.2" + }, + "devDependencies": { + "@types/prismjs": "^1.26.5", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react-swc": "^3.5.0", + "globals": "^15.11.0", + "typescript": "~5.6.2", + "typescript-eslint": "^8.11.0", + "vite": "^5.4.10" + } +} diff --git a/apps/transformer/public/brand/icon.svg b/apps/transformer/public/brand/icon.svg new file mode 100644 index 00000000..0bf3a021 --- /dev/null +++ b/apps/transformer/public/brand/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/transformer/public/brand/logo.png b/apps/transformer/public/brand/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2af96776cbbe09adb944881dd7dce9f592afba18 GIT binary patch literal 19934 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 literal 0 HcmV?d00001 diff --git a/apps/transformer/public/brand/logo.svg b/apps/transformer/public/brand/logo.svg new file mode 100644 index 00000000..4d477cf8 --- /dev/null +++ b/apps/transformer/public/brand/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/apps/transformer/src/app.tsx b/apps/transformer/src/app.tsx new file mode 100644 index 00000000..bdb4829c --- /dev/null +++ b/apps/transformer/src/app.tsx @@ -0,0 +1,103 @@ +import { useEffect, useState } from 'react'; + +import Editor from 'react-simple-code-editor'; +import { highlight, languages } from 'prismjs'; +import 'prismjs/components/prism-jsx'; +import 'prismjs/themes/prism.css'; + +import { Transformer } from '@maily-to/transformer'; + +const defaultCode = ` + + Hello World + + Example +
+ + This is just a simple paragraph text + +
`; + +export function App() { + const [code, setCode] = useState(''); + const [output, setOutput] = useState(''); + + const [transformer] = useState(() => new Transformer()); + + const handleCodeChange = (newCode: string) => { + setCode(newCode); + setOutput(JSON.stringify(transformer.transform(newCode), null, 2)); + }; + + useEffect(() => { + handleCodeChange(defaultCode); + }, []); + + return ( +
+
+

Maily Transformer

+
+ +
+
+

Input JSX

+
+ highlight(code, languages.jsx, 'jsx')} + padding={16} + style={{ + fontFamily: '"Fira code", "Fira Mono", monospace', + fontSize: 14, + minHeight: '500px', + backgroundColor: '#f8f9fa', + }} + /> +
+
+ +
+

AST Output

+
{output}
+
+
+
+ ); +} diff --git a/apps/transformer/src/index.css b/apps/transformer/src/index.css new file mode 100644 index 00000000..d4b50785 --- /dev/null +++ b/apps/transformer/src/index.css @@ -0,0 +1 @@ +@import 'tailwindcss'; diff --git a/apps/transformer/src/main.tsx b/apps/transformer/src/main.tsx new file mode 100644 index 00000000..a80caff3 --- /dev/null +++ b/apps/transformer/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import './index.css'; +import { App } from './app'; + +createRoot(document.getElementById('root')!).render( + + + +); diff --git a/apps/transformer/src/vite-env.d.ts b/apps/transformer/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/apps/transformer/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/transformer/tsconfig.app.json b/apps/transformer/tsconfig.app.json new file mode 100644 index 00000000..2a04dc8b --- /dev/null +++ b/apps/transformer/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + "strict": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/apps/transformer/tsconfig.json b/apps/transformer/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/apps/transformer/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/apps/transformer/tsconfig.node.json b/apps/transformer/tsconfig.node.json new file mode 100644 index 00000000..d4676932 --- /dev/null +++ b/apps/transformer/tsconfig.node.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/apps/transformer/vite.config.ts b/apps/transformer/vite.config.ts new file mode 100644 index 00000000..1c3091bf --- /dev/null +++ b/apps/transformer/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import tailwindcss from '@tailwindcss/vite'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2a91235..496fb5bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 18.3.1 eslint: specifier: ^9.13.0 - version: 9.13.0(jiti@1.21.0) + version: 9.13.0(jiti@2.4.0) happy-dom: specifier: ^15.7.4 version: 15.7.4 @@ -34,16 +34,65 @@ importers: version: link:packages/tsconfig tsup: specifier: ^8.3.0 - version: 8.3.0(jiti@1.21.0)(postcss@8.4.47)(typescript@5.6.3)(yaml@2.4.2) + version: 8.3.0(@swc/core@1.9.3)(jiti@2.4.0)(postcss@8.4.47)(typescript@5.6.3)(yaml@2.4.2) turbo: specifier: latest version: 1.13.3 vite: specifier: ^5.4.9 - version: 5.4.9(@types/node@22.7.7) + version: 5.4.9(@types/node@22.7.7)(lightningcss@1.28.1) vitest: specifier: ^2.1.3 - version: 2.1.3(@types/node@22.7.7)(happy-dom@15.7.4) + version: 2.1.3(@types/node@22.7.7)(happy-dom@15.7.4)(lightningcss@1.28.1) + + apps/transformer: + dependencies: + '@maily-to/transformer': + specifier: workspace:* + version: link:../../packages/transformer + '@tailwindcss/vite': + specifier: 4.0.0-beta.2 + version: 4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) + prismjs: + specifier: ^1.29.0 + version: 1.29.0 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-simple-code-editor: + specifier: ^0.14.1 + version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwindcss: + specifier: 4.0.0-beta.2 + version: 4.0.0-beta.2 + devDependencies: + '@types/prismjs': + specifier: ^1.26.5 + version: 1.26.5 + '@types/react': + specifier: ^18.3.12 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.3.1 + version: 18.3.1 + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.7.1(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) + globals: + specifier: ^15.11.0 + version: 15.12.0 + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.11.0 + version: 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + vite: + specifier: ^5.4.10 + version: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) apps/web: dependencies: @@ -1568,17 +1617,167 @@ packages: '@supabase/supabase-js@2.45.6': resolution: {integrity: sha512-qVXSSUhhIqdFnF2VUGgeecPvw1cDW6+avcTbRgur4LaGnzrJCbM3Rx7g81/SSZjjeqYOtmHuKWhiHzV/EN8Ktw==} + '@swc/core-darwin-arm64@1.9.3': + resolution: {integrity: sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.9.3': + resolution: {integrity: sha512-IaRq05ZLdtgF5h9CzlcgaNHyg4VXuiStnOFpfNEMuI5fm5afP2S0FHq8WdakUz5WppsbddTdplL+vpeApt/WCQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.9.3': + resolution: {integrity: sha512-Pbwe7xYprj/nEnZrNBvZfjnTxlBIcfApAGdz2EROhjpPj+FBqBa3wOogqbsuGGBdCphf8S+KPprL1z+oDWkmSQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.9.3': + resolution: {integrity: sha512-AQ5JZiwNGVV/2K2TVulg0mw/3LYfqpjZO6jDPtR2evNbk9Yt57YsVzS+3vHSlUBQDRV9/jqMuZYVU3P13xrk+g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.9.3': + resolution: {integrity: sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.9.3': + resolution: {integrity: sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.9.3': + resolution: {integrity: sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.9.3': + resolution: {integrity: sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.9.3': + resolution: {integrity: sha512-rqpzNfpAooSL4UfQnHhkW8aL+oyjqJniDP0qwZfGnjDoJSbtPysHg2LpcOBEdSnEH+uIZq6J96qf0ZFD8AGfXA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.9.3': + resolution: {integrity: sha512-3YJJLQ5suIEHEKc1GHtqVq475guiyqisKSoUnoaRtxkDaW5g1yvPt9IoSLOe2mRs7+FFhGGU693RsBUSwOXSdQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.9.3': + resolution: {integrity: sha512-oRj0AFePUhtatX+BscVhnzaAmWjpfAeySpM1TCbxA1rtBDeH/JDhi5yYzAKneDYtVtBvA7ApfeuzhMC9ye4xSg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + + '@tailwindcss/node@4.0.0-beta.2': + resolution: {integrity: sha512-rcWgGqmvm+YfRhRUyYZZfbtGtP940r9oBigPOzdZGr6r8WoAfOPGhPBN0lTW94NzJWT34hKIsVz6+7jHQcwt+A==} + + '@tailwindcss/oxide-android-arm64@4.0.0-beta.2': + resolution: {integrity: sha512-Vk7IBMA/gVGupl3+j++oeKxN2xmif1ET3LF+tuE3TzEE31P28+tS1tLuqfpA5NZLDGfHhuomhukS8PPa7CFGZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.0.0-beta.2': + resolution: {integrity: sha512-qihv6iGezmM4M5GW+y45InlXC4FB6DVdxq2kk8tihPocTCHThO4+kDifIEh4KuqD8viuWAkTZQ9T1LXbo+9buQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.0.0-beta.2': + resolution: {integrity: sha512-P/cRt2cs09QqwBMQMYB2LeB5fpllNdIH5fSqjA2iMzT1IPsIeWETAn9sAuVZb140p55sD1PUfvl5Cjap5MNRUw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.0.0-beta.2': + resolution: {integrity: sha512-UMfZx0K6PoMcH/zMlrPG5O68nGtxeYUn7Sg2LXDNfvE5YtX5JuJqLxdoMxdER4thE34Ni/KViK0njQBUtTNOsw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0-beta.2': + resolution: {integrity: sha512-MXzGuHdBcyhBlmRuKBYqfUcck2xLKT6MZsyjIev1WSUNATLY88jXODI0+jizMb30RgfcbirKHecDkP1fBcT5MQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.0.0-beta.2': + resolution: {integrity: sha512-UajegPqU7In0+FAHDBJ/yYgeTM+OydJPqidw1zFhtJCJeT2niAKqtExksbwgP8t6AX/1TcucNKQHE+AXIQWnWQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.0.0-beta.2': + resolution: {integrity: sha512-82qo9PEr7CgSywYNUQrMLN6olt2KYn/zH2Wz5oCMbtmK8jp9IFanosbRjHwLwTqBlKX4NCGIJOqm6LkqPyDOSg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.0.0-beta.2': + resolution: {integrity: sha512-+ZoVg6iQ8ApPdNX5u2a7Y0w2utPmmR0WWc3tJIvm7iyCC5+BdPp2MYw6HAmlfMOYwI781+77u98u5tU+VS1rHg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.0.0-beta.2': + resolution: {integrity: sha512-vfsFHh2PIAcCGOVrfwIHWFidIpcoqeKmyaz0ZsS2ZOO64aXCAAe9VZwLUJtzA+L7BTkJd0PnhCDJL1dcTTCCGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.0-beta.2': + resolution: {integrity: sha512-fCvsXiFKHg304wHprQhpX0O3QT8McC7pyXnc9x2MDs0l0/mG+8ibMzguAbObnRP5GZ5JbbVJ2sQe6JnMyxWWQw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.0.0-beta.2': + resolution: {integrity: sha512-wFSERR9EpTu8OYqPb36Js1DeuC+8LuQxywnyEOnhzOKQZ4FQm+dfGBzHpQ/7MogBdS31Zahe42UteqCwujbzVQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.0.0-beta.2': + resolution: {integrity: sha512-Ety2iN7vYZs2kyx02fMgmaxpvKoGtlfqsJRAjtalD+EZzT4r2GksNu7Bb/KAVQCGPLBDCWjQ89qBseBHJfxKbg==} + engines: {node: '>= 10'} + '@tailwindcss/typography@0.5.15': resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + '@tailwindcss/vite@4.0.0-beta.2': + resolution: {integrity: sha512-9RJwoCRjjS0ltmGiWtZGPyVg967SSwbI/+DXovU1iCWwiWJJhDJTaZ5GO1Cd6FMj4wFEjna3RkI7CG44I+FprA==} + peerDependencies: + vite: ^5.2.0 + '@tanstack/query-core@5.59.13': resolution: {integrity: sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==} @@ -1791,6 +1990,9 @@ packages: '@types/phoenix@1.6.4': resolution: {integrity: sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==} + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -1812,6 +2014,73 @@ packages: '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@typescript-eslint/eslint-plugin@8.15.0': + resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.15.0': + resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.15.0': + resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.15.0': + resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.15.0': + resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.15.0': + resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.15.0': + resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@8.15.0': + resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react-swc@3.7.1': + resolution: {integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==} + peerDependencies: + vite: ^4 || ^5 + '@vitest/expect@2.1.3': resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==} @@ -1851,6 +2120,11 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + acorn@8.13.0: resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} engines: {node: '>=0.4.0'} @@ -1905,6 +2179,10 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1916,6 +2194,10 @@ packages: peerDependencies: postcss: ^8.1.0 + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2095,6 +2377,11 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -2141,6 +2428,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2179,6 +2470,10 @@ packages: resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@9.13.0: resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2189,6 +2484,9 @@ packages: jiti: optional: true + esm-env@1.1.4: + resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} + espree@10.2.0: resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2197,6 +2495,9 @@ packages: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} + esrap@1.2.2: + resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -2318,9 +2619,16 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + engines: {node: '>=18'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + happy-dom@15.7.4: resolution: {integrity: sha512-r1vadDYGMtsHAAsqhDuk4IpPvr6N8MGKy5ntBo7tSdim+pWDxus2PNqOcOt8LuDZ4t3KJHE+gCuzupcx/GKnyQ==} engines: {node: '>=18.0.0'} @@ -2393,6 +2701,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -2411,6 +2722,10 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + jiti@2.4.0: + resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==} + hasBin: true + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -2465,6 +2780,70 @@ packages: engines: {node: '>=16'} hasBin: true + lightningcss-darwin-arm64@1.28.1: + resolution: {integrity: sha512-VG3vvzM0m/rguCdm76DdobNeNJnHK+jWcdkNLFWHLh9YCotRvbRIt45JxwcHlIF8TDqWStVLTdghq5NaigVCBQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.28.1: + resolution: {integrity: sha512-O7ORdislvKfMohFl4Iq7fxKqdJOuuxArcglVI3amuFO5DJ0wfV3Gxgi1JRo49slfr7OVzJQEHLG4muTWYM5cTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.28.1: + resolution: {integrity: sha512-b7sF89B31kYYijxVcFO7l5u6UNA862YstNu+3YbLl/IQKzveL4a5cwR5cdpG+OOhErg/c2u9WCmzZoX2I5GBvw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.28.1: + resolution: {integrity: sha512-p61kXwvhUDLLzkWHjzSFfUBW/F0iy3jr3CWi3k8SKULtJEsJXTI9DqRm9EixxMSe2AMBQBt4auTYiQL4B1N51A==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.28.1: + resolution: {integrity: sha512-iO+fN9hOMmzfwqcG2/BgUtMKD48H2JO/SXU44fyIwpY2veb65QF5xiRrQ9l1FwIxbGK3231KBYCtAqv+xf+NsQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.28.1: + resolution: {integrity: sha512-dnMHeXEmCUzHHZjaDpQBYuBKcN9nPC3nPFKl70bcj5Bkn5EmkcgEqm5p035LKOgvAwk1XwLpQCML6pXmCwz0NQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.28.1: + resolution: {integrity: sha512-7vWDISaMUn+oo2TwRdf2hl/BLdPxvywv9JKEqNZB/0K7bXwV4XE9wN/C2sAp1gGuh6QBA8lpjF4JIPt3HNlCHA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.28.1: + resolution: {integrity: sha512-IHCu9tVGP+x5BCpA2rF3D04DBokcBza/a8AuHQU+1AiMKubuMegPwcL7RatBgK4ztFHeYnnD5NdhwhRfYMAtNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.28.1: + resolution: {integrity: sha512-Erm72kHmMg/3h350PTseskz+eEGBM17Fuu79WW2Qqt0BfWSF1jHHc12lkJCWMYl5jcBHPs5yZdgNHtJ7IJS3Uw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.28.1: + resolution: {integrity: sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.28.1: + resolution: {integrity: sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -2486,6 +2865,9 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3003,6 +3385,12 @@ packages: '@types/react': optional: true + react-simple-code-editor@0.14.1: + resolution: {integrity: sha512-BR5DtNRy+AswWJECyA17qhUDvrrCZ6zXOCfkQY5zSmb96BVUbpVAv03WpcjcwtCwiLbIANx3gebHOcXYn1EHow==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + react-style-singleton@2.2.1: resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -3185,6 +3573,47 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-preprocess@6.0.3: + resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==} + engines: {node: '>= 18.0.0'} + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: '>=3' + pug: ^3.0.0 + sass: ^1.26.8 + stylus: '>=0.55' + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^4.0.0 || ^5.0.0-next.100 || ^5.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + + svelte@5.2.7: + resolution: {integrity: sha512-cEhPGuLHiH2+Z8B1FwQgiZJgA39uUmJR4516TKrM5zrp0/cuwJkfhUfcTxhAkznanAF5fXUKzvYR4o+Ksx3ZCQ==} + engines: {node: '>=18'} + tailwind-merge@2.5.4: resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} @@ -3198,6 +3627,13 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tailwindcss@4.0.0-beta.2: + resolution: {integrity: sha512-uZ+vgVsy6i18Glc3XYMkTq7dl4GsU4m8X8qRTVlU4+g8Uit7g+wttwfDCl3p+ZOq5KCB09th9XgVDx1zFLCeHA==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} @@ -3254,6 +3690,12 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -3317,6 +3759,16 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + typescript-eslint@8.15.0: + resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} @@ -3374,6 +3826,37 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@5.4.9: resolution: {integrity: sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3531,6 +4014,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -3876,9 +4362,9 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@1.21.0))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@2.4.0))': dependencies: - eslint: 9.13.0(jiti@1.21.0) + eslint: 9.13.0(jiti@2.4.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -4826,6 +5312,53 @@ snapshots: - bufferutil - utf-8-validate + '@swc/core-darwin-arm64@1.9.3': + optional: true + + '@swc/core-darwin-x64@1.9.3': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.9.3': + optional: true + + '@swc/core-linux-arm64-gnu@1.9.3': + optional: true + + '@swc/core-linux-arm64-musl@1.9.3': + optional: true + + '@swc/core-linux-x64-gnu@1.9.3': + optional: true + + '@swc/core-linux-x64-musl@1.9.3': + optional: true + + '@swc/core-win32-arm64-msvc@1.9.3': + optional: true + + '@swc/core-win32-ia32-msvc@1.9.3': + optional: true + + '@swc/core-win32-x64-msvc@1.9.3': + optional: true + + '@swc/core@1.9.3(@swc/helpers@0.5.5)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.17 + optionalDependencies: + '@swc/core-darwin-arm64': 1.9.3 + '@swc/core-darwin-x64': 1.9.3 + '@swc/core-linux-arm-gnueabihf': 1.9.3 + '@swc/core-linux-arm64-gnu': 1.9.3 + '@swc/core-linux-arm64-musl': 1.9.3 + '@swc/core-linux-x64-gnu': 1.9.3 + '@swc/core-linux-x64-musl': 1.9.3 + '@swc/core-win32-arm64-msvc': 1.9.3 + '@swc/core-win32-ia32-msvc': 1.9.3 + '@swc/core-win32-x64-msvc': 1.9.3 + '@swc/helpers': 0.5.5 + '@swc/counter@0.1.3': {} '@swc/helpers@0.5.5': @@ -4833,6 +5366,63 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.2 + '@swc/types@0.1.17': + dependencies: + '@swc/counter': 0.1.3 + + '@tailwindcss/node@4.0.0-beta.2': + dependencies: + enhanced-resolve: 5.17.1 + jiti: 2.4.0 + tailwindcss: 4.0.0-beta.2 + + '@tailwindcss/oxide-android-arm64@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.0.0-beta.2': + optional: true + + '@tailwindcss/oxide@4.0.0-beta.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.0.0-beta.2 + '@tailwindcss/oxide-darwin-arm64': 4.0.0-beta.2 + '@tailwindcss/oxide-darwin-x64': 4.0.0-beta.2 + '@tailwindcss/oxide-freebsd-x64': 4.0.0-beta.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.0-beta.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.0-beta.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.0-beta.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.0-beta.2 + '@tailwindcss/oxide-linux-x64-musl': 4.0.0-beta.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.0-beta.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.0-beta.2 + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14)': dependencies: lodash.castarray: 4.4.0 @@ -4841,6 +5431,27 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.14 + '@tailwindcss/vite@4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1))': + dependencies: + '@tailwindcss/node': 4.0.0-beta.2 + '@tailwindcss/oxide': 4.0.0-beta.2 + lightningcss: 1.28.1 + svelte-preprocess: 6.0.3(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3) + tailwindcss: 4.0.0-beta.2 + vite: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + - svelte + - typescript + '@tanstack/query-core@5.59.13': {} '@tanstack/react-query@5.59.15(react@18.3.1)': @@ -5064,6 +5675,8 @@ snapshots: '@types/phoenix@1.6.4': {} + '@types/prismjs@1.26.5': {} + '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.1': @@ -5088,6 +5701,95 @@ snapshots: dependencies: '@types/node': 22.7.7 + '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/type-utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.15.0 + eslint: 9.13.0(jiti@2.4.0) + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.15.0 + debug: 4.3.7 + eslint: 9.13.0(jiti@2.4.0) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.15.0': + dependencies: + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 + + '@typescript-eslint/type-utils@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + debug: 4.3.7 + eslint: 9.13.0(jiti@2.4.0) + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.15.0': {} + + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.4.0)) + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + eslint: 9.13.0(jiti@2.4.0) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.15.0': + dependencies: + '@typescript-eslint/types': 8.15.0 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-react-swc@3.7.1(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1))': + dependencies: + '@swc/core': 1.9.3(@swc/helpers@0.5.5) + vite: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) + transitivePeerDependencies: + - '@swc/helpers' + '@vitest/expect@2.1.3': dependencies: '@vitest/spy': 2.1.3 @@ -5095,13 +5797,13 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.9(@types/node@22.7.7))': + '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1))': dependencies: '@vitest/spy': 2.1.3 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.9(@types/node@22.7.7) + vite: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) '@vitest/pretty-format@2.1.3': dependencies: @@ -5138,6 +5840,10 @@ snapshots: dependencies: acorn: 8.14.0 + acorn-typescript@1.4.13(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn@8.13.0: {} acorn@8.14.0: {} @@ -5184,6 +5890,8 @@ snapshots: dependencies: tslib: 2.6.2 + aria-query@5.3.2: {} + assertion-error@2.0.1: {} autoprefixer@10.4.20(postcss@8.4.47): @@ -5196,6 +5904,8 @@ snapshots: postcss: 8.4.47 postcss-value-parser: 4.2.0 + axobject-query@4.1.0: {} + balanced-match@1.0.2: {} bin-links@5.0.0: @@ -5349,6 +6059,8 @@ snapshots: deepmerge@4.3.1: {} + detect-libc@1.0.3: {} + detect-node-es@1.1.0: {} didyoumean@1.2.2: {} @@ -5395,6 +6107,11 @@ snapshots: emoji-regex@9.2.2: {} + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + entities@4.5.0: {} esbuild@0.21.5: @@ -5465,9 +6182,11 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint@9.13.0(jiti@1.21.0): + eslint-visitor-keys@4.2.0: {} + + eslint@9.13.0(jiti@2.4.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.0)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.4.0)) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.7.0 @@ -5503,10 +6222,12 @@ snapshots: optionator: 0.9.4 text-table: 0.2.0 optionalDependencies: - jiti: 1.21.0 + jiti: 2.4.0 transitivePeerDependencies: - supports-color + esm-env@1.1.4: {} + espree@10.2.0: dependencies: acorn: 8.13.0 @@ -5517,6 +6238,11 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@1.2.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -5632,8 +6358,12 @@ snapshots: globals@14.0.0: {} + globals@15.12.0: {} + graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + happy-dom@15.7.4: dependencies: entities: 4.5.0 @@ -5705,6 +6435,10 @@ snapshots: is-number@7.0.0: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.6 + is-stream@2.0.1: {} isexe@2.0.0: {} @@ -5719,6 +6453,8 @@ snapshots: jiti@1.21.0: {} + jiti@2.4.0: {} + joycon@3.1.1: {} js-beautify@1.15.1: @@ -5762,6 +6498,51 @@ snapshots: dependencies: isomorphic.js: 0.2.5 + lightningcss-darwin-arm64@1.28.1: + optional: true + + lightningcss-darwin-x64@1.28.1: + optional: true + + lightningcss-freebsd-x64@1.28.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.28.1: + optional: true + + lightningcss-linux-arm64-gnu@1.28.1: + optional: true + + lightningcss-linux-arm64-musl@1.28.1: + optional: true + + lightningcss-linux-x64-gnu@1.28.1: + optional: true + + lightningcss-linux-x64-musl@1.28.1: + optional: true + + lightningcss-win32-arm64-msvc@1.28.1: + optional: true + + lightningcss-win32-x64-msvc@1.28.1: + optional: true + + lightningcss@1.28.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.28.1 + lightningcss-darwin-x64: 1.28.1 + lightningcss-freebsd-x64: 1.28.1 + lightningcss-linux-arm-gnueabihf: 1.28.1 + lightningcss-linux-arm64-gnu: 1.28.1 + lightningcss-linux-arm64-musl: 1.28.1 + lightningcss-linux-x64-gnu: 1.28.1 + lightningcss-linux-x64-musl: 1.28.1 + lightningcss-win32-arm64-msvc: 1.28.1 + lightningcss-win32-x64-msvc: 1.28.1 + lilconfig@2.1.0: {} lilconfig@3.1.1: {} @@ -5776,6 +6557,8 @@ snapshots: load-tsconfig@0.2.5: {} + locate-character@3.0.0: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -6019,11 +6802,11 @@ snapshots: optionalDependencies: postcss: 8.4.47 - postcss-load-config@6.0.1(jiti@1.21.0)(postcss@8.4.47)(yaml@2.4.2): + postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2): dependencies: lilconfig: 3.1.1 optionalDependencies: - jiti: 1.21.0 + jiti: 2.4.0 postcss: 8.4.47 yaml: 2.4.2 @@ -6243,6 +7026,11 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + react-simple-code-editor@0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-style-singleton@2.2.1(@types/react@18.3.11)(react@18.3.1): dependencies: get-nonce: 1.0.1 @@ -6429,6 +7217,31 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte-preprocess@6.0.3(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3): + dependencies: + svelte: 5.2.7 + optionalDependencies: + '@babel/core': 7.24.5 + postcss: 8.4.47 + postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2) + typescript: 5.6.3 + + svelte@5.2.7: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) + aria-query: 5.3.2 + axobject-query: 4.1.0 + esm-env: 1.1.4 + esrap: 1.2.2 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.12 + zimmerframe: 1.1.2 + tailwind-merge@2.5.4: {} tailwindcss-animate@1.0.7(tailwindcss@3.4.14): @@ -6462,6 +7275,10 @@ snapshots: transitivePeerDependencies: - ts-node + tailwindcss@4.0.0-beta.2: {} + + tapable@2.2.1: {} + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -6514,11 +7331,15 @@ snapshots: tree-kill@1.2.2: {} + ts-api-utils@1.4.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + ts-interface-checker@0.1.13: {} tslib@2.6.2: {} - tsup@8.3.0(jiti@1.21.0)(postcss@8.4.47)(typescript@5.6.3)(yaml@2.4.2): + tsup@8.3.0(@swc/core@1.9.3)(jiti@2.4.0)(postcss@8.4.47)(typescript@5.6.3)(yaml@2.4.2): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) cac: 6.7.14 @@ -6529,7 +7350,7 @@ snapshots: execa: 5.1.1 joycon: 3.1.1 picocolors: 1.0.1 - postcss-load-config: 6.0.1(jiti@1.21.0)(postcss@8.4.47)(yaml@2.4.2) + postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2) resolve-from: 5.0.0 rollup: 4.24.0 source-map: 0.8.0-beta.0 @@ -6537,6 +7358,7 @@ snapshots: tinyglobby: 0.2.9 tree-kill: 1.2.2 optionalDependencies: + '@swc/core': 1.9.3(@swc/helpers@0.5.5) postcss: 8.4.47 typescript: 5.6.3 transitivePeerDependencies: @@ -6576,6 +7398,17 @@ snapshots: dependencies: prelude-ls: 1.2.1 + typescript-eslint@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/parser': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.4.0) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + typescript@5.6.3: {} uc.micro@2.1.0: {} @@ -6630,12 +7463,12 @@ snapshots: uuid@10.0.0: {} - vite-node@2.1.3(@types/node@22.7.7): + vite-node@2.1.3(@types/node@22.7.7)(lightningcss@1.28.1): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.9(@types/node@22.7.7) + vite: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) transitivePeerDependencies: - '@types/node' - less @@ -6647,7 +7480,7 @@ snapshots: - supports-color - terser - vite@5.4.9(@types/node@22.7.7): + vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -6655,11 +7488,22 @@ snapshots: optionalDependencies: '@types/node': 22.7.7 fsevents: 2.3.3 + lightningcss: 1.28.1 - vitest@2.1.3(@types/node@22.7.7)(happy-dom@15.7.4): + vite@5.4.9(@types/node@22.7.7)(lightningcss@1.28.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.24.0 + optionalDependencies: + '@types/node': 22.7.7 + fsevents: 2.3.3 + lightningcss: 1.28.1 + + vitest@2.1.3(@types/node@22.7.7)(happy-dom@15.7.4)(lightningcss@1.28.1): dependencies: '@vitest/expect': 2.1.3 - '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.9(@types/node@22.7.7)) + '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) '@vitest/pretty-format': 2.1.3 '@vitest/runner': 2.1.3 '@vitest/snapshot': 2.1.3 @@ -6674,8 +7518,8 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.9(@types/node@22.7.7) - vite-node: 2.1.3(@types/node@22.7.7) + vite: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) + vite-node: 2.1.3(@types/node@22.7.7)(lightningcss@1.28.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.7.7 @@ -6770,6 +7614,8 @@ snapshots: yocto-queue@0.1.0: {} + zimmerframe@1.1.2: {} + zod@3.23.8: {} zustand@5.0.0(@types/react@18.3.11)(react@18.3.1)(use-sync-external-store@1.2.2(react@18.3.1)): From c0423f9f87a21e3d448ffce35c1f183fc2f4c0e6 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 23 Nov 2024 17:34:15 +0600 Subject: [PATCH 04/24] wip --- turbo.json | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/turbo.json b/turbo.json index 90318647..f7ce91ae 100644 --- a/turbo.json +++ b/turbo.json @@ -1,40 +1,29 @@ { "$schema": "https://turbo.build/schema.json", - "globalDependencies": [ - "**/.env.*local" - ], + "globalDependencies": ["**/.env.*local"], "pipeline": { "build": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "env": [], - "outputs": [ - "dist/**", - ".next/**", - "!.next/cache/**" - ] + "outputs": ["dist/**", ".next/**", "!.next/cache/**"] }, "web#build": { - // override settings for the "build" task for the "web" app - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "env": [ "NODE_ENV", "NEXT_PUBLIC_GA_TRACKING_ID", "NEXT_PUBLIC_SUPABASE_URL", "NEXT_PUBLIC_SUPABASE_ANON_KEY" ], - "outputs": [ - ".next/**", - "!.next/cache/**" - ] + "outputs": [".next/**", "!.next/cache/**"] + }, + "transformer#build": { + "dependsOn": ["^build"], + "env": [], + "outputs": [".dist/**"] }, "lint": { - "dependsOn": [ - "^build" - ] + "dependsOn": ["^build"] }, "lint:fix": {}, "clean": {}, From 1c6d31f0211b5703aeb23f99000540ec10caa162 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 23 Nov 2024 17:41:03 +0600 Subject: [PATCH 05/24] wip --- apps/transformer/src/app.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/transformer/src/app.tsx b/apps/transformer/src/app.tsx index bdb4829c..7d0c2025 100644 --- a/apps/transformer/src/app.tsx +++ b/apps/transformer/src/app.tsx @@ -61,6 +61,10 @@ export function App() { const handleCodeChange = (newCode: string) => { setCode(newCode); + console.log('-'.repeat(20)); + console.log('NEW CHANGES'); + console.log(transformer.transform(newCode)); + console.log('-'.repeat(20)); setOutput(JSON.stringify(transformer.transform(newCode), null, 2)); }; From 2cdbbe68bb7e7a75a801df1b0b05a63db9b1327c Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 23 Nov 2024 17:42:42 +0600 Subject: [PATCH 06/24] fix: async --- apps/transformer/src/app.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/transformer/src/app.tsx b/apps/transformer/src/app.tsx index 7d0c2025..9e7bcdd6 100644 --- a/apps/transformer/src/app.tsx +++ b/apps/transformer/src/app.tsx @@ -59,13 +59,9 @@ export function App() { const [transformer] = useState(() => new Transformer()); - const handleCodeChange = (newCode: string) => { + const handleCodeChange = async (newCode: string) => { setCode(newCode); - console.log('-'.repeat(20)); - console.log('NEW CHANGES'); - console.log(transformer.transform(newCode)); - console.log('-'.repeat(20)); - setOutput(JSON.stringify(transformer.transform(newCode), null, 2)); + setOutput(JSON.stringify(await transformer.transform(newCode), null, 2)); }; useEffect(() => { From 4f36059a557f0b64a214bc1460fb3a8257c12e3e Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 24 Nov 2024 18:45:09 +0600 Subject: [PATCH 07/24] wip --- apps/transformer/src/app.tsx | 103 --------------- .../.gitignore | 0 .../README.md | 0 .../index.html | 0 .../package.json | 2 +- .../public/brand/icon.svg | 0 .../public/brand/logo.png | Bin .../public/brand/logo.svg | 0 apps/web-transformer/src/app.tsx | 124 ++++++++++++++++++ .../src/index.css | 0 .../src/main.tsx | 0 .../src/vite-env.d.ts | 0 .../tsconfig.app.json | 0 apps/web-transformer/tsconfig.app.tsbuildinfo | 1 + .../tsconfig.json | 0 .../tsconfig.node.json | 0 .../web-transformer/tsconfig.node.tsbuildinfo | 1 + .../vite.config.ts | 0 packages/transformer/src/index.ts | 2 +- .../src/{transformer.ts => parser.ts} | 26 ++-- turbo.json | 2 +- 21 files changed, 141 insertions(+), 120 deletions(-) delete mode 100644 apps/transformer/src/app.tsx rename apps/{transformer => web-transformer}/.gitignore (100%) rename apps/{transformer => web-transformer}/README.md (100%) rename apps/{transformer => web-transformer}/index.html (100%) rename apps/{transformer => web-transformer}/package.json (96%) rename apps/{transformer => web-transformer}/public/brand/icon.svg (100%) rename apps/{transformer => web-transformer}/public/brand/logo.png (100%) rename apps/{transformer => web-transformer}/public/brand/logo.svg (100%) create mode 100644 apps/web-transformer/src/app.tsx rename apps/{transformer => web-transformer}/src/index.css (100%) rename apps/{transformer => web-transformer}/src/main.tsx (100%) rename apps/{transformer => web-transformer}/src/vite-env.d.ts (100%) rename apps/{transformer => web-transformer}/tsconfig.app.json (100%) create mode 100644 apps/web-transformer/tsconfig.app.tsbuildinfo rename apps/{transformer => web-transformer}/tsconfig.json (100%) rename apps/{transformer => web-transformer}/tsconfig.node.json (100%) create mode 100644 apps/web-transformer/tsconfig.node.tsbuildinfo rename apps/{transformer => web-transformer}/vite.config.ts (100%) rename packages/transformer/src/{transformer.ts => parser.ts} (85%) diff --git a/apps/transformer/src/app.tsx b/apps/transformer/src/app.tsx deleted file mode 100644 index 9e7bcdd6..00000000 --- a/apps/transformer/src/app.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { useEffect, useState } from 'react'; - -import Editor from 'react-simple-code-editor'; -import { highlight, languages } from 'prismjs'; -import 'prismjs/components/prism-jsx'; -import 'prismjs/themes/prism.css'; - -import { Transformer } from '@maily-to/transformer'; - -const defaultCode = ` - - Hello World - - Example -
- - This is just a simple paragraph text - -
`; - -export function App() { - const [code, setCode] = useState(''); - const [output, setOutput] = useState(''); - - const [transformer] = useState(() => new Transformer()); - - const handleCodeChange = async (newCode: string) => { - setCode(newCode); - setOutput(JSON.stringify(await transformer.transform(newCode), null, 2)); - }; - - useEffect(() => { - handleCodeChange(defaultCode); - }, []); - - return ( -
-
-

Maily Transformer

-
- -
-
-

Input JSX

-
- highlight(code, languages.jsx, 'jsx')} - padding={16} - style={{ - fontFamily: '"Fira code", "Fira Mono", monospace', - fontSize: 14, - minHeight: '500px', - backgroundColor: '#f8f9fa', - }} - /> -
-
- -
-

AST Output

-
{output}
-
-
-
- ); -} diff --git a/apps/transformer/.gitignore b/apps/web-transformer/.gitignore similarity index 100% rename from apps/transformer/.gitignore rename to apps/web-transformer/.gitignore diff --git a/apps/transformer/README.md b/apps/web-transformer/README.md similarity index 100% rename from apps/transformer/README.md rename to apps/web-transformer/README.md diff --git a/apps/transformer/index.html b/apps/web-transformer/index.html similarity index 100% rename from apps/transformer/index.html rename to apps/web-transformer/index.html diff --git a/apps/transformer/package.json b/apps/web-transformer/package.json similarity index 96% rename from apps/transformer/package.json rename to apps/web-transformer/package.json index 7db96588..f6244884 100644 --- a/apps/transformer/package.json +++ b/apps/web-transformer/package.json @@ -1,5 +1,5 @@ { - "name": "transformer", + "name": "web-transformer", "private": true, "version": "0.0.0", "type": "module", diff --git a/apps/transformer/public/brand/icon.svg b/apps/web-transformer/public/brand/icon.svg similarity index 100% rename from apps/transformer/public/brand/icon.svg rename to apps/web-transformer/public/brand/icon.svg diff --git a/apps/transformer/public/brand/logo.png b/apps/web-transformer/public/brand/logo.png similarity index 100% rename from apps/transformer/public/brand/logo.png rename to apps/web-transformer/public/brand/logo.png diff --git a/apps/transformer/public/brand/logo.svg b/apps/web-transformer/public/brand/logo.svg similarity index 100% rename from apps/transformer/public/brand/logo.svg rename to apps/web-transformer/public/brand/logo.svg diff --git a/apps/web-transformer/src/app.tsx b/apps/web-transformer/src/app.tsx new file mode 100644 index 00000000..c0bb8229 --- /dev/null +++ b/apps/web-transformer/src/app.tsx @@ -0,0 +1,124 @@ +import { useEffect, useState } from 'react'; + +import Editor from 'react-simple-code-editor'; +import { highlight, languages } from 'prismjs'; +import 'prismjs/components/prism-jsx'; +import 'prismjs/themes/prism.css'; + +import { Parser } from '@maily-to/transformer'; + +const defaultCode = ` + + Hello World + + Example +
+ + This is just a simple paragraph text + +
`; + +export function App() { + const [code, setCode] = useState(''); + const [output, setOutput] = useState(''); + + const [parser] = useState(() => new Parser()); + + const handleCodeChange = async (newCode: string) => { + setCode(newCode); + setOutput(JSON.stringify(await parser.parse(newCode), null, 2)); + }; + + useEffect(() => { + handleCodeChange(defaultCode); + }, []); + + return ( +
+
+

+ Maily Transformer +

+
+ +
+
+
+ + JSX + +
+ +
+
+ highlight(code, languages.jsx, 'jsx')} + padding={16} + style={{ + fontFamily: '"Fira code", "Fira Mono", monospace', + fontSize: 14, + minHeight: '500px', + backgroundColor: '#f8f9fa', + }} + /> +
+
+
+ +
+
+ + +
+ +
+
+
{output}
+
+
+
+
+
+ ); +} diff --git a/apps/transformer/src/index.css b/apps/web-transformer/src/index.css similarity index 100% rename from apps/transformer/src/index.css rename to apps/web-transformer/src/index.css diff --git a/apps/transformer/src/main.tsx b/apps/web-transformer/src/main.tsx similarity index 100% rename from apps/transformer/src/main.tsx rename to apps/web-transformer/src/main.tsx diff --git a/apps/transformer/src/vite-env.d.ts b/apps/web-transformer/src/vite-env.d.ts similarity index 100% rename from apps/transformer/src/vite-env.d.ts rename to apps/web-transformer/src/vite-env.d.ts diff --git a/apps/transformer/tsconfig.app.json b/apps/web-transformer/tsconfig.app.json similarity index 100% rename from apps/transformer/tsconfig.app.json rename to apps/web-transformer/tsconfig.app.json diff --git a/apps/web-transformer/tsconfig.app.tsbuildinfo b/apps/web-transformer/tsconfig.app.tsbuildinfo new file mode 100644 index 00000000..fd34676d --- /dev/null +++ b/apps/web-transformer/tsconfig.app.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts"],"version":"5.6.3"} \ No newline at end of file diff --git a/apps/transformer/tsconfig.json b/apps/web-transformer/tsconfig.json similarity index 100% rename from apps/transformer/tsconfig.json rename to apps/web-transformer/tsconfig.json diff --git a/apps/transformer/tsconfig.node.json b/apps/web-transformer/tsconfig.node.json similarity index 100% rename from apps/transformer/tsconfig.node.json rename to apps/web-transformer/tsconfig.node.json diff --git a/apps/web-transformer/tsconfig.node.tsbuildinfo b/apps/web-transformer/tsconfig.node.tsbuildinfo new file mode 100644 index 00000000..75ea0011 --- /dev/null +++ b/apps/web-transformer/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./vite.config.ts"],"version":"5.6.3"} \ No newline at end of file diff --git a/apps/transformer/vite.config.ts b/apps/web-transformer/vite.config.ts similarity index 100% rename from apps/transformer/vite.config.ts rename to apps/web-transformer/vite.config.ts diff --git a/packages/transformer/src/index.ts b/packages/transformer/src/index.ts index 2b6d74c1..cddc130b 100644 --- a/packages/transformer/src/index.ts +++ b/packages/transformer/src/index.ts @@ -1,2 +1,2 @@ -export * from './transformer'; +export * from './parser'; export * from './types'; diff --git a/packages/transformer/src/transformer.ts b/packages/transformer/src/parser.ts similarity index 85% rename from packages/transformer/src/transformer.ts rename to packages/transformer/src/parser.ts index 147e10f4..8fafcda2 100644 --- a/packages/transformer/src/transformer.ts +++ b/packages/transformer/src/parser.ts @@ -17,7 +17,7 @@ import type { Options, } from './types'; -export class Transformer { +export class Parser { protected jsx: typeof AcornParser; constructor() { @@ -61,13 +61,13 @@ export class Transformer { * @param content - The JSX content to transform. * @returns The root ParsedNode object containing the transformed JSX tree. */ - public async transform(content: string): Promise { + public async parse(content: string): Promise { content = this.clean(content); const ast = this.ast(content); const children: ParsedNode[] = []; for (const node of ast.body) { - children.push(this.transformNode(node)); + children.push(this.parseNode(node)); } return { @@ -76,7 +76,7 @@ export class Transformer { }; } - private transformNode(node: unknown, options?: Options) { + private parseNode(node: unknown, options?: Options) { // @ts-ignore if (node?.type in this) { // @ts-ignore @@ -87,23 +87,21 @@ export class Transformer { } private ExpressionStatement(node: ExpressionStatement) { - return this.transformNode(node.expression); + return this.parseNode(node.expression); } private JSXElement(node: JSXElement) { const element = node; const attributes: Record = {}; for (const attr of element?.openingElement?.attributes) { - attributes[this.transformNode(attr.name)] = this.transformNode( - attr.value - ); + attributes[this.parseNode(attr.name)] = this.parseNode(attr.value); } const children: ParsedNode[] = []; const isSingleChildElement = element.children.length === 1; element.children.forEach((child, index) => { children.push( - this.transformNode( + this.parseNode( child, child.type === 'JSXText' ? { @@ -132,13 +130,13 @@ export class Transformer { } private JSXExpressionContainer(node: JSXExpressionContainer) { - return this.transformNode(node.expression); + return this.parseNode(node.expression); } private JSXAttribute(node: JSXAttribute) { return { name: node.name.name, - value: this.transformNode(node.value), + value: this.parseNode(node.value), }; } @@ -149,7 +147,7 @@ export class Transformer { private ObjectExpression(node: ObjectExpression) { const object: Record = {}; for (const prop of node.properties as Property[]) { - object[this.transformNode(prop.key)] = this.transformNode(prop.value); + object[this.parseNode(prop.key)] = this.parseNode(prop.value); } return object; @@ -157,8 +155,8 @@ export class Transformer { private Property(node: Property) { return { - name: this.transformNode(node.key), - value: this.transformNode(node.value), + name: this.parseNode(node.key), + value: this.parseNode(node.value), }; } diff --git a/turbo.json b/turbo.json index f7ce91ae..8183b6cb 100644 --- a/turbo.json +++ b/turbo.json @@ -17,7 +17,7 @@ ], "outputs": [".next/**", "!.next/cache/**"] }, - "transformer#build": { + "web-transformer#build": { "dependsOn": ["^build"], "env": [], "outputs": [".dist/**"] From 5b89e9b10d083b2d2335e726c98e24be4ed3d1d8 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 24 Nov 2024 18:48:15 +0600 Subject: [PATCH 08/24] fix: lock file --- pnpm-lock.yaml | 98 +++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 496fb5bb..e1f53fef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,55 +45,6 @@ importers: specifier: ^2.1.3 version: 2.1.3(@types/node@22.7.7)(happy-dom@15.7.4)(lightningcss@1.28.1) - apps/transformer: - dependencies: - '@maily-to/transformer': - specifier: workspace:* - version: link:../../packages/transformer - '@tailwindcss/vite': - specifier: 4.0.0-beta.2 - version: 4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) - prismjs: - specifier: ^1.29.0 - version: 1.29.0 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - react-simple-code-editor: - specifier: ^0.14.1 - version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tailwindcss: - specifier: 4.0.0-beta.2 - version: 4.0.0-beta.2 - devDependencies: - '@types/prismjs': - specifier: ^1.26.5 - version: 1.26.5 - '@types/react': - specifier: ^18.3.12 - version: 18.3.12 - '@types/react-dom': - specifier: ^18.3.1 - version: 18.3.1 - '@vitejs/plugin-react-swc': - specifier: ^3.5.0 - version: 3.7.1(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) - globals: - specifier: ^15.11.0 - version: 15.12.0 - typescript: - specifier: ~5.6.2 - version: 5.6.3 - typescript-eslint: - specifier: ^8.11.0 - version: 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) - vite: - specifier: ^5.4.10 - version: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) - apps/web: dependencies: '@maily-to/core': @@ -221,6 +172,55 @@ importers: specifier: ^5.6.3 version: 5.6.3 + apps/web-transformer: + dependencies: + '@maily-to/transformer': + specifier: workspace:* + version: link:../../packages/transformer + '@tailwindcss/vite': + specifier: 4.0.0-beta.2 + version: 4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) + prismjs: + specifier: ^1.29.0 + version: 1.29.0 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-simple-code-editor: + specifier: ^0.14.1 + version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwindcss: + specifier: 4.0.0-beta.2 + version: 4.0.0-beta.2 + devDependencies: + '@types/prismjs': + specifier: ^1.26.5 + version: 1.26.5 + '@types/react': + specifier: ^18.3.12 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.3.1 + version: 18.3.1 + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.7.1(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) + globals: + specifier: ^15.11.0 + version: 15.12.0 + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.11.0 + version: 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + vite: + specifier: ^5.4.10 + version: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) + packages/core: dependencies: '@radix-ui/react-dropdown-menu': From 6a721ca067b9f720d67d1a3a3f7051afe8aa0457 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Mon, 25 Nov 2024 10:10:08 +0600 Subject: [PATCH 09/24] wip --- packages/transformer/src/transformer.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 packages/transformer/src/transformer.ts diff --git a/packages/transformer/src/transformer.ts b/packages/transformer/src/transformer.ts new file mode 100644 index 00000000..ae26a5fc --- /dev/null +++ b/packages/transformer/src/transformer.ts @@ -0,0 +1,14 @@ +import { Parser } from './parser'; + +export class Transformer { + protected parser: Parser; + + constructor() { + this.parser = new Parser(); + } + + public transform(content: string) { + const ast = this.parser.parse(content); + console.log(ast); + } +} From 3316afe478b5d8173c20bcaedee4d0ecfb057568 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 30 Nov 2024 16:44:23 +0600 Subject: [PATCH 10/24] wip: hydrate maily with jsx --- apps/web-transformer/package.json | 4 + apps/web-transformer/src/app.tsx | 293 ++++++++++++++---- .../src/editor/components/editor-menu-bar.tsx | 2 +- .../components/for-menu/for-bubble-menu.tsx | 2 +- .../editor/components/ui/dropdown-menu.tsx | 4 +- .../components/ui/edge-spacing-controls.tsx | 2 +- .../core/src/editor/components/ui/tooltip.tsx | 2 +- .../slash-command/slash-command-view.tsx | 6 +- packages/core/src/editor/index.tsx | 8 +- .../nodes/variable/variable-suggestions.tsx | 2 +- .../editor/nodes/variable/variable-view.tsx | 2 +- packages/render/package.json | 3 +- packages/render/src/index.ts | 1 + packages/render/src/maily.tsx | 30 +- packages/render/src/render-markup.ts | 16 + packages/transformer/src/index.ts | 1 + packages/transformer/src/transformer.ts | 204 +++++++++++- packages/transformer/src/types.ts | 2 +- pnpm-lock.yaml | 123 ++++---- 19 files changed, 563 insertions(+), 144 deletions(-) create mode 100644 packages/render/src/render-markup.ts diff --git a/apps/web-transformer/package.json b/apps/web-transformer/package.json index f6244884..1a792c2c 100644 --- a/apps/web-transformer/package.json +++ b/apps/web-transformer/package.json @@ -10,8 +10,12 @@ "preview": "vite preview" }, "dependencies": { + "@maily-to/core": "workspace:*", + "@maily-to/render": "workspace:*", "@maily-to/transformer": "workspace:*", "@tailwindcss/vite": "4.0.0-beta.2", + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", "prismjs": "^1.29.0", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/apps/web-transformer/src/app.tsx b/apps/web-transformer/src/app.tsx index c0bb8229..46255ec3 100644 --- a/apps/web-transformer/src/app.tsx +++ b/apps/web-transformer/src/app.tsx @@ -5,63 +5,141 @@ import { highlight, languages } from 'prismjs'; import 'prismjs/components/prism-jsx'; import 'prismjs/themes/prism.css'; -import { Parser } from '@maily-to/transformer'; +import { Parser, Transformer } from '@maily-to/transformer'; +import { Editor as Maily, type MailyEditor } from '@maily-to/core'; +import { renderMarkup } from '@maily-to/render'; const defaultCode = ` - - Hello World - - Example -
- - This is just a simple paragraph text - + + +
+ + Arik Chakma How are you? + +
+
+ +
+ + Welcome To the Section + +
+
+
`; export function App() { const [code, setCode] = useState(''); - const [output, setOutput] = useState(''); - const [parser] = useState(() => new Parser()); + const [editor, setEditor] = useState(); + + const [defaultContent, setDefaultContent] = useState(); + const [parsedOutput, setParsedOutput] = useState(''); + const [mailyJSONOutput, setMailyJSONOutput] = useState(''); + const [jsxOutput, setJSXOutput] = useState(''); + + const [parentTab, setParentTab] = useState<'maily' | 'jsx'>('maily'); + + const [activeTab, setActiveTab] = useState< + 'maily' | 'maily-json' | 'parsed-json' | 'maily-markup' + >('maily-markup'); const handleCodeChange = async (newCode: string) => { setCode(newCode); - setOutput(JSON.stringify(await parser.parse(newCode), null, 2)); + const parser = new Parser(); + const transformer = new Transformer(); + + setParsedOutput(JSON.stringify(await parser.parse(newCode), null, 2)); + + const mailyJSON = await transformer.transform(newCode); + setMailyJSONOutput(JSON.stringify(mailyJSON, null, 2)); + + setDefaultContent(mailyJSON); + editor?.commands?.setContent(mailyJSON); + }; + + const handleMailyChange = async (editor: MailyEditor) => { + const json = editor.getJSON(); + setMailyJSONOutput(JSON.stringify(json, null, 2)); + const jsx = await renderMarkup(json); + + const prettier = await import('prettier/standalone'); + const formattedJSX = await prettier.format(jsx, { + parser: 'acorn', + plugins: [ + await import('prettier/plugins/acorn'), + (await import('prettier/plugins/estree')).default, + ], + }); + + setJSXOutput(formattedJSX); }; useEffect(() => { @@ -79,42 +157,127 @@ export function App() {
- + + +
- highlight(code, languages.jsx, 'jsx')} - padding={16} - style={{ - fontFamily: '"Fira code", "Fira Mono", monospace', - fontSize: 14, - minHeight: '500px', - backgroundColor: '#f8f9fa', - }} - /> + {parentTab === 'jsx' && ( + highlight(code, languages.jsx, 'jsx')} + padding={16} + tabSize={2} + style={{ + fontFamily: '"Fira code", "Fira Mono", monospace', + fontSize: 14, + minHeight: '500px', + backgroundColor: '#f8f9fa', + }} + /> + )} + + {parentTab === 'maily' && ( + + )}
- + )} + + - + + {parentTab === 'jsx' && ( + <> + + + + + )}
-
{output}
+
+                {activeTab === 'maily-json' && mailyJSONOutput}
+                {activeTab === 'parsed-json' &&
+                  parentTab === 'jsx' &&
+                  parsedOutput}
+                {activeTab === 'maily-markup' &&
+                  parentTab === 'maily' &&
+                  jsxOutput}
+                {activeTab === 'maily' && parentTab === 'jsx' && (
+                  
+                )}
+              
diff --git a/packages/core/src/editor/components/editor-menu-bar.tsx b/packages/core/src/editor/components/editor-menu-bar.tsx index 269ae935..bae62dc3 100644 --- a/packages/core/src/editor/components/editor-menu-bar.tsx +++ b/packages/core/src/editor/components/editor-menu-bar.tsx @@ -147,7 +147,7 @@ export const EditorMenuBar = (props: EditorMenuBarProps) => { {groups.map((group, index) => (
{items .filter((item) => item.group === group) diff --git a/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx b/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx index fba78159..a3fa9f37 100644 --- a/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx +++ b/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx @@ -77,7 +77,7 @@ export function ForBubbleMenu(props: EditorBubbleMenuProps) { {!isUpdatingKey && (
From 2193c0fa6efcb106b84dfc521dc7a246a26d763b Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 30 Nov 2024 22:12:32 +0600 Subject: [PATCH 12/24] fix: image bubble --- packages/core/src/editor/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/editor/index.tsx b/packages/core/src/editor/index.tsx index af460d10..749dd86a 100644 --- a/packages/core/src/editor/index.tsx +++ b/packages/core/src/editor/index.tsx @@ -146,7 +146,6 @@ export function Editor(props: EditorProps) { bodyClassName )} > - From 8f684d2357192ea305d381701b6c62951a573540 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 12:39:50 +0600 Subject: [PATCH 13/24] feat: bubble menu append to --- packages/core/package.json | 54 +++++++++---------- .../src/editor/components/base-button.tsx | 2 +- .../column-menu/columns-bubble-menu.tsx | 3 +- .../components/for-menu/for-bubble-menu.tsx | 3 +- .../image-menu/image-bubble-menu.tsx | 3 +- .../section-menu/section-bubble-menu.tsx | 17 ++---- .../spacer-menu/spacer-bubble-menu.tsx | 3 +- .../components/text-menu/text-bubble-menu.tsx | 3 +- .../core/src/editor/components/ui/select.tsx | 2 +- packages/core/src/editor/index.tsx | 28 +++++++--- packages/render/package.json | 8 +-- packages/render/src/maily.tsx | 1 + packages/tailwind-config/package.json | 8 +-- 13 files changed, 68 insertions(+), 67 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index b46455cf..d87e6fd8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -58,44 +58,44 @@ "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.3", - "@tiptap/core": "^2.9.1", - "@tiptap/extension-color": "^2.9.1", - "@tiptap/extension-document": "^2.9.1", - "@tiptap/extension-dropcursor": "^2.9.1", - "@tiptap/extension-focus": "^2.9.1", - "@tiptap/extension-heading": "^2.9.1", - "@tiptap/extension-horizontal-rule": "^2.9.1", - "@tiptap/extension-image": "^2.9.1", - "@tiptap/extension-link": "^2.9.1", - "@tiptap/extension-list-item": "^2.9.1", - "@tiptap/extension-mention": "^2.9.1", - "@tiptap/extension-paragraph": "^2.9.1", - "@tiptap/extension-placeholder": "^2.9.1", - "@tiptap/extension-text-align": "^2.9.1", - "@tiptap/extension-text-style": "^2.9.1", - "@tiptap/extension-underline": "^2.9.1", - "@tiptap/pm": "^2.9.1", - "@tiptap/react": "^2.9.1", - "@tiptap/starter-kit": "^2.9.1", - "@tiptap/suggestion": "^2.9.1", + "@radix-ui/react-tooltip": "^1.1.4", + "@tiptap/core": "^2.10.3", + "@tiptap/extension-color": "^2.10.3", + "@tiptap/extension-document": "^2.10.3", + "@tiptap/extension-dropcursor": "^2.10.3", + "@tiptap/extension-focus": "^2.10.3", + "@tiptap/extension-heading": "^2.10.3", + "@tiptap/extension-horizontal-rule": "^2.10.3", + "@tiptap/extension-image": "^2.10.3", + "@tiptap/extension-link": "^2.10.3", + "@tiptap/extension-list-item": "^2.10.3", + "@tiptap/extension-mention": "^2.10.3", + "@tiptap/extension-paragraph": "^2.10.3", + "@tiptap/extension-placeholder": "^2.10.3", + "@tiptap/extension-text-align": "^2.10.3", + "@tiptap/extension-text-style": "^2.10.3", + "@tiptap/extension-underline": "^2.10.3", + "@tiptap/pm": "^2.10.3", + "@tiptap/react": "^2.10.3", + "@tiptap/starter-kit": "^2.10.3", + "@tiptap/suggestion": "^2.10.3", "clsx": "^2.1.1", "echo-drag-handle-plugin": "^0.0.2", "fast-deep-equal": "^3.1.3", - "lucide-react": "^0.453.0", + "lucide-react": "^0.462.0", "react-colorful": "^5.6.1", - "tailwind-merge": "^2.5.4", - "tailwindcss": "^3.4.14", + "tailwind-merge": "^2.5.5", + "tailwindcss": "^3.4.15", "tippy.js": "^6.3.7", - "uuid": "^10.0.0" + "uuid": "^11.0.3" }, "devDependencies": { "@types/react": "^18.3.12", "@types/uuid": "^10.0.0", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "tailwind-config": "workspace:*", "tsconfig": "workspace:*", - "typescript": "^5.6.3" + "typescript": "^5.7.2" }, "peerDependencies": { "react": "^18.3.1" diff --git a/packages/core/src/editor/components/base-button.tsx b/packages/core/src/editor/components/base-button.tsx index 26a7c29b..58b5ff69 100644 --- a/packages/core/src/editor/components/base-button.tsx +++ b/packages/core/src/editor/components/base-button.tsx @@ -28,7 +28,7 @@ const BaseButton = React.forwardRef( ) => { const Comp = asChild ? Slot : 'button'; const baseClass = - 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-opacity-50'; + 'mly-inline-flex mly-items-center mly-justify-center mly-rounded-md mly-text-sm mly-font-medium mly-ring-offset-white mly-transition-colors focus-visible:mly-outline-none focus-visible:mly-ring-2 focus-visible:mly-ring-gray-400 focus-visible:mly-ring-offset-2 disabled:mly-opacity-50 mly-cursor-pointer'; const variantClasses = { default: 'mly-bg-gray-900 mly-text-gray-50 hover:mly-bg-soft-gray', destructive: 'mly-bg-red-500 mly-text-gray-50 hover:mly-bg-red-500/90', diff --git a/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx b/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx index 9ab31007..881f1590 100644 --- a/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx +++ b/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx @@ -23,7 +23,6 @@ export function ColumnsBubbleMenu(props: EditorBubbleMenuProps) { const bubbleMenuProps: EditorBubbleMenuProps = { ...props, - appendTo: appendTo?.current || document.body, shouldShow: ({ editor }) => { if ( isTextSelected(editor) || @@ -41,7 +40,7 @@ export function ColumnsBubbleMenu(props: EditorBubbleMenuProps) { modifiers: [{ name: 'flip', enabled: false }], }, getReferenceClientRect, - appendTo: () => appendTo?.current || document.body, + appendTo: appendTo?.current || 'parent', plugins: [sticky], sticky: 'popper', maxWidth: 'auto', diff --git a/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx b/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx index d2f1a83c..4024c83e 100644 --- a/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx +++ b/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx @@ -32,7 +32,6 @@ export function ForBubbleMenu(props: EditorBubbleMenuProps) { const bubbleMenuProps: EditorBubbleMenuProps = { ...props, - appendTo: appendTo?.current || document.body, shouldShow: ({ editor }) => { if (isTextSelected(editor)) { return false; @@ -46,7 +45,7 @@ export function ForBubbleMenu(props: EditorBubbleMenuProps) { modifiers: [{ name: 'flip', enabled: false }], }, getReferenceClientRect, - appendTo: appendTo?.current || document.body, + appendTo: appendTo?.current || 'parent', plugins: [sticky], sticky: 'popper', maxWidth: 'auto', diff --git a/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx b/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx index 8e9be0a5..90e78609 100644 --- a/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx +++ b/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx @@ -22,7 +22,6 @@ export function ImageBubbleMenu(props: EditorBubbleMenuProps) { const bubbleMenuProps: EditorBubbleMenuProps = { ...props, - appendTo: appendTo?.current || document.body, shouldShow: ({ editor }) => { return editor.isActive('logo') || editor.isActive('image'); }, @@ -30,7 +29,7 @@ export function ImageBubbleMenu(props: EditorBubbleMenuProps) { popperOptions: { modifiers: [{ name: 'flip', enabled: false }], }, - appendTo: appendTo?.current || document.body, + appendTo: appendTo?.current || 'parent', plugins: [sticky], sticky: 'popper', maxWidth: '100%', diff --git a/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx b/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx index ca1adb90..6070e6f8 100644 --- a/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx +++ b/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx @@ -1,19 +1,9 @@ -import { BubbleMenu, isTextSelection } from '@tiptap/react'; +import { BubbleMenu } from '@tiptap/react'; import { useCallback } from 'react'; import { getRenderContainer } from '../../utils/get-render-container'; import { sticky } from 'tippy.js'; import { useSectionState } from './use-section-state'; -import { NumberInput } from '../ui/number-input'; -import { - AlignCenter, - AlignLeft, - AlignRight, - Box, - BoxSelect, - ChevronUp, - Scan, - Trash, -} from 'lucide-react'; +import { ChevronUp, Trash } from 'lucide-react'; import { ColorPicker } from '../ui/color-picker'; import { EditorBubbleMenuProps } from '../text-menu/text-bubble-menu'; import { isTextSelected } from '@/editor/utils/is-text-selected'; @@ -48,7 +38,6 @@ export function SectionBubbleMenu(props: EditorBubbleMenuProps) { const bubbleMenuProps: EditorBubbleMenuProps = { ...props, - appendTo: appendTo?.current || document.body, shouldShow: ({ editor }) => { if (isTextSelected(editor) || editor.isActive('for')) { return false; @@ -62,7 +51,7 @@ export function SectionBubbleMenu(props: EditorBubbleMenuProps) { modifiers: [{ name: 'flip', enabled: false }], }, getReferenceClientRect, - appendTo: appendTo?.current || document.body, + appendTo: appendTo?.current || 'parent', plugins: [sticky], sticky: 'popper', maxWidth: 'auto', diff --git a/packages/core/src/editor/components/spacer-menu/spacer-bubble-menu.tsx b/packages/core/src/editor/components/spacer-menu/spacer-bubble-menu.tsx index f0ef7d3b..f72254a8 100644 --- a/packages/core/src/editor/components/spacer-menu/spacer-bubble-menu.tsx +++ b/packages/core/src/editor/components/spacer-menu/spacer-bubble-menu.tsx @@ -26,10 +26,9 @@ export function SpacerBubbleMenu(props: EditorBubbleMenuProps) { const bubbleMenuProps: EditorBubbleMenuProps = { ...props, - appendTo: appendTo?.current || document.body, shouldShow: ({ editor }) => editor.isActive('spacer'), tippyOptions: { - appendTo: appendTo?.current || document.body, + appendTo: appendTo?.current || 'parent', maxWidth: '100%', moveTransition: 'mly-transform 0.15s mly-ease-out', }, diff --git a/packages/core/src/editor/components/text-menu/text-bubble-menu.tsx b/packages/core/src/editor/components/text-menu/text-bubble-menu.tsx index 4db5434d..90e685e3 100644 --- a/packages/core/src/editor/components/text-menu/text-bubble-menu.tsx +++ b/packages/core/src/editor/components/text-menu/text-bubble-menu.tsx @@ -86,7 +86,6 @@ export function TextBubbleMenu(props: EditorBubbleMenuProps) { const bubbleMenuProps: EditorBubbleMenuProps = { ...props, - appendTo: appendTo?.current || document.body, pluginKey: 'textMenu', shouldShow: ({ editor, state, from, to, view }) => { if (!view || editor.view.dragging) { @@ -122,7 +121,7 @@ export function TextBubbleMenu(props: EditorBubbleMenuProps) { }, ], }, - appendTo: appendTo?.current || document.body, + appendTo: appendTo?.current || 'parent', maxWidth: '100%', }, }; diff --git a/packages/core/src/editor/components/ui/select.tsx b/packages/core/src/editor/components/ui/select.tsx index 34fae44d..f6aa8ea4 100644 --- a/packages/core/src/editor/components/ui/select.tsx +++ b/packages/core/src/editor/components/ui/select.tsx @@ -37,7 +37,7 @@ export function Select(props: SelectProps) { const content = (
-
diff --git a/packages/render/package.json b/packages/render/package.json index d8b6e93a..bd585fc3 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -49,14 +49,14 @@ "devDependencies": { "@antfu/utils": "^0.7.10", "@babel/preset-react": "^7.25.9", - "@tiptap/core": "^2.9.1", + "@tiptap/core": "^2.10.3", "@types/react": "^18.3.12", "tsconfig": "workspace:*", - "typescript": "^5.6.3" + "typescript": "^5.7.2" }, "dependencies": { - "@react-email/components": "^0.0.25", - "@react-email/render": "^1.0.1", + "@react-email/components": "^0.0.28", + "@react-email/render": "^1.0.2", "react-element-to-jsx-string": "^15.0.0" }, "peerDependencies": { diff --git a/packages/render/src/maily.tsx b/packages/render/src/maily.tsx index cb6de9e7..013fab57 100644 --- a/packages/render/src/maily.tsx +++ b/packages/render/src/maily.tsx @@ -1498,6 +1498,7 @@ export class Maily { paddingRight, }} className="tab-pad" + id="maily-col-section" > {this.getMappedContent(node, { ...options, diff --git a/packages/tailwind-config/package.json b/packages/tailwind-config/package.json index 99ccdf5a..b3e4f003 100644 --- a/packages/tailwind-config/package.json +++ b/packages/tailwind-config/package.json @@ -6,10 +6,10 @@ "devDependencies": { "@tailwindcss/typography": "^0.5.15", "autoprefixer": "^10.4.20", - "postcss": "^8.4.47", - "prettier": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.6.8", - "tailwindcss": "^3.4.14", + "postcss": "^8.4.49", + "prettier": "^3.4.1", + "prettier-plugin-tailwindcss": "^0.6.9", + "tailwindcss": "^3.4.15", "tailwindcss-animate": "^1.0.7" } } \ No newline at end of file From bc1ffe0e971eaf6561cc6d1e0a51f20720462ac6 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 12:50:58 +0600 Subject: [PATCH 14/24] fix: bubble menu border --- .../src/editor/components/column-menu/columns-bubble-menu.tsx | 2 +- .../core/src/editor/components/for-menu/for-bubble-menu.tsx | 2 +- .../src/editor/components/image-menu/image-bubble-menu.tsx | 2 +- .../editor/components/section-menu/section-bubble-menu.tsx | 2 +- packages/core/src/editor/components/show-popover.tsx | 2 +- .../src/editor/components/spacer-menu/spacer-bubble-menu.tsx | 2 +- .../core/src/editor/components/text-menu/text-bubble-menu.tsx | 2 +- packages/core/src/editor/components/ui/color-picker.tsx | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx b/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx index 881f1590..8a72eae2 100644 --- a/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx +++ b/packages/core/src/editor/components/column-menu/columns-bubble-menu.tsx @@ -51,7 +51,7 @@ export function ColumnsBubbleMenu(props: EditorBubbleMenuProps) { return ( diff --git a/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx b/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx index 4024c83e..48a1ec41 100644 --- a/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx +++ b/packages/core/src/editor/components/for-menu/for-bubble-menu.tsx @@ -67,7 +67,7 @@ export function ForBubbleMenu(props: EditorBubbleMenuProps) { return ( diff --git a/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx b/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx index 90e78609..07846975 100644 --- a/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx +++ b/packages/core/src/editor/components/image-menu/image-bubble-menu.tsx @@ -39,7 +39,7 @@ export function ImageBubbleMenu(props: EditorBubbleMenuProps) { return ( {state.isLogoActive && state.imageSrc && ( diff --git a/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx b/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx index 6070e6f8..a34cafa1 100644 --- a/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx +++ b/packages/core/src/editor/components/section-menu/section-bubble-menu.tsx @@ -70,7 +70,7 @@ export function SectionBubbleMenu(props: EditorBubbleMenuProps) { return ( {items.map((item, index) => ( {items.map((item, index) => ( diff --git a/packages/core/src/editor/components/ui/color-picker.tsx b/packages/core/src/editor/components/ui/color-picker.tsx index 618db034..02d8347d 100644 --- a/packages/core/src/editor/components/ui/color-picker.tsx +++ b/packages/core/src/editor/components/ui/color-picker.tsx @@ -83,7 +83,7 @@ export function ColorPicker(props: ColorPickerProps) { className="mly-w-full mly-rounded-none mly-border-0 !mly-bg-transparent !mly-p-0 mly-shadow-none mly-drop-shadow-md" sideOffset={8} > -
+
From 5a9f41eecd648d414b19755eb48db9db587c0cc5 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 12:51:20 +0600 Subject: [PATCH 15/24] wip: section node --- apps/web-transformer/src/app.tsx | 177 ++-- packages/transformer/package.json | 2 +- packages/transformer/src/transformer.ts | 62 +- pnpm-lock.yaml | 1046 +++++++++++++---------- 4 files changed, 746 insertions(+), 541 deletions(-) diff --git a/apps/web-transformer/src/app.tsx b/apps/web-transformer/src/app.tsx index 46255ec3..65fe2f30 100644 --- a/apps/web-transformer/src/app.tsx +++ b/apps/web-transformer/src/app.tsx @@ -8,91 +8,96 @@ import 'prismjs/themes/prism.css'; import { Parser, Transformer } from '@maily-to/transformer'; import { Editor as Maily, type MailyEditor } from '@maily-to/core'; import { renderMarkup } from '@maily-to/render'; +import { useRef } from 'react'; const defaultCode = ` - - -
- - Arik Chakma How are you? - -
-
- -
- - Welcome To the Section - -
-
-
+ + +
+ + First Column + +
+
+ + +
+ + Second Column + +
+
+
`; export function App() { @@ -100,6 +105,8 @@ export function App() { const [editor, setEditor] = useState(); + const containerRef = useRef(null); + const [defaultContent, setDefaultContent] = useState(); const [parsedOutput, setParsedOutput] = useState(''); const [mailyJSONOutput, setMailyJSONOutput] = useState(''); @@ -180,7 +187,7 @@ export function App() {
-
+
{parentTab === 'jsx' && ( )}
@@ -268,7 +277,7 @@ export function App() { jsxOutput} {activeTab === 'maily' && parentTab === 'jsx' && ( this.transformNode(child)), }; @@ -142,23 +142,31 @@ export class Transformer { } private isColumnsNode(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; return ( node?.type === 'row' && - node?.attributes?.className?.includes('tab-row-full') + (attrs?.className?.includes('tab-row-full') || + attrs?.id === 'maily-columns') ); } private isColumnNode(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; + return ( node?.type === 'column' && - node?.attributes?.className?.includes('tab-col-full') + (attrs?.className?.includes('tab-col-full') || + attrs?.id === 'maily-column') ); } private isColumnSection(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; + return ( node?.type === 'section' && - node?.attributes?.className?.includes('tab-pad') + (attrs?.className?.includes('tab-pad') || + attrs?.id === 'maily-col-section') ); } @@ -176,12 +184,58 @@ export class Transformer { }; } + private isSectionNode(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; + return node?.type === 'row' && attrs?.id === 'maily-section'; + } + + private section(node: ParsedNode): JSONContent { + const firstColumnNode = node?.children[0]; + const attrs = firstColumnNode?.attributes || {}; + + const style = firstColumnNode?.attributes?.style || {}; + const padding = style?.paddingTop || 0; + const margin = style?.marginTop || 0; + const align = attrs?.align || 'left'; + + return { + type: 'section', + attrs: { + align, + + paddingTop: padding, + paddingRight: padding, + paddingBottom: padding, + paddingLeft: padding, + + marginTop: margin, + marginRight: margin, + marginBottom: margin, + marginLeft: margin, + + borderWidth: style?.borderWidth || 0, + borderColor: style?.borderColor || 'transparent', + borderRadius: style?.borderRadius || 0, + + backgroundColor: style?.backgroundColor || 'transparent', + }, + content: firstColumnNode?.children.map((child) => + this.transformNode(child) + ), + }; + } + private row(node: ParsedNode): JSONContent { const isColumnsNode = this.isColumnsNode(node); if (isColumnsNode) { return this.columns(node); } + const isSectionNode = this.isSectionNode(node); + if (isSectionNode) { + return this.section(node); + } + return { type: 'row', }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b0e2d2fe..9db4d68e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,7 +34,7 @@ importers: version: link:packages/tsconfig tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3)(jiti@2.4.0)(postcss@8.4.47)(typescript@5.6.3)(yaml@2.4.2) + version: 8.3.0(@swc/core@1.9.3)(jiti@2.4.0)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.4.2) turbo: specifier: latest version: 1.13.3 @@ -140,7 +140,7 @@ importers: devDependencies: '@tiptap/core': specifier: ^2.9.1 - version: 2.9.1(@tiptap/pm@2.9.1) + version: 2.9.1(@tiptap/pm@2.10.3) '@types/node': specifier: ^22 version: 22.5.4 @@ -185,7 +185,7 @@ importers: version: link:../../packages/transformer '@tailwindcss/vite': specifier: 4.0.0-beta.2 - version: 4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) + version: 4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.49)(yaml@2.4.2))(postcss@8.4.49)(svelte@5.2.12)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) acorn: specifier: ^8.14.0 version: 8.14.0 @@ -219,7 +219,7 @@ importers: version: 18.3.1 '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.7.1(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) + version: 3.7.2(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1)) globals: specifier: ^15.11.0 version: 15.12.0 @@ -228,7 +228,7 @@ importers: version: 5.6.3 typescript-eslint: specifier: ^8.11.0 - version: 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + version: 8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) vite: specifier: ^5.4.10 version: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) @@ -245,80 +245,80 @@ importers: specifier: ^1.1.0 version: 1.1.0(@types/react@18.3.12)(react@18.3.1) '@radix-ui/react-tooltip': - specifier: ^1.1.3 - version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/core': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/pm@2.10.3) '@tiptap/extension-color': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/extension-text-style@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/extension-text-style@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))) '@tiptap/extension-document': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/extension-dropcursor': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) '@tiptap/extension-focus': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) '@tiptap/extension-heading': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/extension-horizontal-rule': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) '@tiptap/extension-image': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/extension-link': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) '@tiptap/extension-list-item': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/extension-mention': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(@tiptap/suggestion@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)(@tiptap/suggestion@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)) '@tiptap/extension-paragraph': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/extension-placeholder': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) '@tiptap/extension-text-align': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/extension-text-style': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/extension-underline': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) '@tiptap/pm': - specifier: ^2.9.1 - version: 2.9.1 + specifier: ^2.10.3 + version: 2.10.3 '@tiptap/react': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^2.9.1 - version: 2.9.1 + specifier: ^2.10.3 + version: 2.10.3 '@tiptap/suggestion': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) clsx: specifier: ^2.1.1 version: 2.1.1 echo-drag-handle-plugin: specifier: ^0.0.2 - version: 0.0.2(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(y-prosemirror@1.2.12(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20)) + version: 0.0.2(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)(y-prosemirror@1.2.12(prosemirror-model@1.24.0)(prosemirror-state@1.4.3)(prosemirror-view@1.37.0)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20)) fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 lucide-react: - specifier: ^0.453.0 - version: 0.453.0(react@18.3.1) + specifier: ^0.462.0 + version: 0.462.0(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -326,17 +326,17 @@ importers: specifier: ^5.6.1 version: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: - specifier: ^2.5.4 - version: 2.5.4 + specifier: ^2.5.5 + version: 2.5.5 tailwindcss: - specifier: ^3.4.14 - version: 3.4.14 + specifier: ^3.4.15 + version: 3.4.15 tippy.js: specifier: ^6.3.7 version: 6.3.7 uuid: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^11.0.3 + version: 11.0.3 devDependencies: '@types/react': specifier: ^18.3.12 @@ -345,8 +345,8 @@ importers: specifier: ^10.0.0 version: 10.0.0 postcss: - specifier: ^8.4.47 - version: 8.4.47 + specifier: ^8.4.49 + version: 8.4.49 tailwind-config: specifier: workspace:* version: link:../tailwind-config @@ -354,17 +354,17 @@ importers: specifier: workspace:* version: link:../tsconfig typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.7.2 + version: 5.7.2 packages/render: dependencies: '@react-email/components': - specifier: ^0.0.25 - version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^0.0.28 + version: 0.0.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-email/render': - specifier: ^1.0.1 - version: 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.2 + version: 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -379,8 +379,8 @@ importers: specifier: ^7.25.9 version: 7.25.9(@babel/core@7.24.5) '@tiptap/core': - specifier: ^2.9.1 - version: 2.9.1(@tiptap/pm@2.9.1) + specifier: ^2.10.3 + version: 2.10.3(@tiptap/pm@2.10.3) '@types/react': specifier: ^18.3.12 version: 18.3.12 @@ -388,32 +388,32 @@ importers: specifier: workspace:* version: link:../tsconfig typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.7.2 + version: 5.7.2 packages/tailwind-config: devDependencies: '@tailwindcss/typography': specifier: ^0.5.15 - version: 0.5.15(tailwindcss@3.4.14) + version: 0.5.15(tailwindcss@3.4.15) autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.47) + version: 10.4.20(postcss@8.4.49) postcss: - specifier: ^8.4.47 - version: 8.4.47 + specifier: ^8.4.49 + version: 8.4.49 prettier: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.4.1 + version: 3.4.1 prettier-plugin-tailwindcss: - specifier: ^0.6.8 - version: 0.6.8(prettier@3.3.3) + specifier: ^0.6.9 + version: 0.6.9(prettier@3.4.1) tailwindcss: - specifier: ^3.4.14 - version: 3.4.14 + specifier: ^3.4.15 + version: 3.4.15 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.14) + version: 1.0.7(tailwindcss@3.4.15) packages/transformer: dependencies: @@ -428,8 +428,8 @@ importers: specifier: workspace:* version: link:../tsconfig typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.7.2 + version: 5.7.2 packages/tsconfig: {} @@ -1317,6 +1317,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-tooltip@1.1.4': + resolution: {integrity: sha512-QpObUH/ZlpaO4YgHSaYzrLO2VuO+ZBFFgGzjMUPwtiYnAzzNNDPJeEGRrT7qNOrWm/Jr08M1vlp+vTHtnSQ0Uw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: @@ -1392,14 +1405,14 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/button@0.0.17': - resolution: {integrity: sha512-ioHdsk+BpGS/PqjU6JS7tUrVy9yvbUx92Z+Cem2+MbYp55oEwQ9VHf7u4f5NoM0gdhfKSehBwRdYlHt/frEMcg==} + '@react-email/button@0.0.18': + resolution: {integrity: sha512-uNUnpeDzz1o9HAky47JSTsUN/Ih0A3Az165AAOgAy8XOVzQJPrltUBRzHkScSVJTwRqKLASkie1yZbtNGIcRdA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/code-block@0.0.9': - resolution: {integrity: sha512-Zrhc71VYrSC1fVXJuaViKoB/dBjxLw6nbE53Bm/eUuZPdnnZ1+ZUIh8jfaRKC5MzMjgnLGQTweGXVnfIrhyxtQ==} + '@react-email/code-block@0.0.10': + resolution: {integrity: sha512-xx4m5Ir1cSFbz1bhyZfETUW34iQg+WRLTItW7Qv2arnFr6Ec0u8AWi4lUUqkpmbXzeuY8U8lV+2awDerwRpW6g==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -1416,8 +1429,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/components@0.0.25': - resolution: {integrity: sha512-lnfVVrThEcET5NPoeaXvrz9UxtWpGRcut2a07dLbyKgNbP7vj/cXTI5TuHtanCvhCddFpMDnElNRghDOfPzwUg==} + '@react-email/components@0.0.28': + resolution: {integrity: sha512-90ayLWy1g2uqlZVcwonfq1oKUlAnQBUJ4iUnGXg0UuBPAeoqxSG1BFrVDmLSX0u5MG/wtmFPFPxhq+v8roq+sA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -1463,8 +1476,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/link@0.0.10': - resolution: {integrity: sha512-tva3wvAWSR10lMJa9fVA09yRn7pbEki0ZZpHE6GD1jKbFhmzt38VgLO9B797/prqoDZdAr4rVK7LJFcdPx3GwA==} + '@react-email/link@0.0.11': + resolution: {integrity: sha512-o1/BgPn2Fi+bN4Nh+P64t4tulaOyPhkBNSpNmiYL1Ar+ilw8q0BmUAqM+lvHy8Qr/4K7BjkgFoc4GoYkoEjOig==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -1488,27 +1501,27 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 - '@react-email/render@1.0.1': - resolution: {integrity: sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==} + '@react-email/render@1.0.2': + resolution: {integrity: sha512-q82eBd39TepzA/xjlm8szqJlrQk/gh7mgtxXMGlJ4dcdx89go1m9YBDpZY98SFy+2r2KAOd5A1mxvUbsPwoATg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/row@0.0.10': - resolution: {integrity: sha512-jPyEhG3gsLX+Eb9U+A30fh0gK6hXJwF4ghJ+ZtFQtlKAKqHX+eCpWlqB3Xschd/ARJLod8WAswg0FB+JD9d0/A==} + '@react-email/row@0.0.11': + resolution: {integrity: sha512-ra09h7BMoGa14ds3vh7KVuj1N3astTstEC1YbMdCiHcx/nxylglNaT7qJXU74ZTzyHiGabyiNuyabTS+HLoMCA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/section@0.0.14': - resolution: {integrity: sha512-+fYWLb4tPU1A/+GE5J1+SEMA7/wR3V30lQ+OR9t2kAJqNrARDbMx0bLnYnR1QL5TiFRz0pCF05SQUobk6gHEDQ==} + '@react-email/section@0.0.15': + resolution: {integrity: sha512-xfM3Qy5eU7fbkwvktlTeQgad7uo+1Z7YVh1aowSZaRBvKbkEXgoH/XssRYQmQL8ZrZGXbEJMujwtf4fsQL6vrg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/tailwind@0.1.0': - resolution: {integrity: sha512-qysVUEY+M3SKUvu35XDpzn7yokhqFOT3tPU6Mj/pgc62TL5tQFj6msEbBtwoKs2qO3WZvai0DIHdLhaOxBQSow==} + '@react-email/tailwind@1.0.2': + resolution: {integrity: sha512-P106AouxGQCCvapE5/HJT5rmNma+UJwG3A0MF6+4me7Usf+VNyJ5Jk0eSdsZ1zEfY3AbUSs+F7ql3oWztCg9nw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -1801,185 +1814,190 @@ packages: peerDependencies: react: ^18 || ^19 + '@tiptap/core@2.10.3': + resolution: {integrity: sha512-wAG/0/UsLeZLmshWb6rtWNXKJftcmnned91/HLccHVQAuQZ1UWH+wXeQKu/mtodxEO7JcU2mVPR9mLGQkK0McQ==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + '@tiptap/core@2.9.1': resolution: {integrity: sha512-tifnLL/ARzQ6/FGEJjVwj9UT3v+pENdWHdk9x6F3X0mB1y0SeCjV21wpFLYESzwNdBPAj8NMp8Behv7dBnhIfw==} peerDependencies: '@tiptap/pm': ^2.7.0 - '@tiptap/extension-blockquote@2.9.1': - resolution: {integrity: sha512-Y0jZxc/pdkvcsftmEZFyG+73um8xrx6/DMfgUcNg3JAM63CISedNcr+OEI11L0oFk1KFT7/aQ9996GM6Kubdqg==} + '@tiptap/extension-blockquote@2.10.3': + resolution: {integrity: sha512-u9Mq4r8KzoeGVT8ms6FQDIMN95dTh3TYcT7fZpwcVM96mIl2Oyt+Bk66mL8z4zuFptfRI57Cu9QdnHEeILd//w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bold@2.9.1': - resolution: {integrity: sha512-e2P1zGpnnt4+TyxTC5pX/lPxPasZcuHCYXY0iwQ3bf8qRQQEjDfj3X7EI+cXqILtnhOiviEOcYmeu5op2WhQDg==} + '@tiptap/extension-bold@2.10.3': + resolution: {integrity: sha512-xnF1tS2BsORenr11qyybW120gHaeHKiKq+ZOP14cGA0MsriKvWDnaCSocXP/xMEYHy7+2uUhJ0MsKkHVj4bPzQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bubble-menu@2.9.1': - resolution: {integrity: sha512-DWUF6NG08/bZDWw0jCeotSTvpkyqZTi4meJPomG9Wzs/Ol7mEwlNCsCViD999g0+IjyXFatBk4DfUq1YDDu++Q==} + '@tiptap/extension-bubble-menu@2.10.3': + resolution: {integrity: sha512-e9a4yMjQezuKy0rtyyzxbV2IAE1bm1PY3yoZEFrcaY0o47g1CMUn2Hwe+9As2HdntEjQpWR7NO1mZeKxHlBPYA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-bullet-list@2.9.1': - resolution: {integrity: sha512-0hizL/0j9PragJObjAWUVSuGhN1jKjCFnhLQVRxtx4HutcvS/lhoWMvFg6ZF8xqWgIa06n6A7MaknQkqhTdhKA==} + '@tiptap/extension-bullet-list@2.10.3': + resolution: {integrity: sha512-PTkwJOVlHi4RR4Wrs044tKMceweXwNmWA6EoQ93hPUVtQcwQL990Es5Izp+i88twTPLuGD9dH+o9QDyH9SkWdA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-code-block@2.9.1': - resolution: {integrity: sha512-A/50wPWDqEUUUPhrwRKILP5gXMO5UlQ0F6uBRGYB9CEVOREam9yIgvONOnZVJtszHqOayjIVMXbH/JMBeq11/g==} + '@tiptap/extension-code-block@2.10.3': + resolution: {integrity: sha512-yiDVNg22fYkzsFk5kBlDSHcjwVJgajvO/M5fDXA+Hfxwo2oNcG6aJyyHXFe+UaXTVjdkPej0J6kcMKrTMCiFug==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code@2.9.1': - resolution: {integrity: sha512-WQqcVGe7i/E+yO3wz5XQteU1ETNZ00euUEl4ylVVmH2NM4Dh0KDjEhbhHlCM0iCfLUo7jhjC7dmS+hMdPUb+Tg==} + '@tiptap/extension-code@2.10.3': + resolution: {integrity: sha512-JyLbfyY3cPctq9sVdpcRWTcoUOoq3/MnGE1eP6eBNyMTHyBPcM9TPhOkgj+xkD1zW/884jfelB+wa70RT/AMxQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-color@2.9.1': - resolution: {integrity: sha512-9h4FcCDenOmr8x8/Vfzg9PBYrgXIXTi2x8JiaTbrQX+Ufea1SMx+Ko/Vowp7SGMnBAsB+sXkTVhAhiXDQbtWcQ==} + '@tiptap/extension-color@2.10.3': + resolution: {integrity: sha512-FC2hPMSQ4w9UmO9kJCAdoU7gHpDbJ6MeJAmikB9EPp16dbGwFLrZm9TZ/4pv74fGfVm0lv720316ALOEgPEDjQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/extension-text-style': ^2.7.0 - '@tiptap/extension-document@2.9.1': - resolution: {integrity: sha512-1a+HCoDPnBttjqExfYLwfABq8MYdiowhy/wp8eCxVb6KGFEENO53KapstISvPzqH7eOi+qRjBB1KtVYb/ZXicg==} + '@tiptap/extension-document@2.10.3': + resolution: {integrity: sha512-6i8+xbS2zB6t8iFzli1O/QB01MmwyI5Hqiiv4m5lOxqavmJwLss2sRhoMC2hB3CyFg5UmeODy/f/RnI6q5Vixg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-dropcursor@2.9.1': - resolution: {integrity: sha512-wJZspSmJRkDBtPkzFz1g7gvZOEOayk8s93UHsgbJxcV4VWHYleZ5XhT74sZunSjefNDm3qC6v2BSgLp3vNHVKQ==} + '@tiptap/extension-dropcursor@2.10.3': + resolution: {integrity: sha512-wzWf82ixWzZQr0hxcf/A0ul8NNxgy1N63O+c56st6OomoLuKUJWOXF+cs9O7V+/5rZKWdbdYYoRB5QLvnDBAlQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-floating-menu@2.9.1': - resolution: {integrity: sha512-MxZ7acNNsoNaKpetxfwi3Z11Bgrh0T2EJlCV77v9N1vWK38+st3H1WJanmLbPNtc2ocvhHJrz+DjDz3CWxQ9rQ==} + '@tiptap/extension-floating-menu@2.10.3': + resolution: {integrity: sha512-Prg8rYLxeyzHxfzVu1mDkkUWMnD9ZN3y370O/1qy55e+XKVw9jFkTSuz0y0+OhMJG6bulYpDUMtb+N3+2xOWlQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-focus@2.9.1': - resolution: {integrity: sha512-I2uSrn0xMNSbvM/DdCWQn4qY3F0nypbwKvZJlYrj6vKtoKCeif/TcQB3wZbArXe9h5WUNTgGs2liFzhlDAKfVw==} + '@tiptap/extension-focus@2.10.3': + resolution: {integrity: sha512-/zJHmngINGaJ3uHxOVXi2hmDTh5kuJKy0E5pLMokcaAICmyr1u+7Zq6ltKS2Hwmo4AQ2Dl6Hcr1IIMEHXo6Y8g==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-gapcursor@2.9.1': - resolution: {integrity: sha512-jsRBmX01vr+5H02GljiHMo0n5H1vzoMLmFarxe0Yq2d2l9G/WV2VWX2XnGliqZAYWd1bI0phs7uLQIN3mxGQTw==} + '@tiptap/extension-gapcursor@2.10.3': + resolution: {integrity: sha512-FskZi2DqDSTH1WkgLF2OLy0xU7qj3AgHsKhVsryeAtld4jAK5EsonneWgaipbz0e/MxuIvc1oyacfZKABpLaNg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.9.1': - resolution: {integrity: sha512-fCuaOD/b7nDjm47PZ58oanq7y4ccS2wjPh42Qm0B0yipu/1fmC8eS1SmaXmk28F89BLtuL6uOCtR1spe+lZtlQ==} + '@tiptap/extension-hard-break@2.10.3': + resolution: {integrity: sha512-2rFlimUKAgKDwT6nqAMtPBjkrknQY8S7oBNyIcDOUGyFkvbDUl3Jd0PiC929S5F3XStJRppnMqhpNDAlWmvBLA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-heading@2.9.1': - resolution: {integrity: sha512-SjZowzLixOFaCrV2cMaWi1mp8REK0zK1b3OcVx7bCZfVSmsOETJyrAIUpCKA8o60NwF7pwhBg0MN8oXlNKMeFw==} + '@tiptap/extension-heading@2.10.3': + resolution: {integrity: sha512-AlxXXPCWIvw8hQUDFRskasj32iMNB8Sb19VgyFWqwvntGs2/UffNu8VdsVqxD2HpZ0g5rLYCYtSW4wigs9R3og==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-history@2.9.1': - resolution: {integrity: sha512-wp9qR1NM+LpvyLZFmdNaAkDq0d4jDJ7z7Fz7icFQPu31NVxfQYO3IXNmvJDCNu8hFAbImpA5aG8MBuwzRo0H9w==} + '@tiptap/extension-history@2.10.3': + resolution: {integrity: sha512-HaSiMdx9Im9Pb9qGlVud7W8bweRDRMez33Uzs5a2x0n1RWkelfH7TwYs41Y3wus8Ujs7kw6qh7jyhvPpQBKaSA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-horizontal-rule@2.9.1': - resolution: {integrity: sha512-ydUhABeaBI1CoJp+/BBqPhXINfesp1qMNL/jiDcMsB66fsD4nOyphpAJT7FaRFZFtQVF06+nttBtFZVkITQVqg==} + '@tiptap/extension-horizontal-rule@2.10.3': + resolution: {integrity: sha512-1a2IWhD00tgUNg/91RLnBvfENL7DLCui5L245+smcaLu+OXOOEpoBHawx59/M4hEpsjqvRRM79TzO9YXfopsPw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-image@2.9.1': - resolution: {integrity: sha512-aGqJnsuS8oagIhsx7wetm8jw4NEDsOV0OSx4FQ4VPlUqWlnzK0N+erFKKJmXTdAxL8PGzoPSlITFH63MV3eV3Q==} + '@tiptap/extension-image@2.10.3': + resolution: {integrity: sha512-YIjAF5CwDkMe28OQ5pvnmdRgbJ9JcGMIHY1kyqNunSf2iwphK+6SWz9UEIkDFiT7AsRZySqxFSq93iK1XyTifw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-italic@2.9.1': - resolution: {integrity: sha512-VkNA6Vz96+/+7uBlsgM7bDXXx4b62T1fDam/3UKifA72aD/fZckeWrbT7KrtdUbzuIniJSbA0lpTs5FY29+86Q==} + '@tiptap/extension-italic@2.10.3': + resolution: {integrity: sha512-wAiO6ZxoHx2H90phnKttLWGPjPZXrfKxhOCsqYrK8BpRByhr48godOFRuGwYnKaiwoVjpxc63t+kDJDWvqmgMw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-link@2.9.1': - resolution: {integrity: sha512-yG+e3e8cCCN9dZjX4ttEe3e2xhh58ryi3REJV4MdiEkOT9QF75Bl5pUbMIS4tQ8HkOr04QBFMHKM12kbSxg1BA==} + '@tiptap/extension-link@2.10.3': + resolution: {integrity: sha512-8esKlkZBzEiNcpt7I8Cd6l1mWmCc/66pPbUq9LfnIniDXE3U+ahBf4m3TJltYFBGbiiTR/xqMtJyVHOpuLDtAw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-list-item@2.9.1': - resolution: {integrity: sha512-6O4NtYNR5N2Txi4AC0/4xMRJq9xd4+7ShxCZCDVL0WDVX37IhaqMO7LGQtA6MVlYyNaX4W1swfdJaqrJJ5HIUw==} + '@tiptap/extension-list-item@2.10.3': + resolution: {integrity: sha512-9sok81gvZfSta2K1Dwrq5/HSz1jk4zHBpFqCx0oydzodGslx6X1bNxdca+eXJpXZmQIWALK7zEr4X8kg3WZsgw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-mention@2.9.1': - resolution: {integrity: sha512-2IzunpivdNtDNdtAXwRiQbNhTm87zrbkhz1cCE+2y9pWiX1QLXyx0HQq/DIAjxp6v7y4sIh+5UTUTFlH7vD9wQ==} + '@tiptap/extension-mention@2.10.3': + resolution: {integrity: sha512-h0+BrTS2HdjMfsuy6zkFIqmVGYL8w3jIG0gYaDHjWwwe/Lf2BDgOu3bZWcSr/3bKiJIwwzpOJrXssqta4TZ0yQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 '@tiptap/suggestion': ^2.7.0 - '@tiptap/extension-ordered-list@2.9.1': - resolution: {integrity: sha512-6J9jtv1XP8dW7/JNSH/K4yiOABc92tBJtgCsgP8Ep4+fjfjdj4HbjS1oSPWpgItucF2Fp/VF8qg55HXhjxHjTw==} + '@tiptap/extension-ordered-list@2.10.3': + resolution: {integrity: sha512-/SFuEDnbJxy3jvi72LeyiPHWkV+uFc0LUHTUHSh20vwyy+tLrzncJfXohGbTIv5YxYhzExQYZDRD4VbSghKdlw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-paragraph@2.9.1': - resolution: {integrity: sha512-JOmT0xd4gd3lIhLwrsjw8lV+ZFROKZdIxLi0Ia05XSu4RLrrvWj0zdKMSB+V87xOWfSB3Epo95zAvnPox5Q16A==} + '@tiptap/extension-paragraph@2.10.3': + resolution: {integrity: sha512-sNkTX/iN+YoleDiTJsrWSBw9D7c4vsYwnW5y/G5ydfuJMIRQMF78pWSIWZFDRNOMkgK5UHkhu9anrbCFYgBfaA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-placeholder@2.9.1': - resolution: {integrity: sha512-Q/w3OOg/C6jGBf4QKEWKF9k+iaCQCgPoaIg2IDTPx8QmaxRfgoVE5Csd+oTOY/brdmSNXOxykZWEci6OJP+MbA==} + '@tiptap/extension-placeholder@2.10.3': + resolution: {integrity: sha512-0OkwnDLguZgoiJM85cfnOySuMmPUF7qqw7DHQ+c3zwTAYnvzpvqrvpupc+2Zi9GfC1sDgr+Ajrp8imBHa6PHfA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-strike@2.9.1': - resolution: {integrity: sha512-V5aEXdML+YojlPhastcu7w4biDPwmzy/fWq0T2qjfu5Te/THcqDmGYVBKESBm5x6nBy5OLkanw2O+KHu2quDdg==} + '@tiptap/extension-strike@2.10.3': + resolution: {integrity: sha512-jYoPy6F6njYp3txF3u23bgdRy/S5ATcWDO9LPZLHSeikwQfJ47nqb+EUNo5M8jIOgFBTn4MEbhuZ6OGyhnxopA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-align@2.9.1': - resolution: {integrity: sha512-oUp0XnwJpAImcOVV68vsY2CpkHpRZ3gzWfIRTuy+aYitQim3xDKis/qfWQUWZsANp9/TZ0VyjtkZxNMwOfcu1g==} + '@tiptap/extension-text-align@2.10.3': + resolution: {integrity: sha512-g75sNl73gtgjP3XIcl06kvv1qw3c0rGEUD848rUU1bvlBpU3IxjkcQLgYvHmv3vpuUp9cKUkA2wa7Sv6R3fjvw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-style@2.9.1': - resolution: {integrity: sha512-LAxc0SeeiPiAVBwksczeA7BJSZb6WtVpYhy5Esvy9K0mK5kttB4KxtnXWeQzMIJZQbza65yftGKfQlexf/Y7yg==} + '@tiptap/extension-text-style@2.10.3': + resolution: {integrity: sha512-TalYIdlF7vBA4afFhmido7AORdBbu3sV+HCByda0FiNbM6cjng3Nr9oxHOCVJy+ChqrcgF4m54zDfLmamdyu5Q==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text@2.9.1': - resolution: {integrity: sha512-3wo9uCrkLVLQFgbw2eFU37QAa1jq1/7oExa+FF/DVxdtHRS9E2rnUZ8s2hat/IWzvPUHXMwo3Zg2XfhoamQpCA==} + '@tiptap/extension-text@2.10.3': + resolution: {integrity: sha512-7p9XiRprsRZm8y9jvF/sS929FCELJ5N9FQnbzikOiyGNUx5mdI+exVZlfvBr9xOD5s7fBLg6jj9Vs0fXPNRkPg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-underline@2.9.1': - resolution: {integrity: sha512-IrUsIqKPgD7GcAjr4D+RC0WvLHUDBTMkD8uPNEoeD1uH9t9zFyDfMRPnx/z3/6Gf6fTh3HzLcHGibiW2HiMi2A==} + '@tiptap/extension-underline@2.10.3': + resolution: {integrity: sha512-VeGs0jeNiTnXddHHJEgOc/sKljZiyTEgSSuqMmsBACrr9aGFXbLTgKTvNjkZ9WzSnu7LwgJuBrwEhg8yYixUyQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/pm@2.9.1': - resolution: {integrity: sha512-mvV86fr7kEuDYEApQ2uMPCKL2uagUE0BsXiyyz3KOkY1zifyVm1fzdkscb24Qy1GmLzWAIIihA+3UHNRgYdOlQ==} + '@tiptap/pm@2.10.3': + resolution: {integrity: sha512-771p53aU0KFvujvKpngvq2uAxThlEsjYaXcVVmwrhf0vxSSg+psKQEvqvWvHv/3BwkPVCGwmEKNVJZjaXFKu4g==} - '@tiptap/react@2.9.1': - resolution: {integrity: sha512-LQJ34ZPfXtJF36SZdcn4Fiwsl2WxZ9YRJI87OLnsjJ45O+gV/PfBzz/4ap+LF8LOS0AbbGhTTjBOelPoNm+aYA==} + '@tiptap/react@2.10.3': + resolution: {integrity: sha512-5GBL3arWai8WZuCl1MMA7bT5aWwqDi5AOQhX+hovKjwHvttpKDogRoUBL5k6Eds/eQMBMGTpsfmZlGNiFxSv1g==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.9.1': - resolution: {integrity: sha512-nsw6UF/7wDpPfHRhtGOwkj1ipIEiWZS1VGw+c14K61vM1CNj0uQ4jogbHwHZqN1dlL5Hh+FCqUHDPxG6ECbijg==} + '@tiptap/starter-kit@2.10.3': + resolution: {integrity: sha512-oq8xdVIMqohSs91ofHSr7i5dCp2F56Lb9aYIAI25lZmwNwQJL2geGOYjMSfL0IC4cQHPylIuSKYCg7vRFdZmAA==} - '@tiptap/suggestion@2.9.1': - resolution: {integrity: sha512-MMxwpbtocxUsbmc8qtFY1AQYNTW5i/M4aNSv9zsKKRISaS5hMD7XVrw2eod0x0yEqZU3izLiPDZPmgr8glF+jQ==} + '@tiptap/suggestion@2.10.3': + resolution: {integrity: sha512-ReEwiPQoDTXn3RuWnj9D7Aod9dbNQz0QAoLRftWUTdbj3O2ohbvTNX6tlcfS+7x48Q+fAALiJGpp5BtctODlsA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 @@ -1993,6 +2011,15 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/node@22.5.4': resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} @@ -2029,8 +2056,8 @@ packages: '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + '@typescript-eslint/eslint-plugin@8.16.0': + resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -2040,8 +2067,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + '@typescript-eslint/parser@8.16.0': + resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2050,12 +2077,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + '@typescript-eslint/scope-manager@8.16.0': + resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + '@typescript-eslint/type-utils@8.16.0': + resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2064,12 +2091,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + '@typescript-eslint/types@8.16.0': + resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + '@typescript-eslint/typescript-estree@8.16.0': + resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2077,8 +2104,8 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.16.0': + resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2087,14 +2114,14 @@ packages: typescript: optional: true - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + '@typescript-eslint/visitor-keys@8.16.0': + resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-react-swc@3.7.1': - resolution: {integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==} + '@vitejs/plugin-react-swc@3.7.2': + resolution: {integrity: sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==} peerDependencies: - vite: ^4 || ^5 + vite: ^4 || ^5 || ^6 '@vitest/expect@2.1.3': resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==} @@ -2481,8 +2508,8 @@ packages: jiti: optional: true - esm-env@1.1.4: - resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} + esm-env@1.2.1: + resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} espree@10.2.0: resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} @@ -2492,8 +2519,8 @@ packages: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} - esrap@1.2.2: - resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + esrap@1.2.3: + resolution: {integrity: sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -2723,6 +2750,10 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + jiti@2.4.0: resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==} hasBin: true @@ -2904,6 +2935,11 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + lucide-react@0.462.0: + resolution: {integrity: sha512-NTL7EbAao9IFtuSivSZgrAh4fZd09Lr+6MTkqIxuHaH2nnYiYIzXPo06cOxHg9wKLdj6LL8TByG4qpePqwgx/g==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} @@ -2935,6 +2971,10 @@ packages: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2950,10 +2990,6 @@ packages: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.1: - resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -3174,6 +3210,12 @@ packages: peerDependencies: postcss: ^8.2.14 + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} @@ -3182,6 +3224,10 @@ packages: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -3193,12 +3239,16 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-tailwindcss@0.6.8: - resolution: {integrity: sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==} + prettier-plugin-tailwindcss@0.6.9: + resolution: {integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -3257,6 +3307,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.4.1: + resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} + engines: {node: '>=14'} + hasBin: true + prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} @@ -3274,8 +3329,8 @@ packages: prosemirror-collab@1.3.1: resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} - prosemirror-commands@1.6.1: - resolution: {integrity: sha512-tNy4uaGWzvuUYXDke7B28krndIrdQJhSh0OLpubtwtEwFbjItOj/eoAfPvstBJyyV0S2+b5t4G+4XPXdxar6pg==} + prosemirror-commands@1.6.2: + resolution: {integrity: sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==} prosemirror-dropcursor@1.8.1: resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} @@ -3292,14 +3347,14 @@ packages: prosemirror-keymap@1.2.2: resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} - prosemirror-markdown@1.13.0: - resolution: {integrity: sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g==} + prosemirror-markdown@1.13.1: + resolution: {integrity: sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==} prosemirror-menu@1.2.4: resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} - prosemirror-model@1.22.3: - resolution: {integrity: sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==} + prosemirror-model@1.24.0: + resolution: {integrity: sha512-Ft7epNnycoQSM+2ObF35SBbBX+5WY39v8amVlrtlAcpglhlHs2tCTnWl7RX5tbp/PsMKcRcWV9cXPuoBWq0AIQ==} prosemirror-schema-basic@1.2.3: resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} @@ -3310,8 +3365,8 @@ packages: prosemirror-state@1.4.3: resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} - prosemirror-tables@1.5.0: - resolution: {integrity: sha512-VMx4zlYWm7aBlZ5xtfJHpqa3Xgu3b7srV54fXYnXgsAcIGRqKSrhiK3f89omzzgaAgAtDOV4ImXnLKhVfheVNQ==} + prosemirror-tables@1.6.1: + resolution: {integrity: sha512-p8WRJNA96jaNQjhJolmbxTzd6M4huRE5xQ8OxjvMhQUP0Nzpo4zz6TztEiwk6aoqGBhz9lxRWR1yRZLlpQN98w==} prosemirror-trailing-node@3.0.0: resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} @@ -3323,8 +3378,8 @@ packages: prosemirror-transform@1.10.2: resolution: {integrity: sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==} - prosemirror-view@1.34.3: - resolution: {integrity: sha512-mKZ54PrX19sSaQye+sef+YjBbNu2voNwLS1ivb6aD2IRmxRGW64HU9B644+7OfJStGLyxvOreKqEgfvXa91WIA==} + prosemirror-view@1.37.0: + resolution: {integrity: sha512-z2nkKI1sJzyi7T47Ji/ewBPuIma1RNvQCCYVdV+MqWBV7o4Sa1n94UJCJJ1aQRF/xRkFfyqLGlGFWitIcCOtbg==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -3617,13 +3672,16 @@ packages: typescript: optional: true - svelte@5.2.7: - resolution: {integrity: sha512-cEhPGuLHiH2+Z8B1FwQgiZJgA39uUmJR4516TKrM5zrp0/cuwJkfhUfcTxhAkznanAF5fXUKzvYR4o+Ksx3ZCQ==} + svelte@5.2.12: + resolution: {integrity: sha512-lcrJVygO05nzQkgRLxaz3qd0kamyhujfpCxalzzKabJUueVrnpc0bhHgR2hUa/335XvOHO39wtc79C72g+5ftw==} engines: {node: '>=18'} tailwind-merge@2.5.4: resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} + tailwind-merge@2.5.5: + resolution: {integrity: sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==} + tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: @@ -3634,6 +3692,11 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tailwindcss@3.4.15: + resolution: {integrity: sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==} + engines: {node: '>=14.0.0'} + hasBin: true + tailwindcss@4.0.0-beta.2: resolution: {integrity: sha512-uZ+vgVsy6i18Glc3XYMkTq7dl4GsU4m8X8qRTVlU4+g8Uit7g+wttwfDCl3p+ZOq5KCB09th9XgVDx1zFLCeHA==} @@ -3766,8 +3829,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.15.0: - resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} + typescript-eslint@8.16.0: + resolution: {integrity: sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3781,6 +3844,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -3824,8 +3892,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + uuid@11.0.3: + resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} hasBin: true vite-node@2.1.3: @@ -4977,7 +5045,7 @@ snapshots: '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-tooltip@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) @@ -5101,11 +5169,11 @@ snapshots: dependencies: react: 18.3.1 - '@react-email/button@0.0.17(react@18.3.1)': + '@react-email/button@0.0.18(react@18.3.1)': dependencies: react: 18.3.1 - '@react-email/code-block@0.0.9(react@18.3.1)': + '@react-email/code-block@0.0.10(react@18.3.1)': dependencies: prismjs: 1.29.0 react: 18.3.1 @@ -5118,11 +5186,11 @@ snapshots: dependencies: react: 18.3.1 - '@react-email/components@0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-email/components@0.0.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-email/body': 0.0.10(react@18.3.1) - '@react-email/button': 0.0.17(react@18.3.1) - '@react-email/code-block': 0.0.9(react@18.3.1) + '@react-email/button': 0.0.18(react@18.3.1) + '@react-email/code-block': 0.0.10(react@18.3.1) '@react-email/code-inline': 0.0.4(react@18.3.1) '@react-email/column': 0.0.12(react@18.3.1) '@react-email/container': 0.0.14(react@18.3.1) @@ -5132,13 +5200,13 @@ snapshots: '@react-email/hr': 0.0.10(react@18.3.1) '@react-email/html': 0.0.10(react@18.3.1) '@react-email/img': 0.0.10(react@18.3.1) - '@react-email/link': 0.0.10(react@18.3.1) + '@react-email/link': 0.0.11(react@18.3.1) '@react-email/markdown': 0.0.12(react@18.3.1) '@react-email/preview': 0.0.11(react@18.3.1) - '@react-email/render': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-email/row': 0.0.10(react@18.3.1) - '@react-email/section': 0.0.14(react@18.3.1) - '@react-email/tailwind': 0.1.0(react@18.3.1) + '@react-email/render': 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/row': 0.0.11(react@18.3.1) + '@react-email/section': 0.0.15(react@18.3.1) + '@react-email/tailwind': 1.0.2(react@18.3.1) '@react-email/text': 0.0.10(react@18.3.1) react: 18.3.1 transitivePeerDependencies: @@ -5172,7 +5240,7 @@ snapshots: dependencies: react: 18.3.1 - '@react-email/link@0.0.10(react@18.3.1)': + '@react-email/link@0.0.11(react@18.3.1)': dependencies: react: 18.3.1 @@ -5193,7 +5261,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-promise-suspense: 0.3.4 - '@react-email/render@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-email/render@1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: html-to-text: 9.0.5 js-beautify: 1.15.1 @@ -5201,15 +5269,15 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-promise-suspense: 0.3.4 - '@react-email/row@0.0.10(react@18.3.1)': + '@react-email/row@0.0.11(react@18.3.1)': dependencies: react: 18.3.1 - '@react-email/section@0.0.14(react@18.3.1)': + '@react-email/section@0.0.15(react@18.3.1)': dependencies: react: 18.3.1 - '@react-email/tailwind@0.1.0(react@18.3.1)': + '@react-email/tailwind@1.0.2(react@18.3.1)': dependencies: react: 18.3.1 @@ -5430,20 +5498,20 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.0.0-beta.2 '@tailwindcss/oxide-win32-x64-msvc': 4.0.0-beta.2 - '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14)': + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.15)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.14 + tailwindcss: 3.4.15 - '@tailwindcss/vite@4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1))': + '@tailwindcss/vite@4.0.0-beta.2(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.49)(yaml@2.4.2))(postcss@8.4.49)(svelte@5.2.12)(typescript@5.6.3)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1))': dependencies: '@tailwindcss/node': 4.0.0-beta.2 '@tailwindcss/oxide': 4.0.0-beta.2 lightningcss: 1.28.1 - svelte-preprocess: 6.0.3(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3) + svelte-preprocess: 6.0.3(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.49)(yaml@2.4.2))(postcss@8.4.49)(svelte@5.2.12)(typescript@5.6.3) tailwindcss: 4.0.0-beta.2 vite: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) transitivePeerDependencies: @@ -5466,203 +5534,207 @@ snapshots: '@tanstack/query-core': 5.59.13 react: 18.3.1 - '@tiptap/core@2.9.1(@tiptap/pm@2.9.1)': + '@tiptap/core@2.10.3(@tiptap/pm@2.10.3)': + dependencies: + '@tiptap/pm': 2.10.3 + + '@tiptap/core@2.9.1(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/pm': 2.9.1 + '@tiptap/pm': 2.10.3 - '@tiptap/extension-blockquote@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-blockquote@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-bold@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-bold@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-bubble-menu@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-bubble-menu@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-bullet-list@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-code-block@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-code-block@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 - '@tiptap/extension-code@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-code@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-color@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/extension-text-style@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)))': + '@tiptap/extension-color@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/extension-text-style@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/extension-text-style': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/extension-text-style': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) - '@tiptap/extension-document@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-document@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-dropcursor@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-dropcursor@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 - '@tiptap/extension-floating-menu@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-floating-menu@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 tippy.js: 6.3.7 - '@tiptap/extension-focus@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-focus@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 - '@tiptap/extension-gapcursor@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-gapcursor@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 - '@tiptap/extension-hard-break@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-hard-break@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-heading@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-heading@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-history@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-history@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 - '@tiptap/extension-horizontal-rule@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-horizontal-rule@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 - '@tiptap/extension-image@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-image@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-italic@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-italic@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-link@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-link@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 linkifyjs: 4.1.3 - '@tiptap/extension-list-item@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-list-item@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-mention@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(@tiptap/suggestion@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1))': + '@tiptap/extension-mention@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)(@tiptap/suggestion@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 - '@tiptap/suggestion': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 + '@tiptap/suggestion': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) - '@tiptap/extension-ordered-list@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-ordered-list@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-paragraph@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-paragraph@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-placeholder@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-placeholder@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 - '@tiptap/extension-strike@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-strike@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-text-align@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-text-align@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-text-style@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-text-style@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-text@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-text@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/extension-underline@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-underline@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) - '@tiptap/pm@2.9.1': + '@tiptap/pm@2.10.3': dependencies: prosemirror-changeset: 2.2.1 prosemirror-collab: 1.3.1 - prosemirror-commands: 1.6.1 + prosemirror-commands: 1.6.2 prosemirror-dropcursor: 1.8.1 prosemirror-gapcursor: 1.3.2 prosemirror-history: 1.4.1 prosemirror-inputrules: 1.4.0 prosemirror-keymap: 1.2.2 - prosemirror-markdown: 1.13.0 + prosemirror-markdown: 1.13.1 prosemirror-menu: 1.2.4 - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-schema-basic: 1.2.3 prosemirror-schema-list: 1.4.1 prosemirror-state: 1.4.3 - prosemirror-tables: 1.5.0 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3) + prosemirror-tables: 1.6.1 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.24.0)(prosemirror-state@1.4.3)(prosemirror-view@1.37.0) prosemirror-transform: 1.10.2 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 - '@tiptap/react@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/extension-bubble-menu': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-floating-menu': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/extension-bubble-menu': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) + '@tiptap/extension-floating-menu': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - '@tiptap/starter-kit@2.9.1': - dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/extension-blockquote': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-bold': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-bullet-list': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-code': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-code-block': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-document': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-dropcursor': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-gapcursor': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-hard-break': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-heading': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-history': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-horizontal-rule': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-italic': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-list-item': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-ordered-list': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-paragraph': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-strike': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-text': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-text-style': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/pm': 2.9.1 - - '@tiptap/suggestion@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': - dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/starter-kit@2.10.3': + dependencies: + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/extension-blockquote': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-bold': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-bullet-list': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-code': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-code-block': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) + '@tiptap/extension-document': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-dropcursor': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) + '@tiptap/extension-gapcursor': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) + '@tiptap/extension-hard-break': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-heading': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-history': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) + '@tiptap/extension-horizontal-rule': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3) + '@tiptap/extension-italic': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-list-item': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-ordered-list': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-paragraph': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-strike': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-text': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/extension-text-style': 2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3)) + '@tiptap/pm': 2.10.3 + + '@tiptap/suggestion@2.10.3(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)': + dependencies: + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 '@types/estree@1.0.5': {} @@ -5670,6 +5742,15 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + '@types/node@22.5.4': dependencies: undici-types: 6.19.8 @@ -5708,14 +5789,14 @@ snapshots: dependencies: '@types/node': 22.7.7 - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/parser': 8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/type-utils': 8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 eslint: 9.13.0(jiti@2.4.0) graphemer: 1.4.0 ignore: 5.3.1 @@ -5726,12 +5807,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/parser@8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 eslint: 9.13.0(jiti@2.4.0) optionalDependencies: @@ -5739,15 +5820,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.15.0': + '@typescript-eslint/scope-manager@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/type-utils@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) debug: 4.3.7 eslint: 9.13.0(jiti@2.4.0) ts-api-utils: 1.4.0(typescript@5.6.3) @@ -5756,12 +5837,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.16.0': {} - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -5773,24 +5854,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/utils@8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.4.0)) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) eslint: 9.13.0(jiti@2.4.0) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.15.0': + '@typescript-eslint/visitor-keys@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-react-swc@3.7.1(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1))': + '@vitejs/plugin-react-swc@3.7.2(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1))': dependencies: '@swc/core': 1.9.3(@swc/helpers@0.5.5) vite: 5.4.11(@types/node@22.7.7)(lightningcss@1.28.1) @@ -5905,6 +5986,16 @@ snapshots: postcss: 8.4.47 postcss-value-parser: 4.2.0 + autoprefixer@10.4.20(postcss@8.4.49): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001658 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + axobject-query@4.1.0: {} balanced-match@1.0.2: {} @@ -6084,12 +6175,12 @@ snapshots: eastasianwidth@0.2.0: {} - echo-drag-handle-plugin@0.0.2(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(y-prosemirror@1.2.12(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20)): + echo-drag-handle-plugin@0.0.2(@tiptap/core@2.10.3(@tiptap/pm@2.10.3))(@tiptap/pm@2.10.3)(y-prosemirror@1.2.12(prosemirror-model@1.24.0)(prosemirror-state@1.4.3)(prosemirror-view@1.37.0)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20)): dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.10.3(@tiptap/pm@2.10.3) + '@tiptap/pm': 2.10.3 tippy.js: 6.3.7 - y-prosemirror: 1.2.12(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20) + y-prosemirror: 1.2.12(prosemirror-model@1.24.0)(prosemirror-state@1.4.3)(prosemirror-view@1.37.0)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20) editorconfig@1.0.4: dependencies: @@ -6221,7 +6312,7 @@ snapshots: transitivePeerDependencies: - supports-color - esm-env@1.1.4: {} + esm-env@1.2.1: {} espree@10.2.0: dependencies: @@ -6233,7 +6324,7 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@1.2.2: + esrap@1.2.3: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 @@ -6272,7 +6363,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -6450,6 +6541,8 @@ snapshots: jiti@1.21.0: {} + jiti@1.21.6: {} + jiti@2.4.0: {} joycon@3.1.1: {} @@ -6584,6 +6677,10 @@ snapshots: dependencies: react: 18.3.1 + lucide-react@0.462.0(react@18.3.1): + dependencies: + react: 18.3.1 + magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -6615,6 +6712,11 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mimic-fn@2.1.0: {} minimatch@3.1.2: @@ -6629,8 +6731,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minipass@7.1.1: {} - minipass@7.1.2: {} minizlib@3.0.1: @@ -6758,7 +6858,7 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 - minipass: 7.1.1 + minipass: 7.1.2 pathe@1.1.2: {} @@ -6778,46 +6878,43 @@ snapshots: pirates@4.0.6: {} - postcss-import@15.1.0(postcss@8.4.47): + postcss-import@15.1.0(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.47): + postcss-js@4.0.1(postcss@8.4.49): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.47 + postcss: 8.4.49 - postcss-load-config@4.0.2(postcss@8.4.47): + postcss-load-config@4.0.2(postcss@8.4.49): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: - postcss: 8.4.47 - - postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47): - dependencies: - lilconfig: 3.1.1 - optionalDependencies: - jiti: 2.4.0 - postcss: 8.4.47 - optional: true + postcss: 8.4.49 - postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2): + postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.49)(yaml@2.4.2): dependencies: lilconfig: 3.1.1 optionalDependencies: jiti: 2.4.0 - postcss: 8.4.47 + postcss: 8.4.49 yaml: 2.4.2 - postcss-nested@6.0.1(postcss@8.4.47): + postcss-nested@6.0.1(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-selector-parser: 6.0.16 + postcss-nested@6.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 @@ -6828,6 +6925,11 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -6842,14 +6944,22 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.6.8(prettier@3.3.3): + prettier-plugin-tailwindcss@0.6.9(prettier@3.4.1): dependencies: - prettier: 3.3.3 + prettier: 3.4.1 prettier@3.3.3: {} + prettier@3.4.1: {} + prismjs@1.29.0: {} proc-log@5.0.0: {} @@ -6868,9 +6978,9 @@ snapshots: dependencies: prosemirror-state: 1.4.3 - prosemirror-commands@1.6.1: + prosemirror-commands@1.6.2: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 @@ -6878,20 +6988,20 @@ snapshots: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 prosemirror-gapcursor@1.3.2: dependencies: prosemirror-keymap: 1.2.2 - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-state: 1.4.3 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 prosemirror-history@1.4.1: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 rope-sequence: 1.3.4 prosemirror-inputrules@1.4.0: @@ -6904,61 +7014,62 @@ snapshots: prosemirror-state: 1.4.3 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.0: + prosemirror-markdown@1.13.1: dependencies: + '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-menu@1.2.4: dependencies: crelt: 1.0.6 - prosemirror-commands: 1.6.1 + prosemirror-commands: 1.6.2 prosemirror-history: 1.4.1 prosemirror-state: 1.4.3 - prosemirror-model@1.22.3: + prosemirror-model@1.24.0: dependencies: orderedmap: 2.1.1 prosemirror-schema-basic@1.2.3: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-schema-list@1.4.1: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 prosemirror-state@1.4.3: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-transform: 1.10.2 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 - prosemirror-tables@1.5.0: + prosemirror-tables@1.6.1: dependencies: prosemirror-keymap: 1.2.2 - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3): + prosemirror-trailing-node@3.0.0(prosemirror-model@1.24.0)(prosemirror-state@1.4.3)(prosemirror-view@1.37.0): dependencies: '@remirror/core-constants': 3.0.0 escape-string-regexp: 4.0.0 - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-state: 1.4.3 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 prosemirror-transform@1.10.2: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 - prosemirror-view@1.34.3: + prosemirror-view@1.37.0: dependencies: - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 @@ -7230,16 +7341,16 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-preprocess@6.0.3(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47))(postcss@8.4.47)(svelte@5.2.7)(typescript@5.6.3): + svelte-preprocess@6.0.3(@babel/core@7.24.5)(postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.49)(yaml@2.4.2))(postcss@8.4.49)(svelte@5.2.12)(typescript@5.6.3): dependencies: - svelte: 5.2.7 + svelte: 5.2.12 optionalDependencies: '@babel/core': 7.24.5 - postcss: 8.4.47 - postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.47) + postcss: 8.4.49 + postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.49)(yaml@2.4.2) typescript: 5.6.3 - svelte@5.2.7: + svelte@5.2.12: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -7248,8 +7359,8 @@ snapshots: acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - esm-env: 1.1.4 - esrap: 1.2.2 + esm-env: 1.2.1 + esrap: 1.2.3 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.12 @@ -7257,9 +7368,11 @@ snapshots: tailwind-merge@2.5.4: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.14): + tailwind-merge@2.5.5: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.15): dependencies: - tailwindcss: 3.4.14 + tailwindcss: 3.4.15 tailwindcss@3.4.14: dependencies: @@ -7277,17 +7390,44 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.47 - postcss-import: 15.1.0(postcss@8.4.47) - postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47) - postcss-nested: 6.0.1(postcss@8.4.47) + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.0.1(postcss@8.4.49) postcss-selector-parser: 6.0.16 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node + tailwindcss@3.4.15: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tailwindcss@4.0.0-beta.2: {} tapable@2.2.1: {} @@ -7352,7 +7492,7 @@ snapshots: tslib@2.6.2: {} - tsup@8.3.0(@swc/core@1.9.3)(jiti@2.4.0)(postcss@8.4.47)(typescript@5.6.3)(yaml@2.4.2): + tsup@8.3.0(@swc/core@1.9.3)(jiti@2.4.0)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.4.2): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) cac: 6.7.14 @@ -7363,7 +7503,7 @@ snapshots: execa: 5.1.1 joycon: 3.1.1 picocolors: 1.0.1 - postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.47)(yaml@2.4.2) + postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.49)(yaml@2.4.2) resolve-from: 5.0.0 rollup: 4.24.0 source-map: 0.8.0-beta.0 @@ -7372,8 +7512,8 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.9.3(@swc/helpers@0.5.5) - postcss: 8.4.47 - typescript: 5.6.3 + postcss: 8.4.49 + typescript: 5.7.2 transitivePeerDependencies: - jiti - supports-color @@ -7411,11 +7551,11 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3): + typescript-eslint@8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/parser': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/parser': 8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.13.0(jiti@2.4.0))(typescript@5.6.3) eslint: 9.13.0(jiti@2.4.0) optionalDependencies: typescript: 5.6.3 @@ -7424,6 +7564,8 @@ snapshots: typescript@5.6.3: {} + typescript@5.7.2: {} + uc.micro@2.1.0: {} undici-types@6.19.8: {} @@ -7474,7 +7616,7 @@ snapshots: util-deprecate@1.0.2: {} - uuid@10.0.0: {} + uuid@11.0.3: {} vite-node@2.1.3(@types/node@22.7.7)(lightningcss@1.28.1): dependencies: @@ -7496,7 +7638,7 @@ snapshots: vite@5.4.11(@types/node@22.7.7)(lightningcss@1.28.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 + postcss: 8.4.49 rollup: 4.24.0 optionalDependencies: '@types/node': 22.7.7 @@ -7506,7 +7648,7 @@ snapshots: vite@5.4.9(@types/node@22.7.7)(lightningcss@1.28.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 + postcss: 8.4.49 rollup: 4.24.0 optionalDependencies: '@types/node': 22.7.7 @@ -7601,12 +7743,12 @@ snapshots: ws@8.17.0: {} - y-prosemirror@1.2.12(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.34.3)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20): + y-prosemirror@1.2.12(prosemirror-model@1.24.0)(prosemirror-state@1.4.3)(prosemirror-view@1.37.0)(y-protocols@1.0.6(yjs@13.6.20))(yjs@13.6.20): dependencies: lib0: 0.2.98 - prosemirror-model: 1.22.3 + prosemirror-model: 1.24.0 prosemirror-state: 1.4.3 - prosemirror-view: 1.34.3 + prosemirror-view: 1.37.0 y-protocols: 1.0.6(yjs@13.6.20) yjs: 13.6.20 From b8129e588427d11d97013db1cb67ced2dfa44694 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 12:55:57 +0600 Subject: [PATCH 16/24] fix: type error --- apps/web/components/editor-preview.tsx | 4 ++-- apps/web/stores/editor-store.tsx | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/web/components/editor-preview.tsx b/apps/web/components/editor-preview.tsx index 410db03c..06e92cfd 100644 --- a/apps/web/components/editor-preview.tsx +++ b/apps/web/components/editor-preview.tsx @@ -1,10 +1,10 @@ 'use client'; import { useCallback, useEffect, useState } from 'react'; -import type { EditorProps } from '@maily-to/core'; +import type { EditorProps, MailyEditor } from '@maily-to/core'; import { Editor } from '@maily-to/core'; import { Loader2, X } from 'lucide-react'; -import type { Editor as TiptapEditor, JSONContent } from '@tiptap/core'; +import type { JSONContent } from '@tiptap/core'; import { useEditorContext } from '@/stores/editor-store'; import { cn } from '@/utils/classname'; import { Input } from './ui/input'; diff --git a/apps/web/stores/editor-store.tsx b/apps/web/stores/editor-store.tsx index df35cd75..af052d80 100644 --- a/apps/web/stores/editor-store.tsx +++ b/apps/web/stores/editor-store.tsx @@ -1,13 +1,14 @@ 'use client'; +import { MailyEditor } from '@maily-to/core'; +import { JSONContent } from '@tiptap/core'; import type { PropsWithChildren } from 'react'; import { createContext, useContext, useRef } from 'react'; -import type { Editor as TiptapEditor, JSONContent } from '@tiptap/core'; import { createStore } from 'zustand'; import { useStoreWithEqualityFn } from 'zustand/traditional'; interface EditorProps { - editor?: TiptapEditor; + editor?: MailyEditor; json: JSONContent; previewText: string; @@ -24,7 +25,7 @@ interface EditorProps { } interface EditorState extends EditorProps { - setEditor: (editor: TiptapEditor | undefined) => void; + setEditor: (editor: MailyEditor | undefined) => void; setJson: (json: JSONContent) => void; setPreviewText: (previewText: string) => void; From 01447dbfaa0db53ad63aeff8d65449845ddf1e7c Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 13:00:13 +0600 Subject: [PATCH 17/24] fix: build error --- apps/web/package.json | 4 ++-- pnpm-lock.yaml | 30 +++++------------------------- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index bb448c32..bf82c4a0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -36,7 +36,7 @@ "resend": "^4.0.0", "sonner": "^1.5.0", "tailwind-merge": "^2.5.4", - "tailwindcss": "^3.4.14", + "tailwindcss": "^3.4.15", "zod": "^3.23.8", "zustand": "^5.0.0" }, @@ -47,7 +47,7 @@ "@types/react": "18.3.11", "@types/react-dom": "18.3.1", "autoprefixer": "^10.4.20", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "supabase": "^1.204.3", "tailwind-config": "workspace:*", "tsconfig": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9db4d68e..c982284c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,8 +129,8 @@ importers: specifier: ^2.5.4 version: 2.5.4 tailwindcss: - specifier: ^3.4.14 - version: 3.4.14 + specifier: ^3.4.15 + version: 3.4.15 zod: specifier: ^3.23.8 version: 3.23.8 @@ -155,10 +155,10 @@ importers: version: 18.3.1 autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.47) + version: 10.4.20(postcss@8.4.49) postcss: - specifier: ^8.4.47 - version: 8.4.47 + specifier: ^8.4.49 + version: 8.4.49 supabase: specifier: ^1.204.3 version: 1.204.3 @@ -3235,10 +3235,6 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.49: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} @@ -5976,16 +5972,6 @@ snapshots: assertion-error@2.0.1: {} - autoprefixer@10.4.20(postcss@8.4.47): - dependencies: - browserslist: 4.23.3 - caniuse-lite: 1.0.30001658 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.47 - postcss-value-parser: 4.2.0 - autoprefixer@10.4.20(postcss@8.4.49): dependencies: browserslist: 4.23.3 @@ -6938,12 +6924,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.4.47: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.4.49: dependencies: nanoid: 3.3.7 From 7cf56a9a011933b775e48b71364593611491944f Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 13:43:15 +0600 Subject: [PATCH 18/24] wip: footer, button and section --- apps/web-transformer/src/app.tsx | 2 +- packages/render/src/maily.tsx | 2 + packages/transformer/src/transformer.ts | 90 +++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/apps/web-transformer/src/app.tsx b/apps/web-transformer/src/app.tsx index 65fe2f30..6c50af9e 100644 --- a/apps/web-transformer/src/app.tsx +++ b/apps/web-transformer/src/app.tsx @@ -277,7 +277,7 @@ export function App() { jsxOutput} {activeTab === 'maily' && parentTab === 'jsx' && ( = { + sm: '8px', + md: '16px', + lg: '32px', + xl: '64px', +}; + export class Transformer { protected parser: Parser; @@ -50,6 +60,14 @@ export class Transformer { } private container(node: ParsedNode): JSONContent { + if (this.isSpacerNode(node)) { + return this.spacer(node); + } + + if (this.isButtonNode(node)) { + return this.button(node); + } + const attrs = node?.attributes || {}; const padding = attrs?.paddingTop || 0; const margin = attrs?.marginTop || 0; @@ -77,6 +95,62 @@ export class Transformer { }; } + private isSpacerNode(node: ParsedNode) { + const attrs = node?.attributes || {}; + return node?.type === 'container' && attrs?.id === 'maily-spacer'; + } + + private spacer(node: ParsedNode): JSONContent { + const attrs = node?.attributes || {}; + const height = attrs?.style?.height || '8px'; + + const heightKey = Object.keys(spacers).find((key) => + height.includes(spacers[key as AllowedSpacers]) + ); + + return { + type: 'spacer', + attrs: { + height: heightKey, + }, + }; + } + + private isButtonNode(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; + return node?.type === 'container' && attrs?.id === 'maily-button'; + } + + private button(node: ParsedNode): JSONContent { + const attrs = node?.attributes || {}; + const style = attrs?.style || {}; + const textAlign = style?.textAlign || 'left'; + + const buttonContainer = node.children[0]; + const buttonStyle = buttonContainer?.attributes?.style || {}; + + const textNode = buttonContainer.children[0]; + + return { + type: 'button', + attrs: { + text: textNode?.text || '', + url: buttonContainer?.attributes?.href || '', + + alignment: textAlign, + + color: buttonStyle?.color || '#000000', + + borderWidth: buttonStyle?.borderWidth || 0, + borderColor: buttonStyle?.borderColor || 'transparent', + borderRadius: buttonStyle?.borderRadius || 0, + borderStyle: buttonStyle?.borderStyle || 'solid', + + backgroundColor: buttonStyle?.backgroundColor || 'transparent', + }, + }; + } + private heading(node: ParsedNode): JSONContent { const attrs = node?.attributes || {}; const level = parseInt(attrs?.as?.replace('h', '') || 1); @@ -97,6 +171,18 @@ export class Transformer { }; } + private footer(node: ParsedNode): JSONContent { + return { + type: 'footer', + content: node.children.map((child) => this.transformNode(child)), + }; + } + + private isFooterNode(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; + return node?.type === 'paragraph' && attrs?.id === 'maily-footer'; + } + private img(node: ParsedNode): JSONContent { const attrs = node?.attributes || {}; @@ -117,6 +203,10 @@ export class Transformer { } private paragraph(node: ParsedNode): JSONContent { + if (this.isFooterNode(node)) { + return this.footer(node); + } + return { type: 'paragraph', content: node.children.map((child) => this.transformNode(child)), From 863075876f96c42287b82ad1ba42ba77166e8c0c Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 15:03:08 +0600 Subject: [PATCH 19/24] feat: jsx hydration and render markup --- packages/render/readme.md | 29 ++++ packages/transformer/src/transformer.ts | 178 +++++++++++++++++++++++- 2 files changed, 204 insertions(+), 3 deletions(-) diff --git a/packages/render/readme.md b/packages/render/readme.md index ad5689c5..f9185b03 100644 --- a/packages/render/readme.md +++ b/packages/render/readme.md @@ -106,6 +106,35 @@ maily.setPayloadValue('items', ['Alice', 'Bob', 'Charlie']); const html = await maily.render(); ``` +### React Email Markup + +You can use the `Maily` class to transform JSON content into React Email Markup. + +```ts +// (Omitted repeated imports) + +const maily = new Maily({ + type: 'doc', + content: [ + { + type: 'paragraph', + attrs: { textAlign: 'left' }, + content: [ + { + type: 'variable', + attrs: { + id: 'currentDate', + fallback: 'now', + }, + }, + ], + }, + ], +}); + +const markup = await maily.renderMarkup(); +``` + ## Contributions Feel free to submit pull requests, create issues, or spread the word. diff --git a/packages/transformer/src/transformer.ts b/packages/transformer/src/transformer.ts index 1dc7c78f..5fe2d1d0 100644 --- a/packages/transformer/src/transformer.ts +++ b/packages/transformer/src/transformer.ts @@ -24,6 +24,15 @@ const spacers: Record = { xl: '64px', }; +const allowedLogoSizes = ['sm', 'md', 'lg'] as const; +type AllowedLogoSizes = (typeof allowedLogoSizes)[number]; + +const logoSizes: Record = { + sm: '40px', + md: '48px', + lg: '64px', +}; + export class Transformer { protected parser: Parser; @@ -62,10 +71,12 @@ export class Transformer { private container(node: ParsedNode): JSONContent { if (this.isSpacerNode(node)) { return this.spacer(node); - } - - if (this.isButtonNode(node)) { + } else if (this.isButtonNode(node)) { return this.button(node); + } else if (this.isBulletListNode(node)) { + return this.bulletList(node); + } else if (this.isOrderedListNode(node)) { + return this.orderedList(node); } const attrs = node?.attributes || {}; @@ -184,6 +195,11 @@ export class Transformer { } private img(node: ParsedNode): JSONContent { + const isMailyImage = this.isImageNode(node); + const isMailyLogo = this.isLogoNode(node); + if (isMailyImage || isMailyLogo) { + return this.image(node); + } const attrs = node?.attributes || {}; return { @@ -196,6 +212,38 @@ export class Transformer { }; } + private image(node: ParsedNode): JSONContent { + const containerNode = node.children[0]; + const align = containerNode?.attributes?.align || 'left'; + + const imgNode = containerNode.children[0]; + + const attrs = imgNode?.attributes || {}; + const style = attrs?.style || {}; + + const width = + style?.maxWidth === '100%' ? null : parseFloat(style?.maxWidth || '0'); + const height = + style?.maxHeight === '100%' ? null : parseFloat(style?.maxHeight || '0'); + + const type = this.isImageNode(node) ? 'image' : 'logo'; + const size = Object.keys(logoSizes).find( + (key) => style?.width === logoSizes[key as AllowedLogoSizes] + ); + + return { + type, + attrs: { + alignment: align, + ...(width && { width }), + ...(height && { height }), + ...(type === 'logo' && { size }), + src: attrs?.src || '', + alt: attrs?.alt || '', + }, + }; + } + private hr(node: ParsedNode): JSONContent { return { type: 'horizontalRule', @@ -315,6 +363,14 @@ export class Transformer { }; } + private isImageNode(node: ParsedNode): boolean { + return node?.type === 'row' && node?.attributes?.id === 'maily-image'; + } + + private isLogoNode(node: ParsedNode): boolean { + return node?.type === 'row' && node?.attributes?.id === 'maily-logo'; + } + private row(node: ParsedNode): JSONContent { const isColumnsNode = this.isColumnsNode(node); if (isColumnsNode) { @@ -326,6 +382,12 @@ export class Transformer { return this.section(node); } + const isImageNode = this.isImageNode(node); + const isLogoNode = this.isLogoNode(node); + if (isImageNode || isLogoNode) { + return this.img(node); + } + return { type: 'row', }; @@ -353,4 +415,114 @@ export class Transformer { type: 'column', }; } + + private blockquote(node: ParsedNode): JSONContent { + return { + type: 'blockquote', + content: node.children.map((child) => this.transformNode(child)), + }; + } + + private code(node: ParsedNode): JSONContent { + const codeTextNode = node.children[0]; + + return { + type: 'text', + marks: [{ type: 'code' }], + text: codeTextNode?.text || '', + }; + } + + private isBulletListNode(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; + return node?.type === 'container' && attrs?.id === 'maily-bullet-list'; + } + + private isOrderedListNode(node: ParsedNode): boolean { + const attrs = node?.attributes || {}; + return node?.type === 'container' && attrs?.id === 'maily-ordered-list'; + } + + private bulletList(node: ParsedNode): JSONContent { + console.log('Node: ', node); + const bulletList = node.children[0]; + return { + type: 'bulletList', + content: bulletList.children.map((child) => this.transformNode(child)), + }; + } + + private orderedList(node: ParsedNode): JSONContent { + const orderedList = node.children[0]; + return { + type: 'orderedList', + content: orderedList.children.map((child) => this.transformNode(child)), + }; + } + + private li(node: ParsedNode): JSONContent { + return { + type: 'listItem', + content: node.children.map((child) => this.transformNode(child)), + }; + } } + +// { +// "type": "doc", +// "content": [ +// { +// "type": "bulletList", +// "content": [ +// { +// "type": "listItem", +// "attrs": { +// "color": null +// }, +// "content": [ +// { +// "type": "paragraph", +// "attrs": { +// "textAlign": "left" +// }, +// "content": [ +// { +// "type": "text", +// "text": "First Node" +// } +// ] +// } +// ] +// } +// ] +// }, +// { +// "type": "orderedList", +// "attrs": { +// "start": 1 +// }, +// "content": [ +// { +// "type": "listItem", +// "attrs": { +// "color": null +// }, +// "content": [ +// { +// "type": "paragraph", +// "attrs": { +// "textAlign": "left" +// }, +// "content": [ +// { +// "type": "text", +// "text": "Number List" +// } +// ] +// } +// ] +// } +// ] +// } +// ] +// } From 6c5b7b57a8a629314234db47638a7f1575e5ac66 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 15:17:02 +0600 Subject: [PATCH 20/24] fix: handle proper maily markup --- apps/web-transformer/src/app.tsx | 103 ++++++------------------ packages/transformer/src/transformer.ts | 36 ++++++--- 2 files changed, 51 insertions(+), 88 deletions(-) diff --git a/apps/web-transformer/src/app.tsx b/apps/web-transformer/src/app.tsx index 6c50af9e..1b19acac 100644 --- a/apps/web-transformer/src/app.tsx +++ b/apps/web-transformer/src/app.tsx @@ -10,95 +10,40 @@ import { Editor as Maily, type MailyEditor } from '@maily-to/core'; import { renderMarkup } from '@maily-to/render'; import { useRef } from 'react'; -const defaultCode = ` - + + + - -
- - First Column - -
-
- - -
- - Second Column - -
-
-
-
`; + This is just a normal paragraph + + + +`; export function App() { const [code, setCode] = useState(''); diff --git a/packages/transformer/src/transformer.ts b/packages/transformer/src/transformer.ts index 5fe2d1d0..1247cdee 100644 --- a/packages/transformer/src/transformer.ts +++ b/packages/transformer/src/transformer.ts @@ -42,13 +42,27 @@ export class Transformer { public async transform(content: string): Promise { const ast = await this.parser.parse(content); - const firstContainer = ast.children[0]; - // ignore the first container as it's the base root - // of Maily React markup - return this.transformNode({ - type: 'root', - children: firstContainer.children, - }); + const body = this.findBodyNode(ast); + if (!body) { + throw new Error('Not a valid Maily markup'); + } + + return this.transformNode(body); + } + + private findBodyNode(node: ParsedNode): ParsedNode | null { + if (node.type === 'body') { + return node; + } + + for (const child of node?.children || []) { + const bodyNode = this.findBodyNode(child); + if (bodyNode) { + return bodyNode; + } + } + + return null; } private transformNode(node: ParsedNode): JSONContent { @@ -61,10 +75,14 @@ export class Transformer { throw new Error(`Node type "${type}" is not supported`); } - private root(node: ParsedNode): JSONContent { + private body(node: ParsedNode): JSONContent { + // ignore the first container as it's the base root + // of Maily React markup + const container = node.children[0]; + return { type: 'doc', - content: node.children.map((child) => this.transformNode(child)), + content: container.children.map((child) => this.transformNode(child)), }; } From b6fec91594c59aa2b2228a679373c0991cdafe48 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sun, 1 Dec 2024 16:07:02 +0600 Subject: [PATCH 21/24] fix: hydrate button --- packages/transformer/src/transformer.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/transformer/src/transformer.ts b/packages/transformer/src/transformer.ts index 1247cdee..346773fe 100644 --- a/packages/transformer/src/transformer.ts +++ b/packages/transformer/src/transformer.ts @@ -160,6 +160,17 @@ export class Transformer { const textNode = buttonContainer.children[0]; + const borderRadius = buttonStyle?.borderRadius || '0px'; + const radius = + borderRadius === '0px' + ? 'sharp' + : borderRadius === '6px' + ? 'smooth' + : 'round'; + + const backgroundColor = buttonStyle?.backgroundColor || 'transparent'; + const variant = backgroundColor === 'transparent' ? 'outline' : 'filled'; + return { type: 'button', attrs: { @@ -172,9 +183,11 @@ export class Transformer { borderWidth: buttonStyle?.borderWidth || 0, borderColor: buttonStyle?.borderColor || 'transparent', - borderRadius: buttonStyle?.borderRadius || 0, borderStyle: buttonStyle?.borderStyle || 'solid', + borderRadius: radius, + variant, + backgroundColor: buttonStyle?.backgroundColor || 'transparent', }, }; From 1db1b7d479060f2cf809ae6dd9b5f14d4dd1cb3f Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Sat, 7 Dec 2024 11:53:19 +0600 Subject: [PATCH 22/24] feat: update to hydrate --- apps/web-transformer/package.json | 2 +- apps/web-transformer/src/app.tsx | 6 +- packages/{transformer => hydrate}/license | 0 .../{transformer => hydrate}/package.json | 8 +- packages/hydrate/readme.md | 126 ++++++++++++++++++ packages/hydrate/src/hydrate.ts | 6 + .../{transformer => hydrate}/src/index.ts | 3 +- .../{transformer => hydrate}/src/parser.ts | 0 .../src/transformer.ts | 63 +-------- .../{transformer => hydrate}/src/types.ts | 0 .../{transformer => hydrate}/tsconfig.json | 0 .../{transformer => hydrate}/tsup.config.ts | 0 packages/transformer/readme.md | 52 -------- pnpm-lock.yaml | 38 +++--- 14 files changed, 165 insertions(+), 139 deletions(-) rename packages/{transformer => hydrate}/license (100%) rename packages/{transformer => hydrate}/package.json (87%) create mode 100644 packages/hydrate/readme.md create mode 100644 packages/hydrate/src/hydrate.ts rename packages/{transformer => hydrate}/src/index.ts (75%) rename packages/{transformer => hydrate}/src/parser.ts (100%) rename packages/{transformer => hydrate}/src/transformer.ts (91%) rename packages/{transformer => hydrate}/src/types.ts (100%) rename packages/{transformer => hydrate}/tsconfig.json (100%) rename packages/{transformer => hydrate}/tsup.config.ts (100%) delete mode 100644 packages/transformer/readme.md diff --git a/apps/web-transformer/package.json b/apps/web-transformer/package.json index 1a792c2c..e09794eb 100644 --- a/apps/web-transformer/package.json +++ b/apps/web-transformer/package.json @@ -12,7 +12,7 @@ "dependencies": { "@maily-to/core": "workspace:*", "@maily-to/render": "workspace:*", - "@maily-to/transformer": "workspace:*", + "@maily-to/hydrate": "workspace:*", "@tailwindcss/vite": "4.0.0-beta.2", "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", diff --git a/apps/web-transformer/src/app.tsx b/apps/web-transformer/src/app.tsx index 1b19acac..31de96f0 100644 --- a/apps/web-transformer/src/app.tsx +++ b/apps/web-transformer/src/app.tsx @@ -5,7 +5,7 @@ import { highlight, languages } from 'prismjs'; import 'prismjs/components/prism-jsx'; import 'prismjs/themes/prism.css'; -import { Parser, Transformer } from '@maily-to/transformer'; +import { Parser, hydrate } from '@maily-to/hydrate'; import { Editor as Maily, type MailyEditor } from '@maily-to/core'; import { renderMarkup } from '@maily-to/render'; import { useRef } from 'react'; @@ -66,11 +66,9 @@ export function App() { const handleCodeChange = async (newCode: string) => { setCode(newCode); const parser = new Parser(); - const transformer = new Transformer(); - setParsedOutput(JSON.stringify(await parser.parse(newCode), null, 2)); - const mailyJSON = await transformer.transform(newCode); + const mailyJSON = await hydrate(newCode); setMailyJSONOutput(JSON.stringify(mailyJSON, null, 2)); setDefaultContent(mailyJSON); diff --git a/packages/transformer/license b/packages/hydrate/license similarity index 100% rename from packages/transformer/license rename to packages/hydrate/license diff --git a/packages/transformer/package.json b/packages/hydrate/package.json similarity index 87% rename from packages/transformer/package.json rename to packages/hydrate/package.json index d9c3113f..976c5c78 100644 --- a/packages/transformer/package.json +++ b/packages/hydrate/package.json @@ -1,8 +1,8 @@ { - "name": "@maily-to/transformer", + "name": "@maily-to/hydrate", "version": "0.0.1", "private": false, - "description": "A transformer that converts a React component to a Maily JSON object.", + "description": "Hydrate React Email to Maily JSON", "sideEffects": false, "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -35,12 +35,14 @@ "repository": { "type": "git", "url": "git+https://github.com/arikchakma/maily.to.git", - "directory": "packages/transformer" + "directory": "packages/hydrate" }, "author": "Arik Chakma ", "keywords": [ "maily.to", + "hydrate maily", "react", + "react email", "email" ], "engines": { diff --git a/packages/hydrate/readme.md b/packages/hydrate/readme.md new file mode 100644 index 00000000..8e19de24 --- /dev/null +++ b/packages/hydrate/readme.md @@ -0,0 +1,126 @@ +
+
+ +
@maily-to/hydrate
+
Transform React Email markup to Maily content.
+
+ +

+ + + + + Get Maily Editor + +

+ +
+ +## Install + +Install `@maily-to/hydrate` from your command line. + +```sh +pnpm add @maily-to/hydrate +``` + +## Getting started + +Transform JSX content into structured `ParsedNode` JSON. + +```ts +import { hydrate } from '@maily-to/hydrate'; + +const hydratedJSON = await hydrate( + ` + + +