Merge branch 'main' into hosted
This commit is contained in:
commit
dbbb29f0d1
@ -49,7 +49,7 @@ async def main():
|
|||||||
for filename in evals:
|
for filename in evals:
|
||||||
filepath = os.path.join(INPUT_DIR, filename)
|
filepath = os.path.join(INPUT_DIR, filename)
|
||||||
data_url = await image_to_data_url(filepath)
|
data_url = await image_to_data_url(filepath)
|
||||||
task = generate_code_core(data_url, "svg")
|
task = generate_code_core(data_url, "vue_tailwind")
|
||||||
tasks.append(task)
|
tasks.append(task)
|
||||||
|
|
||||||
results = await asyncio.gather(*tasks)
|
results = await asyncio.gather(*tasks)
|
||||||
|
|||||||
41
backend/poetry.lock
generated
41
backend/poetry.lock
generated
@ -2,20 +2,21 @@
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyio"
|
name = "anyio"
|
||||||
version = "4.1.0"
|
version = "4.2.0"
|
||||||
description = "High level compatibility layer for multiple asynchronous event loop implementations"
|
description = "High level compatibility layer for multiple asynchronous event loop implementations"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.8"
|
python-versions = ">=3.8"
|
||||||
files = [
|
files = [
|
||||||
{file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"},
|
{file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"},
|
||||||
{file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"},
|
{file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
|
exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
|
||||||
idna = ">=2.8"
|
idna = ">=2.8"
|
||||||
sniffio = ">=1.1"
|
sniffio = ">=1.1"
|
||||||
|
typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""}
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
|
doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
|
||||||
@ -82,14 +83,14 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "distro"
|
name = "distro"
|
||||||
version = "1.8.0"
|
version = "1.9.0"
|
||||||
description = "Distro - an OS platform information API"
|
description = "Distro - an OS platform information API"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
files = [
|
files = [
|
||||||
{file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"},
|
{file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"},
|
||||||
{file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"},
|
{file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -214,14 +215,14 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openai"
|
name = "openai"
|
||||||
version = "1.3.8"
|
version = "1.6.1"
|
||||||
description = "The official Python library for the openai API"
|
description = "The official Python library for the openai API"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7.1"
|
python-versions = ">=3.7.1"
|
||||||
files = [
|
files = [
|
||||||
{file = "openai-1.3.8-py3-none-any.whl", hash = "sha256:ac5a17352b96db862390d2e6f51de9f7eb32e733f412467b2f160fbd3d0f2609"},
|
{file = "openai-1.6.1-py3-none-any.whl", hash = "sha256:bc9f774838d67ac29fb24cdeb2d58faf57de8b311085dcd1348f7aa02a96c7ee"},
|
||||||
{file = "openai-1.3.8.tar.gz", hash = "sha256:54963ff247abe185aad6ee443820e48ad9f87eb4de970acb2514bc113ced748c"},
|
{file = "openai-1.6.1.tar.gz", hash = "sha256:d553ca9dbf9486b08e75b09e8671e4f638462aaadccfced632bf490fc3d75fa2"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@ -231,7 +232,7 @@ httpx = ">=0.23.0,<1"
|
|||||||
pydantic = ">=1.9.0,<3"
|
pydantic = ">=1.9.0,<3"
|
||||||
sniffio = "*"
|
sniffio = "*"
|
||||||
tqdm = ">4"
|
tqdm = ">4"
|
||||||
typing-extensions = ">=4.5,<5"
|
typing-extensions = ">=4.7,<5"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
|
datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
|
||||||
@ -319,14 +320,14 @@ email = ["email-validator (>=1.0.3)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest"
|
name = "pytest"
|
||||||
version = "7.4.3"
|
version = "7.4.4"
|
||||||
description = "pytest: simple powerful testing with Python"
|
description = "pytest: simple powerful testing with Python"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"},
|
{file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
|
||||||
{file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"},
|
{file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@ -357,14 +358,14 @@ cli = ["click (>=5.0)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sentry-sdk"
|
name = "sentry-sdk"
|
||||||
version = "1.38.0"
|
version = "1.39.1"
|
||||||
description = "Python client for Sentry (https://sentry.io)"
|
description = "Python client for Sentry (https://sentry.io)"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
files = [
|
files = [
|
||||||
{file = "sentry-sdk-1.38.0.tar.gz", hash = "sha256:8feab81de6bbf64f53279b085bd3820e3e737403b0a0d9317f73a2c3374ae359"},
|
{file = "sentry-sdk-1.39.1.tar.gz", hash = "sha256:320a55cdf9da9097a0bead239c35b7e61f53660ef9878861824fd6d9b2eaf3b5"},
|
||||||
{file = "sentry_sdk-1.38.0-py2.py3-none-any.whl", hash = "sha256:0017fa73b8ae2d4e57fd2522ee3df30453715b29d2692142793ec5d5f90b94a6"},
|
{file = "sentry_sdk-1.39.1-py2.py3-none-any.whl", hash = "sha256:81b5b9ffdd1a374e9eb0c053b5d2012155db9cbe76393a8585677b753bd5fdc1"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@ -508,14 +509,14 @@ zstd = ["zstandard (>=0.18.0)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "uvicorn"
|
name = "uvicorn"
|
||||||
version = "0.24.0.post1"
|
version = "0.25.0"
|
||||||
description = "The lightning-fast ASGI server."
|
description = "The lightning-fast ASGI server."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.8"
|
python-versions = ">=3.8"
|
||||||
files = [
|
files = [
|
||||||
{file = "uvicorn-0.24.0.post1-py3-none-any.whl", hash = "sha256:7c84fea70c619d4a710153482c0d230929af7bcf76c7bfa6de151f0a3a80121e"},
|
{file = "uvicorn-0.25.0-py3-none-any.whl", hash = "sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c"},
|
||||||
{file = "uvicorn-0.24.0.post1.tar.gz", hash = "sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e"},
|
{file = "uvicorn-0.25.0.tar.gz", hash = "sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@ -611,4 +612,4 @@ files = [
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.10"
|
python-versions = "^3.10"
|
||||||
content-hash = "07e65b672b446bcaa3d38e008354578908cb70466563f637937192d7167d15a2"
|
content-hash = "ce29c56f8cb6ba1d0480489da7ab123aa620a146d464b2904cef8b7bcef82a05"
|
||||||
|
|||||||
@ -15,6 +15,7 @@ from screenshot_system_prompts import (
|
|||||||
REACT_TAILWIND_SYSTEM_PROMPT,
|
REACT_TAILWIND_SYSTEM_PROMPT,
|
||||||
TAILWIND_SYSTEM_PROMPT,
|
TAILWIND_SYSTEM_PROMPT,
|
||||||
SVG_SYSTEM_PROMPT,
|
SVG_SYSTEM_PROMPT,
|
||||||
|
VUE_TAILWIND_SYSTEM_PROMPT,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -77,6 +78,8 @@ def assemble_prompt(
|
|||||||
system_content = BOOTSTRAP_SYSTEM_PROMPT
|
system_content = BOOTSTRAP_SYSTEM_PROMPT
|
||||||
elif generated_code_config == "ionic_tailwind":
|
elif generated_code_config == "ionic_tailwind":
|
||||||
system_content = IONIC_TAILWIND_SYSTEM_PROMPT
|
system_content = IONIC_TAILWIND_SYSTEM_PROMPT
|
||||||
|
elif generated_code_config == "vue_tailwind":
|
||||||
|
system_content = VUE_TAILWIND_SYSTEM_PROMPT
|
||||||
elif generated_code_config == "svg":
|
elif generated_code_config == "svg":
|
||||||
system_content = SVG_SYSTEM_PROMPT
|
system_content = SVG_SYSTEM_PROMPT
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -8,7 +8,7 @@ license = "MIT"
|
|||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.10"
|
python = "^3.10"
|
||||||
fastapi = "^0.95.0"
|
fastapi = "^0.95.0"
|
||||||
uvicorn = "^0.24.0.post1"
|
uvicorn = "^0.25.0"
|
||||||
websockets = "^12.0"
|
websockets = "^12.0"
|
||||||
openai = "^1.2.4"
|
openai = "^1.2.4"
|
||||||
python-dotenv = "^1.0.0"
|
python-dotenv = "^1.0.0"
|
||||||
|
|||||||
@ -111,6 +111,48 @@ Return only the full code in <html></html> tags.
|
|||||||
Do not include markdown "```" or "```html" at the start or end.
|
Do not include markdown "```" or "```html" at the start or end.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
VUE_TAILWIND_SYSTEM_PROMPT = """
|
||||||
|
You are an expert Vue/Tailwind developer
|
||||||
|
You take screenshots of a reference web page from the user, and then build single page apps
|
||||||
|
using Vue and Tailwind CSS.
|
||||||
|
You might also be given a screenshot(The second image) of a web page that you have already built, and asked to
|
||||||
|
update it to look more like the reference image(The first image).
|
||||||
|
|
||||||
|
- Make sure the app looks exactly like the screenshot.
|
||||||
|
- Pay close attention to background color, text color, font size, font family,
|
||||||
|
padding, margin, border, etc. Match the colors and sizes exactly.
|
||||||
|
- Use the exact text from the screenshot.
|
||||||
|
- Do not add comments in the code such as "<!-- Add other navigation links as needed -->" and "<!-- ... other news items ... -->" in place of writing the full code. WRITE THE FULL CODE.
|
||||||
|
- Repeat elements as needed to match the screenshot. For example, if there are 15 items, the code should have 15 items. DO NOT LEAVE comments like "<!-- Repeat for each news item -->" or bad things will happen.
|
||||||
|
- For images, use placeholder images from https://placehold.co and include a detailed description of the image in the alt text so that an image generation AI can generate the image later.
|
||||||
|
- Use Vue using the global build like so:
|
||||||
|
|
||||||
|
<div id="app">{{ message }}</div>
|
||||||
|
<script>
|
||||||
|
const { createApp, ref } = Vue
|
||||||
|
createApp({
|
||||||
|
setup() {
|
||||||
|
const message = ref('Hello vue!')
|
||||||
|
return {
|
||||||
|
message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).mount('#app')
|
||||||
|
</script>
|
||||||
|
|
||||||
|
In terms of libraries,
|
||||||
|
|
||||||
|
- Use these script to include Vue so that it can run on a standalone page:
|
||||||
|
<script src="https://registry.npmmirror.com/vue/3.3.11/files/dist/vue.global.js"></script>
|
||||||
|
- Use this script to include Tailwind: <script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
- You can use Google Fonts
|
||||||
|
- Font Awesome for icons: <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"></link>
|
||||||
|
|
||||||
|
Return only the full code in <html></html> tags.
|
||||||
|
Do not include markdown "```" or "```html" at the start or end.
|
||||||
|
The return result must only include the code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
SVG_SYSTEM_PROMPT = """
|
SVG_SYSTEM_PROMPT = """
|
||||||
You are an expert at building SVGs.
|
You are an expert at building SVGs.
|
||||||
|
|||||||
4
backend/start.py
Normal file
4
backend/start.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import uvicorn
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
uvicorn.run("main:app", port=7001, reload=True)
|
||||||
@ -113,6 +113,48 @@ Return only the full code in <html></html> tags.
|
|||||||
Do not include markdown "```" or "```html" at the start or end.
|
Do not include markdown "```" or "```html" at the start or end.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
VUE_TAILWIND_SYSTEM_PROMPT = """
|
||||||
|
You are an expert Vue/Tailwind developer
|
||||||
|
You take screenshots of a reference web page from the user, and then build single page apps
|
||||||
|
using Vue and Tailwind CSS.
|
||||||
|
You might also be given a screenshot(The second image) of a web page that you have already built, and asked to
|
||||||
|
update it to look more like the reference image(The first image).
|
||||||
|
|
||||||
|
- Make sure the app looks exactly like the screenshot.
|
||||||
|
- Pay close attention to background color, text color, font size, font family,
|
||||||
|
padding, margin, border, etc. Match the colors and sizes exactly.
|
||||||
|
- Use the exact text from the screenshot.
|
||||||
|
- Do not add comments in the code such as "<!-- Add other navigation links as needed -->" and "<!-- ... other news items ... -->" in place of writing the full code. WRITE THE FULL CODE.
|
||||||
|
- Repeat elements as needed to match the screenshot. For example, if there are 15 items, the code should have 15 items. DO NOT LEAVE comments like "<!-- Repeat for each news item -->" or bad things will happen.
|
||||||
|
- For images, use placeholder images from https://placehold.co and include a detailed description of the image in the alt text so that an image generation AI can generate the image later.
|
||||||
|
- Use Vue using the global build like so:
|
||||||
|
|
||||||
|
<div id="app">{{ message }}</div>
|
||||||
|
<script>
|
||||||
|
const { createApp, ref } = Vue
|
||||||
|
createApp({
|
||||||
|
setup() {
|
||||||
|
const message = ref('Hello vue!')
|
||||||
|
return {
|
||||||
|
message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).mount('#app')
|
||||||
|
</script>
|
||||||
|
|
||||||
|
In terms of libraries,
|
||||||
|
|
||||||
|
- Use these script to include Vue so that it can run on a standalone page:
|
||||||
|
<script src="https://registry.npmmirror.com/vue/3.3.11/files/dist/vue.global.js"></script>
|
||||||
|
- Use this script to include Tailwind: <script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
- You can use Google Fonts
|
||||||
|
- Font Awesome for icons: <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"></link>
|
||||||
|
|
||||||
|
Return only the full code in <html></html> tags.
|
||||||
|
Do not include markdown "```" or "```html" at the start or end.
|
||||||
|
The return result must only include the code.
|
||||||
|
"""
|
||||||
|
|
||||||
SVG_SYSTEM_PROMPT = """
|
SVG_SYSTEM_PROMPT = """
|
||||||
You are an expert at building SVGs.
|
You are an expert at building SVGs.
|
||||||
You take screenshots of a reference web page from the user, and then build a SVG that looks exactly like the screenshot.
|
You take screenshots of a reference web page from the user, and then build a SVG that looks exactly like the screenshot.
|
||||||
@ -257,6 +299,10 @@ def test_prompts():
|
|||||||
assert ionic_tailwind[0]["content"] == IONIC_TAILWIND_SYSTEM_PROMPT
|
assert ionic_tailwind[0]["content"] == IONIC_TAILWIND_SYSTEM_PROMPT
|
||||||
assert ionic_tailwind[1]["content"][2]["text"] == USER_PROMPT # type: ignore
|
assert ionic_tailwind[1]["content"][2]["text"] == USER_PROMPT # type: ignore
|
||||||
|
|
||||||
|
vue = assemble_prompt("image_data_url", "vue_tailwind", "result_image_data_url")
|
||||||
|
assert vue[0]["content"] == VUE_TAILWIND_SYSTEM_PROMPT
|
||||||
|
assert vue[1]["content"][2]["text"] == USER_PROMPT # type: ignore
|
||||||
|
|
||||||
svg_prompt = assemble_prompt("image_data_url", "svg", "result_image_data_url")
|
svg_prompt = assemble_prompt("image_data_url", "svg", "result_image_data_url")
|
||||||
assert svg_prompt[0]["content"] == SVG_SYSTEM_PROMPT
|
assert svg_prompt[0]["content"] == SVG_SYSTEM_PROMPT
|
||||||
assert svg_prompt[1]["content"][2]["text"] == SVG_USER_PROMPT # type: ignore
|
assert svg_prompt[1]["content"][2]["text"] == SVG_USER_PROMPT # type: ignore
|
||||||
|
|||||||
@ -180,7 +180,9 @@ function App({ navbarComponent }: Props) {
|
|||||||
generateCode(
|
generateCode(
|
||||||
wsRef,
|
wsRef,
|
||||||
updatedParams,
|
updatedParams,
|
||||||
|
// On change
|
||||||
(token) => setGeneratedCode((prev) => prev + token),
|
(token) => setGeneratedCode((prev) => prev + token),
|
||||||
|
// On set code
|
||||||
(code) => {
|
(code) => {
|
||||||
setGeneratedCode(code);
|
setGeneratedCode(code);
|
||||||
if (params.generationType === "create") {
|
if (params.generationType === "create") {
|
||||||
|
|||||||
@ -38,6 +38,13 @@ function generateDisplayComponent(config: GeneratedCodeConfig) {
|
|||||||
<span className="font-semibold">Tailwind</span>
|
<span className="font-semibold">Tailwind</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
case GeneratedCodeConfig.VUE_TAILWIND:
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<span className="font-semibold">Vue</span> +{" "}
|
||||||
|
<span className="font-semibold">Tailwind</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
case GeneratedCodeConfig.SVG:
|
case GeneratedCodeConfig.SVG:
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@ -92,6 +99,14 @@ function OutputSettingsSection({
|
|||||||
<SelectItem value={GeneratedCodeConfig.BOOTSTRAP}>
|
<SelectItem value={GeneratedCodeConfig.BOOTSTRAP}>
|
||||||
{generateDisplayComponent(GeneratedCodeConfig.BOOTSTRAP)}
|
{generateDisplayComponent(GeneratedCodeConfig.BOOTSTRAP)}
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
|
<SelectItem value={GeneratedCodeConfig.VUE_TAILWIND}>
|
||||||
|
<div className="flex items-center">
|
||||||
|
{generateDisplayComponent(GeneratedCodeConfig.VUE_TAILWIND)}
|
||||||
|
<Badge className="ml-2" variant="secondary">
|
||||||
|
Beta
|
||||||
|
</Badge>
|
||||||
|
</div>
|
||||||
|
</SelectItem>
|
||||||
<SelectItem value={GeneratedCodeConfig.IONIC_TAILWIND}>
|
<SelectItem value={GeneratedCodeConfig.IONIC_TAILWIND}>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
{generateDisplayComponent(GeneratedCodeConfig.IONIC_TAILWIND)}
|
{generateDisplayComponent(GeneratedCodeConfig.IONIC_TAILWIND)}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ export enum EditorTheme {
|
|||||||
export enum GeneratedCodeConfig {
|
export enum GeneratedCodeConfig {
|
||||||
HTML_TAILWIND = "html_tailwind",
|
HTML_TAILWIND = "html_tailwind",
|
||||||
REACT_TAILWIND = "react_tailwind",
|
REACT_TAILWIND = "react_tailwind",
|
||||||
|
VUE_TAILWIND = "vue_tailwind",
|
||||||
BOOTSTRAP = "bootstrap",
|
BOOTSTRAP = "bootstrap",
|
||||||
IONIC_TAILWIND = "ionic_tailwind",
|
IONIC_TAILWIND = "ionic_tailwind",
|
||||||
SVG = "svg",
|
SVG = "svg",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user