vibetuner 2.14.1__tar.gz → 2.16.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vibetuner might be problematic. Click here for more details.

Files changed (85) hide show
  1. {vibetuner-2.14.1 → vibetuner-2.16.2}/PKG-INFO +15 -13
  2. {vibetuner-2.14.1 → vibetuner-2.16.2}/README.md +10 -7
  3. {vibetuner-2.14.1 → vibetuner-2.16.2}/pyproject.toml +5 -6
  4. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/debug/users.html.jinja +2 -2
  5. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/login.html.jinja +11 -13
  6. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/__init__.py +0 -0
  7. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/__main__.py +0 -0
  8. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/cli/__init__.py +0 -0
  9. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/cli/run.py +0 -0
  10. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/cli/scaffold.py +0 -0
  11. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/config.py +0 -0
  12. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/context.py +0 -0
  13. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/AGENTS.md +0 -0
  14. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/CLAUDE.md +0 -0
  15. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/__init__.py +0 -0
  16. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/context.py +0 -0
  17. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/deps.py +0 -0
  18. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/email.py +0 -0
  19. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/hotreload.py +0 -0
  20. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/lifespan.py +0 -0
  21. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/middleware.py +0 -0
  22. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/oauth.py +0 -0
  23. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/routes/__init__.py +0 -0
  24. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/routes/auth.py +0 -0
  25. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/routes/debug.py +0 -0
  26. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/routes/health.py +0 -0
  27. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/routes/language.py +0 -0
  28. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/routes/meta.py +0 -0
  29. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/routes/user.py +0 -0
  30. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/frontend/templates.py +0 -0
  31. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/logging.py +0 -0
  32. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/AGENTS.md +0 -0
  33. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/CLAUDE.md +0 -0
  34. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/__init__.py +0 -0
  35. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/blob.py +0 -0
  36. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/email_verification.py +0 -0
  37. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/mixins.py +0 -0
  38. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/oauth.py +0 -0
  39. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/registry.py +0 -0
  40. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/types.py +0 -0
  41. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/models/user.py +0 -0
  42. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/mongo.py +0 -0
  43. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/paths.py +0 -0
  44. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/services/AGENTS.md +0 -0
  45. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/services/CLAUDE.md +0 -0
  46. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/services/__init__.py +0 -0
  47. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/services/blob.py +0 -0
  48. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/services/email.py +0 -0
  49. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/tasks/AGENTS.md +0 -0
  50. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/tasks/CLAUDE.md +0 -0
  51. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/tasks/__init__.py +0 -0
  52. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/tasks/context.py +0 -0
  53. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/tasks/worker.py +0 -0
  54. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/email/AGENTS.md +0 -0
  55. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/email/CLAUDE.md +0 -0
  56. {vibetuner-2.14.1/src/vibetuner/templates/email/default → vibetuner-2.16.2/src/vibetuner/templates/email}/magic_link.html.jinja +0 -0
  57. {vibetuner-2.14.1/src/vibetuner/templates/email/default → vibetuner-2.16.2/src/vibetuner/templates/email}/magic_link.txt.jinja +0 -0
  58. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/AGENTS.md +0 -0
  59. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/CLAUDE.md +0 -0
  60. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/base/favicons.html.jinja +0 -0
  61. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/base/footer.html.jinja +0 -0
  62. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/base/header.html.jinja +0 -0
  63. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/base/opengraph.html.jinja +0 -0
  64. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/base/skeleton.html.jinja +0 -0
  65. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/debug/collections.html.jinja +0 -0
  66. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/debug/components/debug_nav.html.jinja +0 -0
  67. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/debug/index.html.jinja +0 -0
  68. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/debug/info.html.jinja +0 -0
  69. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/debug/version.html.jinja +0 -0
  70. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/email/magic_link.txt.jinja +0 -0
  71. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/email_sent.html.jinja +0 -0
  72. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/index.html.jinja +0 -0
  73. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/lang/select.html.jinja +0 -0
  74. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/meta/browserconfig.xml.jinja +0 -0
  75. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/meta/robots.txt.jinja +0 -0
  76. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/meta/site.webmanifest.jinja +0 -0
  77. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/meta/sitemap.xml.jinja +0 -0
  78. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/user/edit.html.jinja +0 -0
  79. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/frontend/user/profile.html.jinja +0 -0
  80. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/markdown/.placeholder +0 -0
  81. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/markdown/AGENTS.md +0 -0
  82. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates/markdown/CLAUDE.md +0 -0
  83. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/templates.py +0 -0
  84. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/time.py +0 -0
  85. {vibetuner-2.14.1 → vibetuner-2.16.2}/src/vibetuner/versioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: vibetuner
