Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions public/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10307,7 +10307,7 @@ language: "en"

## TL;DR

Dotkernel API v7 adds support for native UUID v7, PostgreSQL, PHP 8.5 (8.4 for Admin), database table prefixes, and improved database configuration, while replacing the `binary` data type for `id` columns with `uuid`.
Dotkernel API v7 adds support for native UUID v7, PostgreSQL, PHP 8.5, database table prefixes, and improved database configuration, while replacing the `binary` data type for `id` columns with `uuid`.
It drops the Evolution pattern's Method Deprecation support and MySQL, since MySQL doesn't support the UUID data type.
UUIDs are generated with the ramsey/uuid package, previously `uuid`-named table columns are now called `id`, and PostgreSQL or MariaDB v10.7+ is required for UUID support.

Expand All @@ -10319,7 +10319,7 @@ New features are:

- Support for `UUID` v7 using the native `UUID` data type.
- Support for PostgreSQL.
- Support for PHP 8.5 for API and 8.4 for Admin.
- Support for PHP 8.5.
- Support for database table prefix (string prepended to the name of every table in a database).
- Improved database configuration.
- The replacement of the `binary` data type for `id` (index) columns, in favor of `uuid`.
Expand Down
77 changes: 9 additions & 68 deletions src/App/templates/app/index.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,6 @@
{% block json_ld %} {{ include('@jsonld/index.jsonld.twig') }} {% endblock %}
{% block title %}A PSR-15 compliant application{% endblock %}

