Skip to content

Commit af9acc0

Browse files
committed
init
0 parents  commit af9acc0

File tree

11 files changed

+1177
-0
lines changed

11 files changed

+1177
-0
lines changed

.envrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
use asdf
2+
layout poetry
3+

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
__pycache__
2+
.idea

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.PHONY dev:
2+
litestar run --reload --reload-dir=.

app.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from pathlib import Path
2+
3+
from jinjax import Catalog
4+
from litestar import get, Litestar
5+
from litestar import post
6+
from litestar.config.compression import CompressionConfig
7+
from litestar.config.cors import CORSConfig
8+
from litestar.config.csrf import CSRFConfig
9+
from litestar.contrib.htmx.request import HTMXRequest
10+
from litestar.contrib.jinja import JinjaTemplateEngine
11+
from litestar.enums import MediaType
12+
from litestar.response import Response, Template
13+
from litestar.template.config import TemplateConfig
14+
15+
catalog = Catalog()
16+
catalog.add_folder("components")
17+
18+
compression_config = (CompressionConfig(backend="gzip", gzip_compress_level=9),)
19+
cors_config = CORSConfig(allow_origins=["*"])
20+
csrf_config = CSRFConfig(secret="my-secret")
21+
22+
23+
def render(*args, **kwargs) -> Response:
24+
return Response(content=catalog.render(*args, **kwargs), media_type=MediaType.HTML)
25+
26+
27+
@get(path="/")
28+
async def index() -> Response:
29+
return render("Welcome", message="Litestar + JinjaX with Tailwind+Flowbite example")
30+
31+
32+
#
33+
@post(path="/feedback", exclude_from_csrf=True)
34+
async def feedback(request: HTMXRequest) -> Response:
35+
message = "Feedback from HTMX and JinjaX components"
36+
return render("Feedback", message=message)
37+
38+
39+
@post(path="/feedback2", exclude_from_csrf=True)
40+
async def feedback2(request: HTMXRequest) -> Template:
41+
message = "Feedback from HTMX and Jinja2 tmplates"
42+
return Template(template_name="feedback.jinja2", context={"message": message})
43+
44+
45+
#
46+
app = Litestar(
47+
route_handlers=[index, feedback, feedback2],
48+
debug=True,
49+
csrf_config=csrf_config,
50+
cors_config=cors_config,
51+
compression_config=CompressionConfig(backend="gzip", gzip_compress_level=9),
52+
template_config=TemplateConfig(
53+
engine=JinjaTemplateEngine,
54+
directory=Path("templates"),
55+
),
56+
)

components/ContactForm.jinja

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<form class="max-w-sm mx-auto">
2+
<div class="mb-5">
3+
<label for="email" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Your email</label>
4+
<input type="email" id="email"
5+
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
6+
placeholder="[email protected]" required>
7+
</div>
8+
<div class="mb-5">
9+
<label for="password" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Your password</label>
10+
<input type="password" id="password"
11+
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
12+
required>
13+
</div>
14+
<div class="flex items-start mb-5">
15+
<div class="flex items-center h-5">
16+
<input id="remember" type="checkbox" value=""
17+
class="w-4 h-4 border border-gray-300 rounded bg-gray-50 focus:ring-3 focus:ring-blue-300 dark:bg-gray-700 dark:border-gray-600 dark:focus:ring-blue-600 dark:ring-offset-gray-800 dark:focus:ring-offset-gray-800"
18+
required>
19+
</div>
20+
<label for="remember" class="ms-2 text-sm font-medium text-gray-900 dark:text-gray-300">Remember me</label>
21+
</div>
22+
<button type="submit"
23+
class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">Submit</button>
24+
</form>

components/Feedback.jinja

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{#def message = "HI!" #}
2+
<h4 class="text-red-500 font-bold">{{message}}!</h4>

components/Layout.jinja

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{#def title #}
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
5+
<head>
6+
<meta charset="UTF-8">
7+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
8+
<title>{{ title }}</title>
9+
<script defer src="//cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
10+
<script src="//cdn.tailwindcss.com"></script>
11+
<link href="//cdnjs.cloudflare.com/ajax/libs/flowbite/2.2.1/flowbite.min.css" rel="stylesheet" />
12+
<script src="https://unpkg.com/[email protected]" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous"></script>
13+
14+
</head>
15+
16+
<body class="bg-gray-800 text-yellow-500">
17+
{{ content }}
18+
</body>
19+
20+
</html>

components/Welcome.jinja

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{#def title = "Untitled", message #}
2+
3+
<Layout title=title>
4+
<h1 class="text-4xl">
5+
{{ message }}
6+
</h1>
7+
8+
<div x-data="{ count: 0 }" class="mt-4 mb-4">
9+
<button x-on:click="count++"
10+
class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800">Alpine.js example</button>
11+
12+
13+
<kbd x-text="count"
14+
class="px-2 py-1.5 text-xs font-semibold text-gray-800 bg-gray-100 border border-gray-200 rounded-lg dark:bg-gray-600 dark:text-gray-100 dark:border-gray-500" />
15+
16+
</div>
17+
18+
<button hx-post="/feedback" hx-target="#feedback" type="button" class="text-white bg-gradient-to-br from-purple-600 to-blue-500 hover:bg-gradient-to-bl focus:ring-4 focus:outline-none focus:ring-blue-300 dark:focus:ring-blue-800 font-medium rounded-lg text-sm px-5 py-2.5 text-center me-2 mb-2">HTMX example</button>
19+
20+
<div id="feedback" class="mt-2 mb-2"></div>
21+
22+
<button hx-post="/feedback2" hx-target="#feedback2" type="button" class="text-white bg-gradient-to-br from-purple-600 to-blue-500 hover:bg-gradient-to-bl focus:ring-4 focus:outline-none focus:ring-blue-300 dark:focus:ring-blue-800 font-medium rounded-lg text-sm px-5 py-2.5 text-center me-2 mb-2">HTMX example 2</button>
23+
24+
<div id="feedback2" class="mt-2"></div>
25+
</Layout>

0 commit comments

Comments
 (0)