3
- Version: 2.14.1
3
+ Version: 2.16.2
4
4
  Summary: Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects
5
5
  Keywords: fastapi,mongodb,htmx,web-framework,scaffolding,oauth,background-jobs
6
6
  Author: All Tuner Labs, S.L.
@@ -42,15 +42,14 @@ Requires-Dist: streaq[web]<6.0.0
42
42
  Requires-Dist: typer-slim[standard]>=0.20.0
43
43
  Requires-Dist: babel>=2.17.0 ; extra == 'dev'
44
44
  Requires-Dist: cloudflare>=4.3.1 ; extra == 'dev'
45
- Requires-Dist: djlint>=1.36.4 ; extra == 'dev'
46
45
  Requires-Dist: dunamai>=1.25.0 ; extra == 'dev'
47
46
  Requires-Dist: gh-bin>=2.81.0 ; extra == 'dev'
48
47
  Requires-Dist: granian[pname,reload]>=2.5.7 ; extra == 'dev'
49
48
  Requires-Dist: just-bin>=1.43.0 ; extra == 'dev'
50
49
  Requires-Dist: pre-commit>=4.3.0 ; extra == 'dev'
51
50
  Requires-Dist: pysemver>=0.5.0 ; extra == 'dev'
52
- Requires-Dist: ruff>=0.14.3 ; extra == 'dev'
53
- Requires-Dist: rumdl>=0.0.171 ; extra == 'dev'
51
+ Requires-Dist: ruff>=0.14.4 ; extra == 'dev'
52
+ Requires-Dist: rumdl>=0.0.172 ; extra == 'dev'
54
53
  Requires-Dist: semver>=3.0.4 ; extra == 'dev'
55
54
  Requires-Dist: taplo>=0.9.3 ; extra == 'dev'
56
55
  Requires-Dist: ty>=0.0.1a25 ; extra == 'dev'
@@ -60,8 +59,8 @@ Requires-Dist: types-pyyaml>=6.0.12.20250915 ; extra == 'dev'
60
59
  Requires-Dist: uv-bump>=0.3.1 ; extra == 'dev'
61
60
  Requires-Python: >=3.11
62
61
  Project-URL: Changelog, https://github.com/alltuner/vibetuner/blob/main/CHANGELOG.md
63
- Project-URL: Documentation, https://github.com/alltuner/vibetuner#readme
64
- Project-URL: Homepage, https://github.com/alltuner/vibetuner
62
+ Project-URL: Documentation, https://vibetuner.alltuner.com/
63
+ Project-URL: Homepage, https://vibetuner.alltuner.com/
65
64
  Project-URL: Issues, https://github.com/alltuner/vibetuner/issues
66
65
  Project-URL: Repository, https://github.com/alltuner/vibetuner
67
66
  Provides-Extra: dev
@@ -69,13 +68,16 @@ Description-Content-Type: text/markdown
69
68
 
70
69
  # vibetuner
71
70
 
72
- **Core Python framework and blessed dependencies for Vibetuner projects**
71
+ Core Python framework and blessed dependencies for Vibetuner projects
73
72
 
74
- This package provides the complete Python framework and curated dependency set for building modern web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to authentication, background jobs, and CLI tools.
73
+ This package provides the complete Python framework and curated dependency set for building modern
74
+ web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to
75
+ authentication, background jobs, and CLI tools.
75
76
 
76
77
  ## What is Vibetuner?
77
78
 
78
- Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications. This package (`vibetuner`) is the Python component that provides:
79
+ Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications.
80
+ This package (`vibetuner`) is the Python component that provides:
79
81
 
80
82
  - Complete web application framework built on FastAPI
81
83
  - MongoDB integration with Beanie ODM
@@ -84,7 +86,8 @@ Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX we
84
86
  - CLI framework with Typer
85
87
  - Email services, blob storage, and more
86
88
 
87
- **This package is designed to be used within projects generated by the Vibetuner scaffolding tool.** For standalone use, you'll need to set up the project structure manually.
89
+ **This package is designed to be used within projects generated by the Vibetuner scaffolding
90
+ tool.** For standalone use, you'll need to set up the project structure manually.
88
91
 
89
92
  ## Installation
90
93
 
@@ -172,7 +175,6 @@ vibetuner run prod worker
172
175
  The `[dev]` extra includes all tools needed for development:
173
176
 
174
177
  - **Ruff**: Fast linting and formatting
175
- - **djlint**: Template linting
176
178
  - **Babel**: i18n message extraction
177
179
  - **pre-commit**: Git hooks
178
180
  - **Type stubs**: For aioboto3, authlib, PyYAML
