|
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 %} |
4 | 5 |
|
5 | 6 | {% block content %} |
6 | 7 |
|
|
10 | 11 | <span class="eyebrow">PSR-15 . middleware-first architecture</span> |
11 | 12 | <h1>A headless platform for building modern web applications</h1> |
12 | 13 | <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. |
13 | | - OAuth2, RBAC, HAL, and a generated OpenAPI spec are wired together on install, not left for you to choose.</p> |
| 14 | + OAuth2, RBAC, HAL, and a generated OpenAPI spec are wired together on install, not left for you to choose.</p> |
14 | 15 | <div class="hero-ctas"> |
15 | 16 | <a class="btn btn-primary" href="https://docs.dotkernel.org" target="_blank" rel="noopener"> |
16 | 17 | <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> |
|
28 | 29 | </div> |
29 | 30 | </div> |
30 | 31 |
|
31 | | - <div class="pipeline" > |
32 | | - <div class="pipeline-label" ><span>Request lifecycle</span></div> |
| 32 | + <div class="pipeline"> |
| 33 | + <div class="pipeline-label"><span>Request lifecycle</span></div> |
33 | 34 | <div class="pipeline-track"> |
34 | 35 | <div class="pl-packet" aria-hidden="true"></div> |
35 | 36 | <div class="pl-step"><span class="name">Router</span><span class="tag">FastRoute</span></div> |
|
61 | 62 | </div> |
62 | 63 | <div class="traits"> |
63 | 64 | <div class="trait"> |
64 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/traffic-sign-50.svg') }}" alt="" loading="lazy"> |
| 65 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/traffic-sign-50.svg') }}" alt="Doctrine, not Active Record" loading="lazy"> |
65 | 66 | <p>Doctrine, not Active Record</p> |
66 | 67 | </div> |
67 | 68 |
|
68 | 69 | <div class="trait"> |
69 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/success-50.svg') }}" alt="" loading="lazy"> |
| 70 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/success-50.svg') }}" alt="Explicit wiring, no magic" loading="lazy"> |
70 | 71 | <p>Explicit wiring, no magic</p> |
71 | 72 | </div> |
72 | 73 |
|
73 | 74 | <div class="trait"> |
74 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/speed-radar-50.svg') }}" alt="Lightning-fast performance" loading="lazy"> |
| 75 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/speed-radar-50.svg') }}" alt="One domain, three deployables" loading="lazy"> |
75 | 76 | <p>One domain, three deployables</p> |
76 | 77 | </div> |
77 | 78 |
|
78 | 79 | <div class="trait"> |
79 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/maintenance.svg') }}" alt="Easier maintenance and onboarding" loading="lazy"> |
| 80 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/maintenance.svg') }}" alt="Dependencies that move slowly" loading="lazy"> |
80 | 81 | <p>Dependencies that move slowly</p> |
81 | 82 | </div> |
82 | 83 | </div> |
83 | 84 | </div> |
84 | 85 | </section> |
85 | 86 |
|
86 | | - <section style="background:var(--surface-2);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft);"> |
| 87 | + <section class="section-bg-light"> |
87 | 88 | <div class="wrap"> |
88 | 89 | <div class="section-head"> |
89 | 90 | <span class="eyebrow">Headless Platform</span> |
90 | 91 | <h2>Three applications, one platform</h2> |
91 | 92 | <p>API, Admin, and Queue declare the same <code>Core</code> namespaces - the same entities, repositories, and services. |
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> |
| 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> |
94 | 95 | </div> |
95 | 96 |
|
96 | 97 | <div class="core-band row align-items-center gy-3"> |
|
205 | 206 | </div> |
206 | 207 | </section> |
207 | 208 |
|
208 | | - <section style="background:var(--surface-2);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft);"> |
| 209 | + <section class="section-bg-light"> |
209 | 210 | <div class="wrap"> |
210 | 211 | <div class="section-head"> |
211 | 212 | <span class="eyebrow">Other skeletons</span> |
|
258 | 259 | </div> |
259 | 260 | </section> |
260 | 261 |
|
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"> |
| 262 | + <section> |
262 | 263 | <div class="wrap"> |
263 | | - <div class="section-head" > |
| 264 | + <div class="section-head" id="components-dot-packages"> |
264 | 265 | <span class="eyebrow">Components</span> |
265 | 266 | <h2>Every layer, on its own</h2> |
266 | 267 | <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> |
|
361 | 362 | </div> |
362 | 363 | </section> |
363 | 364 | {% if posts is defined and posts is iterable %} |
364 | | - <section> |
| 365 | + <section style="background:var(--surface-2);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft);"> |
365 | 366 | <div class="wrap"> |
366 | 367 | <div class="section-head"> |
367 | 368 | <span class="eyebrow">From the blog</span> |
|
0 commit comments