|
1 | 1 | {% extends '@layout/default.html.twig' %} |
2 | 2 | {% block json_ld %} {{ include('@jsonld/index.jsonld.twig') }} {% endblock %} |
3 | 3 | {% block title %}A PSR-15 compliant application{% endblock %} |
4 | | -{% block head_links %}<link rel="alternate" type="text/markdown" href="/index.md">{% endblock %} |
5 | 4 |
|
6 | 5 | {% block content %} |
7 | 6 |
|
8 | 7 | <section class="hero"> |
9 | | - <div class="wrap hero-grid"> |
| 8 | + <div class="wrap hero-grid" id="request-lifecycle"> |
10 | 9 | <div> |
11 | 10 | <span class="eyebrow">PSR-15 . middleware-first architecture</span> |
12 | 11 | <h1>A headless platform for building modern web applications</h1> |
13 | 12 | <p class="sub"> Dotkernel is a set of open-source PHP applications - REST API, admin, and queue - that ship assembled on Mezzio and Laminas, over one shared Doctrine domain layer called Core. |
14 | | - OAuth2, RBAC, HAL, and a generated OpenAPI spec are wired together on install, not left for you to choose.</p> |
| 13 | + OAuth2, RBAC, HAL, and a generated OpenAPI spec are wired together on install, not left for you to choose.</p> |
15 | 14 | <div class="hero-ctas"> |
16 | 15 | <a class="btn btn-primary" href="https://docs.dotkernel.org" target="_blank" rel="noopener"> |
17 | 16 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg> |
|
29 | 28 | </div> |
30 | 29 | </div> |
31 | 30 |
|
32 | | - <div class="pipeline"> |
33 | | - <div class="pipeline-label"><span>Request lifecycle</span></div> |
| 31 | + <div class="pipeline" > |
| 32 | + <div class="pipeline-label" ><span>Request lifecycle</span></div> |
34 | 33 | <div class="pipeline-track"> |
35 | 34 | <div class="pl-packet" aria-hidden="true"></div> |
36 | 35 | <div class="pl-step"><span class="name">Router</span><span class="tag">FastRoute</span></div> |
|
62 | 61 | </div> |
63 | 62 | <div class="traits"> |
64 | 63 | <div class="trait"> |
65 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/traffic-sign-50.svg') }}" alt="Doctrine, not Active Record" loading="lazy"> |
| 64 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/traffic-sign-50.svg') }}" alt="" loading="lazy"> |
66 | 65 | <p>Doctrine, not Active Record</p> |
67 | 66 | </div> |
68 | 67 |
|
69 | 68 | <div class="trait"> |
70 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/success-50.svg') }}" alt="Explicit wiring, no magic" loading="lazy"> |
| 69 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/success-50.svg') }}" alt="" loading="lazy"> |
71 | 70 | <p>Explicit wiring, no magic</p> |
72 | 71 | </div> |
73 | 72 |
|
74 | 73 | <div class="trait"> |
75 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/speed-radar-50.svg') }}" alt="One domain, three deployables" loading="lazy"> |
| 74 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/speed-radar-50.svg') }}" alt="Lightning-fast performance" loading="lazy"> |
76 | 75 | <p>One domain, three deployables</p> |
77 | 76 | </div> |
78 | 77 |
|
79 | 78 | <div class="trait"> |
80 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/maintenance.svg') }}" alt="Dependencies that move slowly" loading="lazy"> |
| 79 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/maintenance.svg') }}" alt="Easier maintenance and onboarding" loading="lazy"> |
81 | 80 | <p>Dependencies that move slowly</p> |
82 | 81 | </div> |
83 | 82 | </div> |
84 | 83 | </div> |
85 | 84 | </section> |
86 | 85 |
|
87 | | - <section class="section-bg-light"> |
| 86 | + <section style="background:var(--surface-2);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft);"> |
88 | 87 | <div class="wrap"> |
89 | 88 | <div class="section-head"> |
90 | 89 | <span class="eyebrow">Headless Platform</span> |
91 | 90 | <h2>Three applications, one platform</h2> |
92 | 91 | <p>API, Admin, and Queue declare the same <code>Core</code> namespaces - the same entities, repositories, and services. |
93 | | - A <code>User</code> means the same thing to the endpoint that creates it, the admin screen that moderates it, and the worker that emails it. |
94 | | - Three deployables that scale independently and never disagree about the domain.</p> |
| 92 | + A <code>User</code> means the same thing to the endpoint that creates it, the admin screen that moderates it, and the worker that emails it. |
| 93 | + Three deployables that scale independently and never disagree about the domain.</p> |
95 | 94 | </div> |
96 | 95 |
|
97 | 96 | <div class="core-band row align-items-center gy-3"> |
|
206 | 205 | </div> |
207 | 206 | </section> |
208 | 207 |
|
209 | | - <section class="section-bg-light"> |
| 208 | + <section style="background:var(--surface-2);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft);"> |
210 | 209 | <div class="wrap"> |
211 | 210 | <div class="section-head"> |
212 | 211 | <span class="eyebrow">Other skeletons</span> |
|
259 | 258 | </div> |
260 | 259 | </section> |
261 | 260 |
|
262 | | - <section> |
| 261 | + <section style="background:var(--surface-2);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft);" id="components-dot-packages"> |
263 | 262 | <div class="wrap"> |
264 | | - <div class="section-head"> |
| 263 | + <div class="section-head" > |
265 | 264 | <span class="eyebrow">Components</span> |
266 | 265 | <h2>Every layer, on its own</h2> |
267 | 266 | <p>Small, independent dot-* packages - pull in what you need. Lifecycle status for each lives on the <a href="https://www.dotkernel.com/dotkernel-packages-oss-lifecycle/" style="color:var(--teal);">Packages Lifecycle</a> page.</p> |
|
362 | 361 | </div> |
363 | 362 | </section> |
364 | 363 | {% if posts is defined and posts is iterable %} |
365 | | - <section style="background:var(--surface-2);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft);"> |
| 364 | + <section> |
366 | 365 | <div class="wrap"> |
367 | 366 | <div class="section-head"> |
368 | 367 | <span class="eyebrow">From the blog</span> |
|
0 commit comments