@@ -205,7 +207,7 @@ async def hello():
205
207
 
206
208
  For complete documentation, guides, and examples, see the main Vibetuner repository:
207
209
 
208
- **📖 [Vibetuner Documentation](https://github.com/alltuner/vibetuner#readme)**
210
+ **📖 [Vibetuner Documentation](https://vibetuner.alltuner.com/)**
209
211
 
210
212
  ## Package Ecosystem
211
213
 
@@ -232,7 +234,7 @@ See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for detai
232
234
  ## Links
233
235
 
234
236
  - **Main Repository**: <https://github.com/alltuner/vibetuner>
235
- - **Documentation**: <https://github.com/alltuner/vibetuner#readme>
237
+ - **Documentation**: <https://vibetuner.alltuner.com/>
236
238
  - **Issues**: <https://github.com/alltuner/vibetuner/issues>
237
239
  - **PyPI**: <https://pypi.org/project/vibetuner/>
238
240
  - **npm Package**: <https://www.npmjs.com/package/@alltuner/vibetuner>
@@ -1,12 +1,15 @@
1
1
  # vibetuner
2
2
 
3
- **Core Python framework and blessed dependencies for Vibetuner projects**
3
+ Core Python framework and blessed dependencies for Vibetuner projects
4
4
 
5
- This package provides the complete Python framework and curated dependency set for building modern web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to authentication, background jobs, and CLI tools.
5
+ This package provides the complete Python framework and curated dependency set for building modern
6
+ web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to
7
+ authentication, background jobs, and CLI tools.
6
8
 
7
9
  ## What is Vibetuner?
8
10
 
9
- Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications. This package (`vibetuner`) is the Python component that provides:
11
+ Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications.
12
+ This package (`vibetuner`) is the Python component that provides:
10
13
 
11
14
  - Complete web application framework built on FastAPI
12
15
  - MongoDB integration with Beanie ODM
@@ -15,7 +18,8 @@ Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX we
15
18
  - CLI framework with Typer
16
19
  - Email services, blob storage, and more
17
20
 
18
- **This package is designed to be used within projects generated by the Vibetuner scaffolding tool.** For standalone use, you'll need to set up the project structure manually.
21
+ **This package is designed to be used within projects generated by the Vibetuner scaffolding
22
+ tool.** For standalone use, you'll need to set up the project structure manually.
19
23
 
20
24
  ## Installation
21
25
 
@@ -103,7 +107,6 @@ vibetuner run prod worker
103
107
  The `[dev]` extra includes all tools needed for development:
104
108
 
105
109
  - **Ruff**: Fast linting and formatting
106
- - **djlint**: Template linting
107
110
  - **Babel**: i18n message extraction
108
111
  - **pre-commit**: Git hooks
109
112
  - **Type stubs**: For aioboto3, authlib, PyYAML
@@ -136,7 +139,7 @@ async def hello():
136
139
 
137
140
  For complete documentation, guides, and examples, see the main Vibetuner repository:
138
141
 
139
- **📖 [Vibetuner Documentation](https://github.com/alltuner/vibetuner#readme)**
142
+ **📖 [Vibetuner Documentation](https://vibetuner.alltuner.com/)**
140
143
 
141
144
  ## Package Ecosystem
142
145
 
@@ -163,7 +166,7 @@ See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for detai
163
166
  ## Links
164
167
 
165
168
  - **Main Repository**: <https://github.com/alltuner/vibetuner>
166
- - **Documentation**: <https://github.com/alltuner/vibetuner#readme>
169
+ - **Documentation**: <https://vibetuner.alltuner.com/>
167
170
  - **Issues**: <https://github.com/alltuner/vibetuner/issues>
168
171
  - **PyPI**: <https://pypi.org/project/vibetuner/>
169
172
  - **npm Package**: <https://www.npmjs.com/package/@alltuner/vibetuner>
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "vibetuner"
3
3
  description = "Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects"
4
- version = "2.14.1"
4
+ version = "2.16.2"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  license = { text = "MIT" }
@@ -52,8 +52,8 @@ dependencies = [
52
52
  vibetuner = "vibetuner.cli:app"
53
53
 
54
54
  [project.urls]
55
- Homepage = "https://github.com/alltuner/vibetuner"
56
- Documentation = "https://github.com/alltuner/vibetuner#readme"
55
+ Homepage = "https://vibetuner.alltuner.com/"
56
+ Documentation = "https://vibetuner.alltuner.com/"
57
57
  Repository = "https://github.com/alltuner/vibetuner"
58
58
  Issues = "https://github.com/alltuner/vibetuner/issues"
59
59
  Changelog = "https://github.com/alltuner/vibetuner/blob/main/CHANGELOG.md"
@@ -63,15 +63,14 @@ dev = [
63
63
  # These are the development dependencies of AllTuner's blessed stack
64
64
  "babel>=2.17.0",
65
65
  "cloudflare>=4.3.1",
66
- "djlint>=1.36.4",
67
66
  "dunamai>=1.25.0",
68
67
  "gh-bin>=2.81.0",
69
68
  "granian[pname,reload]>=2.5.7",
70
69
  "just-bin>=1.43.0",
71
70
  "pre-commit>=4.3.0",
72
71
  "pysemver>=0.5.0",
73
- "ruff>=0.14.3",
74
- "rumdl>=0.0.171",
72
+ "ruff>=0.14.4",
73
+ "rumdl>=0.0.172",
75
74
  "semver>=3.0.4",
76
75
  "taplo>=0.9.3",
77
76
  "ty>=0.0.1a25",
@@ -36,7 +36,7 @@
36
36
  User ID: <code>{{ current_user_id }}</code>
37
37
  </p>
38
38
  <div class="card-actions justify-end">
39
- <form method="post" action="/debug/stop-impersonation">
39
+ <form method="post" action="{{ url_for('debug.stop_impersonation') }}">
40
40
  <button type="submit" class="btn btn-secondary btn-sm">Stop Impersonation</button>
41
41
  </form>
42
42
  </div>
@@ -105,7 +105,7 @@
105
105
  <td class="text-center">
106
106
  {% if current_user_id != user.id|string %}
107
107
  <form method="post"
108
- action="/debug/impersonate/{{ user.id }}"
108
+ action="{{ url_for('debug.impersonate_user', user_id=user.id) }}"
109
109
  class="inline">
110
110
  <button type="submit" class="btn btn-outline btn-sm">Impersonate</button>
111
111
  </form>
@@ -15,7 +15,11 @@
15
15
  {% if has_oauth and providers %}
16
16
  <div class="space-y-3 mb-6">
17
17
  {% for provider in providers %}
18
- <a href="{{ url_for('login_with_' + provider) }}{%- if next %}?next={{ next }}{%- endif %}"
18
+ {% set login_url = url_for('login_with_' + provider) %}
19
+ {% if next %}
20
+ {% set login_url = login_url ~ '?next=' ~ next %}
21
+ {% endif %}
22
+ <a href="{{ login_url }}"
19
23
  class="btn btn-outline btn-block justify-start gap-3 hover:btn-primary group transition-all duration-300 hover:scale-[1.02]">
20
24
  <span>{{ _("Continue with %(provider)s") | format(provider=provider.title()) }}</span>
21
25
  </a>
@@ -23,13 +27,13 @@
23
27
  </div>
24
28
  {% endif %}
25
29
  <!-- Divider -->
26
- {% if has_oauth and providers and has_email %}<div class="divider text-base-content/50">{{ _("OR") }}</div>{% endif %}
30
+ {% if has_oauth and providers and has_email %}
31
+ <div class="divider text-base-content/50">{{ _("OR") }}</div>
32
+ {% endif %}
27
33
  <!-- Email Magic Link -->
28
34
  {% if has_email %}
29
35
  <div class="bg-base-200/50 rounded-2xl p-6 border border-base-300/50">
30
- <form method="post"
31
- class="space-y-4"
32
- action="{{ url_for("send_magic_link") }}">
36
+ <form method="post" class="space-y-4" action="{{ url_for("send_magic_link") }}">
33
37
  {% if next %}<input type="hidden" name="next" value="{{ next }}" />{% endif %}
34
38
  <div class="form-control">
35
39
  <label class="label" for="email">
@@ -44,10 +48,7 @@
44
48
  required
45
49
  autocomplete="email" />
46
50
  <div class="absolute inset-y-0 right-0 flex items-center pr-3">
47
- <svg class="w-5 h-5 text-base-content/40"
48
- fill="none"
49
- stroke="currentColor"
50
- viewBox="0 0 24 24">
51
+ <svg class="w-5 h-5 text-base-content/40" fill="none" stroke="currentColor" viewBox="0 0 24 24">
51
52
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
52
53
  </svg>
53
54
  </div>
@@ -64,10 +65,7 @@
64
65
  <span>{{ _("Send Magic Link") }}</span>
65
66
  </button>
66
67
  <div class="alert alert-info bg-info/10 border-info/20">
67
- <svg class="w-5 h-5 text-info shrink-0"
68
- fill="none"
69
- stroke="currentColor"
70
- viewBox="0 0 24 24">
68
+ <svg class="w-5 h-5 text-info shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
71
69
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
72
70
  </svg>
73
71
  <div class="text-sm">