{% block stylesheets %}
<style>
/* Product org-chart in the hero - scoped to this page. */
.org-chart { display: block; width: 100%; max-width: 380px; height: auto; margin: 6px auto 0; }
.org-chart .oc-line { stroke: var(--text-dim); stroke-width: 1.8; fill: none; }
.org-chart .oc-arrow { fill: var(--text-dim); }
.org-chart .oc-badge { fill: var(--surface); stroke: var(--border); stroke-width: 1.5; }
.org-chart .oc-icon * { fill: none; stroke: var(--text-dim); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.org-chart .oc-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: .04em; text-transform: uppercase; fill: var(--text-dim); text-anchor: middle; }
.org-chart .oc-admin { fill: #E2862E; }
.org-chart .oc-queue { fill: #22A06B; }
.org-chart .oc-api { fill: var(--brand-red); }
.org-chart .oc-box-name { font-family: var(--mono); font-weight: 700; text-anchor: middle; fill: var(--on-accent); text-shadow: 0 1px 2px rgba(0, 0, 0, .35); }
</style>
{% endblock %}

{% block content %}

<section class="hero">
Expand Down Expand Up @@ -45,58 +29,15 @@
</div>

<div class="pipeline">
<div class="pipeline-label"><span>Three products, one core</span></div>
<svg class="org-chart" viewBox="0 0 400 420" role="img" aria-label="An Admin box with an arrow into a Queue box, a double arrow down to a central API box, and four double arrows from the API box down to icon boxes for a smartphone, a computer, a person, and a cloud">
<defs>
<marker id="oc-arrowhead" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0,0 L10,5 L0,10 Z" class="oc-arrow"/>
</marker>
</defs>

<rect class="oc-admin" x="30" y="20" width="90" height="44" rx="8"/>
<text class="oc-box-name" x="75" y="47" font-size="14">Admin</text>

<rect class="oc-queue" x="155" y="20" width="90" height="44" rx="8"/>
<text class="oc-box-name" x="200" y="47" font-size="14">Queue</text>

<rect class="oc-api" x="130" y="160" width="140" height="80" rx="12"/>
<text class="oc-box-name" x="200" y="209" font-size="26">API</text>

<circle class="oc-badge" cx="74" cy="348" r="32"/>
<g class="oc-icon" transform="translate(74,348)">
<rect x="-6" y="-11" width="12" height="22" rx="2.5"/>
<line x1="-3" y1="8" x2="3" y2="8"/>
</g>
<text class="oc-label" x="74" y="392">Mobile</text>

<circle class="oc-badge" cx="158" cy="348" r="32"/>
<g class="oc-icon" transform="translate(158,348)">
<rect x="-10" y="-8" width="20" height="13" rx="1.5"/>
<line x1="0" y1="5" x2="0" y2="8"/>
<line x1="-6" y1="9" x2="6" y2="9"/>
</g>
<text class="oc-label" x="158" y="392">Client</text>

<circle class="oc-badge" cx="242" cy="348" r="32"/>
<g class="oc-icon" transform="translate(242,348)">
<circle cx="0" cy="-4" r="5"/>
<path d="M -9,10 C -9,2 9,2 9,10"/>
</g>
<text class="oc-label" x="242" y="392">Users</text>

<circle class="oc-badge" cx="326" cy="348" r="32"/>
<g class="oc-icon" transform="translate(326,348)">
<path d="M -6,-4 C -6,-7 -3,-9 0,-9 C 3,-9 6,-7 6,-4 C 9,-4 11,-2 11,1 C 11,3.5 9,5 6,5 L -8,5 C -11,5 -13,3 -13,0 C -13,-2.5 -11,-4.5 -8,-4.5 C -7.3,-4.5 -6.6,-4.3 -6,-4 Z"/>
</g>
<text class="oc-label" x="326" y="392">Cloud</text>

<line class="oc-line" x1="120" y1="42" x2="155" y2="42" marker-end="url(#oc-arrowhead)"/>
<line class="oc-line" x1="200" y1="64" x2="200" y2="160" marker-start="url(#oc-arrowhead)" marker-end="url(#oc-arrowhead)"/>
<line class="oc-line" x1="200" y1="240" x2="74" y2="316" marker-start="url(#oc-arrowhead)" marker-end="url(#oc-arrowhead)"/>
<line class="oc-line" x1="200" y1="240" x2="158" y2="316" marker-start="url(#oc-arrowhead)" marker-end="url(#oc-arrowhead)"/>
<line class="oc-line" x1="200" y1="240" x2="242" y2="316" marker-start="url(#oc-arrowhead)" marker-end="url(#oc-arrowhead)"/>
<line class="oc-line" x1="200" y1="240" x2="326" y2="316" marker-start="url(#oc-arrowhead)" marker-end="url(#oc-arrowhead)"/>
</svg>
<div class="pipeline-label"><span>Request lifecycle</span></div>
<div class="pipeline-track">
<div class="pl-packet" aria-hidden="true"></div>
<div class="pl-step"><span class="name">Router</span><span class="tag">FastRoute</span></div>
<div class="pl-step"><span class="name">Authentication</span><span class="tag">dot-authentication</span></div>
<div class="pl-step"><span class="name">RBAC guard</span><span class="tag">dot-rbac-guard</span></div>
<div class="pl-step"><span class="name">Your handler</span><span class="tag">PSR-15</span></div>
<div class="pl-step"><span class="name">Response</span><span class="tag">Diactoros</span></div>
</div>
</div>
</div>
</section>
Expand Down
8 changes: 4 additions & 4 deletions src/App/templates/layout/default.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -91,20 +91,20 @@
<ul>
<li><a href="{{ url('page::api') }}">API</a></li>
<li><a href="{{ url('page::admin') }}">Admin</a></li>
<li><a href="{{ url('page::queue') }}">Queue</a></li>
<li><a href="{{ url('page::dotboost') }}">Dotboost</a></li>
<li><a href="{{ url('page::frontend') }}">Frontend</a></li>
<li><a href="{{ url('page::light') }}">Light</a></li>
<li><a href="{{ url('page::queue') }}">Queue</a></li>
<li><a href="{{ url('page::frontend') }}">Frontend</a></li>
</ul>
</div>
<div class="footer-col">
<p class="footer-col-title">Resources</p>
<ul>
<li><a href="{{ url('page::architecture') }}">Architecture</a></li>
<li><a href="https://docs.dotkernel.org/" target="_blank" rel="noopener">Documentation</a></li>
<li><a href="{{ url('page::dotkernel-packages-oss-lifecycle') }}">Packages Lifecycle</a></li>
<li><a href="{{ url('page::architecture') }}">Architecture</a></li>
<li><a href="{{ url('page::categories') }}">Categories</a></li>
<li><a href="{{ url('page::blog') }}">Blog</a></li>
<li><a href="{{ url('page::categories') }}">Blog Categories</a></li>
</ul>
</div>
<div class="footer-col">
Expand Down
128 changes: 65 additions & 63 deletions src/Page/templates/page/admin.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,22 @@
.spec-note { margin-top: 14px; font-size: 13.5px; color: var(--text-dim); }
.step-cmd { display: block; margin-top: 12px; font-family: var(--mono); font-size: 12.5px; color: var(--teal); overflow-x: auto; }

/* Line chart in the hero - three sample metrics, scoped to this page. */
.line-chart { display: block; width: 100%; height: auto; margin-top: 4px; }
.line-chart .chart-grid { stroke: var(--border-soft); stroke-width: 1; }
.line-chart .chart-axis { stroke: var(--border); stroke-width: 1; }
.line-chart .chart-line { fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.line-chart .chart-line--down { stroke: #22A06B; }
.line-chart .chart-line--volatile { stroke: #2F80ED; }
.line-chart .chart-line--up { stroke: #E53935; }
.chart-legend { display: flex; gap: 18px; flex-wrap: wrap; margin-top: 14px; font-family: var(--mono); font-size: 11px; color: var(--text-dim); }
.chart-legend-item { display: inline-flex; align-items: center; gap: 6px; }
.chart-legend-item i { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }
.chart-legend-item.chart-line--down i { background: #22A06B; }
.chart-legend-item.chart-line--volatile i { background: #2F80ED; }
.chart-legend-item.chart-line--up i { background: #E53935; }
/* Guarded record table in the hero - scoped to this page. */
.mock-table { width: 100%; border-collapse: collapse; margin-top: 6px; font-size: 13px; }
.mock-table th, .mock-table td { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--border-soft); }
.mock-table thead th { font-family: var(--mono); font-size: 10px; letter-spacing: .06em; text-transform: uppercase; color: var(--text-dim); }
.mock-table tbody tr:last-child td { border-bottom: 0; }
.mock-table td { color: var(--text); }
.mock-pill { display: inline-block; padding: 3px 9px; border-radius: 999px; font-family: var(--mono); font-size: 10.5px; }
.mock-pill--ok { background: var(--sage-dim); color: var(--sage); }
.mock-pill--muted { background: var(--surface-2); color: var(--text-dim); }
.mock-table-action { font-family: var(--mono); font-size: 11px; color: var(--teal); white-space: nowrap; }
.mock-table-locked td { color: var(--text-dim); }
.mock-table-locked .mock-table-action { display: flex; align-items: center; gap: 5px; color: var(--brand-red); }
.mock-lock { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.mock-guards { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }
.mock-guard { display: inline-flex; align-items: center; gap: 6px; padding: 6px 10px; background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 8px; font-family: var(--mono); font-size: 10.5px; color: var(--text-dim); }
.mock-guard-icon { width: 14px; height: 14px; fill: none; stroke: var(--sage); stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
</style>
{% endblock %}

Expand Down Expand Up @@ -79,52 +81,48 @@

<div class="hero-visual">
<div class="pipeline">
<div class="pipeline-label"><span>What you can monitor</span></div>
<svg class="line-chart" viewBox="0 0 400 200" role="img" aria-label="Line chart of three sample metrics: a slowly declining error rate, a volatile requests-per-minute count, and steadily rising active users">
<line class="chart-grid" x1="20" y1="20" x2="380" y2="20"/>
<line class="chart-grid" x1="20" y1="65" x2="380" y2="65"/>
<line class="chart-grid" x1="20" y1="110" x2="380" y2="110"/>
<line class="chart-grid" x1="20" y1="155" x2="380" y2="155"/>
<line class="chart-axis" x1="20" y1="20" x2="20" y2="180"/>
<line class="chart-axis" x1="20" y1="180" x2="380" y2="180"/>
<polyline class="chart-line chart-line--down" points="20,50 71,58 123,66 174,75 226,85 277,96 329,106 380,118"/>
<polyline class="chart-line chart-line--volatile" points="20,100 71,40 123,150 174,60 226,170 277,50 329,130 380,90"/>
<polyline class="chart-line chart-line--up" points="20,170 71,155 123,140 174,120 226,100 277,80 329,60 380,35"/>
</svg>
<div class="chart-legend">
<span class="chart-legend-item chart-line--down"><i></i>Error rate</span>
<span class="chart-legend-item chart-line--volatile"><i></i>Requests / min</span>
<span class="chart-legend-item chart-line--up"><i></i>Active users</span>
<div class="pipeline-label"><span>Table-based management</span></div>
<table class="mock-table" aria-label="Sample record table showing a user list with roles, statuses and an edit action that is blocked by an RBAC guard for a viewer role">
<thead>
<tr><th>Record</th><th>Role</th><th>Status</th><th></th></tr>
</thead>
<tbody>
<tr>
<td>B. Johnson</td>
<td>Editor</td>
<td><span class="mock-pill mock-pill--ok">Active</span></td>
<td class="mock-table-action">Edit</td>
</tr>
<tr>
<td>J. Doe</td>
<td>Admin</td>
<td><span class="mock-pill mock-pill--ok">Active</span></td>
<td class="mock-table-action">Edit</td>
</tr>
<tr class="mock-table-locked">
<td>Z. Miller</td>
<td>Viewer</td>
<td><span class="mock-pill mock-pill--muted">Suspended</span></td>
<td class="mock-table-action">
<svg class="mock-lock" viewBox="0 0 24 24" aria-hidden="true"><rect x="5" y="11" width="14" height="10" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/></svg>
RBAC
</td>
</tr>
</tbody>
</table>
<div class="mock-guards">
<div class="mock-guard">
<svg class="mock-guard-icon" viewBox="0 0 24 24" aria-hidden="true"><ellipse cx="12" cy="6" rx="7" ry="3"/><path d="M5 6v6c0 1.7 3.1 3 7 3s7-1.3 7-3V6"/><path d="M5 12v6c0 1.7 3.1 3 7 3s7-1.3 7-3v-6"/></svg>
<span>Full CRUD</span>
</div>
<div class="mock-guard">
<svg class="mock-guard-icon" viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="9" width="4" height="4"/><rect x="10" y="9" width="4" height="4"/><rect x="17" y="9" width="4" height="4"/></svg>
<span>2FA</span>
</div>
</div>
</div>
</div>
</div>
<div class="wrap hero-art-row">
<figure class="hero-art">
<figcaption>Guarded record table</figcaption>
<svg viewBox="0 0 1180 200" role="img" aria-label="A wide record table in which one row is gated by a role check">
<rect x="20" y="24" width="1140" height="152" rx="12"/>
<rect class="art-fill" x="20" y="94" width="1140" height="40"/>
<line x1="20" y1="66" x2="1160" y2="66"/>
<line class="art-faint" x1="20" y1="94" x2="1160" y2="94"/>
<line class="art-faint" x1="20" y1="134" x2="1160" y2="134"/>
<line class="art-faint" x1="300" y1="24" x2="300" y2="176"/>
<line class="art-faint" x1="620" y1="24" x2="620" y2="176"/>
<line class="art-faint" x1="880" y1="24" x2="880" y2="176"/>
<line class="art-faint" x1="48" y1="45" x2="180" y2="45"/>
<line class="art-faint" x1="330" y1="45" x2="500" y2="45"/>
<line class="art-faint" x1="650" y1="45" x2="790" y2="45"/>
<line class="art-faint" x1="910" y1="45" x2="1010" y2="45"/>
<path class="art-accent" d="M64 102 l12 4 v9 c0 7 -5 12 -12 15 c-7 -3 -12 -8 -12 -15 v-9 z"/>
<line class="art-accent" x1="330" y1="114" x2="500" y2="114"/>
<line class="art-accent" x1="650" y1="114" x2="790" y2="114"/>
<line class="art-accent" x1="910" y1="114" x2="1010" y2="114"/>
<line class="art-faint" x1="48" y1="156" x2="180" y2="156"/>
<line class="art-faint" x1="330" y1="156" x2="500" y2="156"/>
<line class="art-faint" x1="650" y1="156" x2="790" y2="156"/>
</svg>
</figure>
</div>
</section>

<section class="what-is-platform">
Expand Down Expand Up @@ -312,13 +310,17 @@
second module you write looks like the first.</p>
</div>

<div class="core-band">
<span class="core-band-label">Shared domain layer</span>
<code>Core\Admin</code> <code>Core\App</code> <code>Core\Security</code>
<code>Core\Setting</code> <code>Core\User</code>
<p>The Core module is a common codebase shared with the other applications in your project. Each
submodule holds its entities, repositories and its own ConfigProvider, so a user means the same
thing to the admin screen and to the API endpoint.</p>
<div class="core-band row align-items-center gy-3">
<div class="col-12 col-lg-6">
<span class="core-band-label my-2">Shared domain layer</span><br>
<code>Core\Admin</code> <code>Core\App</code> <code>Core\Security</code>
<code>Core\Setting</code> <code>Core\User</code>
</div>
<div class="col-12 col-lg-6 border-start ps-lg-4">
<p>The Core module is a common codebase shared with the other applications in your project. Each
submodule holds its entities, repositories and its own ConfigProvider, so a user means the same
thing to the admin screen and to the API endpoint.</p>
</div>
</div>

<div class="standards-grid">
Expand Down
Loading