documentation updates

This commit is contained in:
Mark Gregory
2026-06-15 08:06:57 +01:00
parent 2a9d25ec18
commit 5aa026d3c6
80 changed files with 591 additions and 2469 deletions
@@ -3,6 +3,7 @@
@section('title', 'Create Category')
@section('content')
<div class="doc-page">
@include('documentation::partials.hero', [
'title' => 'Create category',
'subtitle' => 'Add a professional grouping for documents and operational knowledge.',
@@ -15,4 +16,5 @@
</form>
</div>
</section>
</div>
@endsection
@@ -3,6 +3,7 @@
@section('title', 'Edit Category')
@section('content')
<div class="doc-page">
@include('documentation::partials.hero', [
'title' => 'Edit category',
'subtitle' => 'Update category naming, ordering, visibility, and presentation metadata.',
@@ -15,4 +16,5 @@
</form>
</div>
</section>
</div>
@endsection
@@ -3,6 +3,7 @@
@section('title', 'Document Categories')
@section('content')
<div class="doc-page">
@include('documentation::partials.hero', [
'title' => 'Document categories',
'subtitle' => 'Organise documents by policy, process, onboarding, operational support, or technical area.',
@@ -54,4 +55,5 @@
<div style="margin-top:18px;">{{ $categories->links() }}</div>
</div>
</section>
</div>
@endsection
@@ -3,6 +3,7 @@
@section('title', 'Create Document')
@section('content')
<div class="doc-page">
@include('documentation::partials.hero', [
'title' => 'Create document',
'subtitle' => 'Add a controlled document, guide, policy, SOP, upload, or operational note.',
@@ -15,4 +16,5 @@
</form>
</div>
</section>
</div>
@endsection
@@ -3,6 +3,7 @@
@section('title', 'Edit Document')
@section('content')
<div class="doc-page">
@include('documentation::partials.hero', [
'title' => 'Edit document',
'subtitle' => 'Maintain document metadata, workflow status, version and attachment details.',
@@ -22,4 +23,5 @@
@method('DELETE')
</form>
@endforeach
</div>
@endsection
@@ -3,6 +3,7 @@
@section('title', 'Documentation')
@section('content')
<div class="doc-page">
@include('documentation::partials.hero', [
'title' => 'Documentation Centre',
'subtitle' => 'Create, control, publish, and archive operational documents from a clean professional register.',
@@ -89,4 +90,5 @@
<div style="margin-top:18px;">{{ $documents->links() }}</div>
</div>
</section>
</div>
@endsection
@@ -3,6 +3,7 @@
@section('title', $document->title)
@section('content')
<div class="doc-page">
@include('documentation::partials.hero', [
'title' => $document->title,
'subtitle' => $document->summary ?: 'Controlled documentation record with versioning, attachments and Markdown rendering.',
@@ -50,4 +51,5 @@
</div>
</section>
@endif
</div>
@endsection
@@ -6,104 +6,536 @@
<title>{{ trim($__env->yieldContent('title', 'Documentation')) }} - {{ config('app.name', 'Laravel') }}</title>
<style>
:root {
--doc-ink: #10231f;
--doc-muted: #64748b;
--doc-line: #dbe7e2;
--doc-ink: #18181b;
--doc-muted: #71717a;
--doc-line: #e4e4e7;
--doc-panel: #ffffff;
--doc-soft: #f5faf8;
--doc-brand: #0f766e;
--doc-brand-dark: #115e59;
--doc-accent: #16a34a;
--doc-danger: #b91c1c;
--doc-warning: #b45309;
--doc-soft: #f4f4f5;
--doc-brand: #2563eb;
--doc-brand-dark: #1d4ed8;
--doc-accent: #059669;
--doc-danger: #dc2626;
--doc-warning: #d97706;
--doc-radius: 22px;
--doc-shadow: 0 24px 70px rgba(15, 35, 31, .12);
--doc-shadow: 0 18px 55px rgba(15, 23, 42, .10);
}
html.dark {
--doc-ink: #f4f4f5;
--doc-muted: #a1a1aa;
--doc-line: #3f3f46;
--doc-panel: #18181b;
--doc-soft: #09090b;
--doc-shadow: 0 18px 55px rgba(0, 0, 0, .28);
}
body.documentation-module {
margin: 0;
background: linear-gradient(135deg, #eef8f3 0%, #f8fafc 45%, #ecfdf5 100%);
background: #ffffff;
color: var(--doc-ink);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
min-height: 100vh;
}
.doc-shell { max-width: 1240px; margin: 0 auto; padding: 28px 20px 56px; }
html.dark body.documentation-module {
background: #09090b;
}
.doc-shell {
max-width: 1800px;
margin: 0 auto;
padding: 0;
}
.doc-page {
margin: 0 auto;
max-width: 1800px;
padding: 0;
display: grid;
gap: 1.5rem;
}
.doc-hero-wrap {
overflow: hidden;
border: 1px solid var(--doc-line);
border-radius: 1.5rem;
background: var(--doc-panel);
box-shadow: 0 1px 2px rgba(15, 23, 42, .06);
}
.doc-hero {
display: grid; grid-template-columns: 1fr auto; gap: 24px; align-items: center;
padding: 28px; border-radius: 30px; color: #fff;
background: radial-gradient(circle at top left, rgba(255,255,255,.24), transparent 34%), linear-gradient(135deg, #064e3b, #0f766e 52%, #16a34a);
box-shadow: var(--doc-shadow); margin-bottom: 22px;
display: flex;
flex-direction: column;
gap: 1rem;
padding: 1.75rem 1.5rem;
color: #ffffff;
background: linear-gradient(135deg, #020617 0%, #0f172a 48%, #172554 100%);
}
.doc-eyebrow { text-transform: uppercase; font-size: 12px; letter-spacing: .16em; font-weight: 800; opacity: .82; margin: 0 0 10px; }
.doc-hero h1 { margin: 0; font-size: clamp(30px, 5vw, 52px); line-height: .98; letter-spacing: -.04em; }
.doc-hero p { max-width: 720px; margin: 14px 0 0; color: rgba(255,255,255,.84); font-size: 16px; line-height: 1.65; }
.doc-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.doc-hero-row {
display: flex;
flex-direction: column;
gap: 1rem;
}
.doc-hero h1 {
margin: .5rem 0 0;
font-size: clamp(1.875rem, 4vw, 3rem);
line-height: 1;
font-weight: 700;
letter-spacing: -.04em;
}
.doc-eyebrow {
margin: 0;
color: #bfdbfe;
text-transform: uppercase;
font-size: .75rem;
letter-spacing: .28em;
font-weight: 700;
}
.doc-hero p {
max-width: 48rem;
margin: .5rem 0 0;
color: rgba(219, 234, 254, .9);
font-size: .875rem;
line-height: 1.65;
}
.doc-actions {
display: flex;
flex-wrap: wrap;
gap: .5rem;
}
.doc-button {
border: 1px solid transparent; border-radius: 999px; padding: 11px 16px; font-weight: 800; font-size: 14px;
text-decoration: none; display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
border: 1px solid transparent;
border-radius: .75rem;
padding: .625rem .875rem;
font-weight: 700;
font-size: .875rem;
line-height: 1.25rem;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
gap: .5rem;
cursor: pointer;
transition: background-color .15s ease, border-color .15s ease, transform .15s ease, box-shadow .15s ease;
}
.doc-button.primary { background: #fff; color: var(--doc-brand-dark); }
.doc-button.secondary { background: rgba(255,255,255,.14); color: #fff; border-color: rgba(255,255,255,.32); }
.doc-button.dark { background: var(--doc-brand); color: #fff; }
.doc-button.light { background: #f8fafc; color: var(--doc-ink); border-color: var(--doc-line); }
.doc-button.danger { background: #fef2f2; color: var(--doc-danger); border-color: #fecaca; padding: 8px 12px; }
.doc-card { background: rgba(255,255,255,.92); border: 1px solid var(--doc-line); border-radius: var(--doc-radius); box-shadow: 0 14px 45px rgba(15,35,31,.08); overflow: hidden; }
.doc-card-header { padding: 20px 22px; border-bottom: 1px solid var(--doc-line); display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.doc-card-body { padding: 22px; }
.doc-grid { display: grid; gap: 18px; }
.doc-grid.stats { grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 22px 0; }
.doc-stat { padding: 20px; }
.doc-stat strong { display:block; font-size: 30px; letter-spacing: -.04em; }
.doc-stat span { color: var(--doc-muted); font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
.doc-table { width: 100%; border-collapse: collapse; }
.doc-table th { text-align: left; font-size: 12px; text-transform: uppercase; letter-spacing: .08em; color: var(--doc-muted); padding: 12px; border-bottom: 1px solid var(--doc-line); }
.doc-table td { padding: 14px 12px; border-bottom: 1px solid #edf3f0; vertical-align: top; }
.doc-table a { color: var(--doc-brand-dark); font-weight: 800; text-decoration: none; }
.doc-badge { display: inline-flex; align-items: center; border-radius: 999px; padding: 5px 10px; font-size: 12px; font-weight: 800; background: #ecfdf5; color: #065f46; border: 1px solid #bbf7d0; }
.doc-badge.draft { background: #f8fafc; color: #475569; border-color: #cbd5e1; }
.doc-badge.archived { background: #fef2f2; color: #991b1b; border-color: #fecaca; }
.doc-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.doc-field.full { grid-column: 1 / -1; }
.doc-label { display: block; font-weight: 800; margin-bottom: 8px; font-size: 14px; }
.doc-input, .doc-select, .doc-textarea {
width: 100%; box-sizing: border-box; border: 1px solid #cbd5e1; border-radius: 14px; padding: 12px 14px;
background: #fff; color: var(--doc-ink); font: inherit;
.doc-button:hover {
transform: translateY(-1px);
}
.doc-textarea { min-height: 360px; line-height: 1.6; resize: vertical; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
.doc-editor { border: 1px solid #cbd5e1; border-radius: 16px; overflow: hidden; background: #fff; }
.doc-editor .doc-textarea { border: 0; border-radius: 0; min-height: 420px; }
.doc-editor-toolbar { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px; background: #f8fafc; border-bottom: 1px solid var(--doc-line); }
.doc-editor-toolbar button { border: 1px solid #cbd5e1; background: #fff; color: var(--doc-ink); border-radius: 10px; padding: 7px 10px; font-weight: 800; cursor: pointer; }
.doc-editor-toolbar button:hover, .doc-editor-toolbar button:focus { border-color: var(--doc-brand); outline: 2px solid rgba(15, 118, 110, .18); }
.editor-help { padding: 0 14px 12px; margin: -4px 0 0; font-size: 13px; }
.doc-error { color: var(--doc-danger); font-size: 13px; margin-top: 6px; }
.doc-alert { border-radius: 16px; padding: 14px 16px; background: #ecfdf5; color: #065f46; border: 1px solid #bbf7d0; margin-bottom: 18px; font-weight: 700; }
.doc-filter { display: grid; grid-template-columns: 1fr 180px 220px auto; gap: 12px; margin-bottom: 18px; }
.doc-content { line-height: 1.75; font-size: 16px; }
.doc-content h1, .doc-content h2, .doc-content h3 { line-height: 1.2; letter-spacing: -.025em; margin: 1.4em 0 .55em; }
.doc-button.primary,
.doc-button.dark {
background: #2563eb;
color: #ffffff;
border-color: #2563eb;
}
.doc-button.primary:hover,
.doc-button.dark:hover {
background: #1d4ed8;
border-color: #1d4ed8;
}
.doc-button.secondary {
background: rgba(255, 255, 255, .10);
color: #ffffff;
border-color: rgba(255, 255, 255, .22);
}
.doc-button.secondary:hover {
background: rgba(255, 255, 255, .16);
}
.doc-button.light {
background: #f8fafc;
color: #18181b;
border-color: #d4d4d8;
}
html.dark .doc-button.light {
background: #09090b;
color: #f4f4f5;
border-color: #3f3f46;
}
.doc-button.success {
background: #059669;
color: #ffffff;
border-color: #059669;
}
.doc-button.danger {
background: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.doc-card {
background: var(--doc-panel);
border: 1px solid var(--doc-line);
border-radius: 1rem;
box-shadow: 0 1px 2px rgba(15, 23, 42, .06);
overflow: hidden;
}
.doc-card-header {
padding: 1rem 1.25rem;
border-bottom: 1px solid var(--doc-line);
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.doc-card-body {
padding: 1.25rem;
}
.doc-grid {
display: grid;
gap: 1rem;
}
.doc-grid.stats {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.doc-stat {
padding: 1.25rem;
}
.doc-stat strong {
display: block;
font-size: 1.875rem;
line-height: 2.25rem;
letter-spacing: -.04em;
color: var(--doc-ink);
}
.doc-stat span {
color: var(--doc-muted);
font-size: .75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: .08em;
}
.doc-table {
width: 100%;
border-collapse: collapse;
}
.doc-table th {
text-align: left;
font-size: .75rem;
text-transform: uppercase;
letter-spacing: .08em;
color: var(--doc-muted);
padding: .75rem;
border-bottom: 1px solid var(--doc-line);
}
.doc-table td {
padding: .875rem .75rem;
border-bottom: 1px solid var(--doc-line);
vertical-align: top;
}
.doc-table a,
.doc-link {
color: #1d4ed8;
font-weight: 700;
text-decoration: none;
}
html.dark .doc-table a,
html.dark .doc-link {
color: #93c5fd;
}
.doc-badge {
display: inline-flex;
align-items: center;
border-radius: 999px;
padding: .25rem .625rem;
font-size: .75rem;
font-weight: 800;
background: #dbeafe;
color: #1e40af;
border: 1px solid #bfdbfe;
}
.doc-badge.published {
background: #ecfdf5;
color: #065f46;
border-color: #a7f3d0;
}
.doc-badge.draft {
background: #f4f4f5;
color: #52525b;
border-color: #d4d4d8;
}
.doc-badge.archived {
background: #fef2f2;
color: #991b1b;
border-color: #fecaca;
}
html.dark .doc-badge {
background: rgba(37, 99, 235, .18);
color: #bfdbfe;
border-color: rgba(59, 130, 246, .35);
}
html.dark .doc-badge.published {
background: rgba(5, 150, 105, .18);
color: #a7f3d0;
border-color: rgba(16, 185, 129, .35);
}
html.dark .doc-badge.draft {
background: rgba(113, 113, 122, .18);
color: #d4d4d8;
border-color: rgba(161, 161, 170, .30);
}
html.dark .doc-badge.archived {
background: rgba(220, 38, 38, .16);
color: #fecaca;
border-color: rgba(248, 113, 113, .32);
}
.doc-form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1rem;
}
.doc-field.full {
grid-column: 1 / -1;
}
.doc-label {
display: block;
font-weight: 700;
margin-bottom: .5rem;
font-size: .875rem;
color: var(--doc-ink);
}
.doc-input,
.doc-select,
.doc-textarea {
width: 100%;
box-sizing: border-box;
border: 1px solid #d4d4d8;
border-radius: .75rem;
padding: .75rem .875rem;
background: #ffffff;
color: #18181b;
font: inherit;
box-shadow: 0 1px 2px rgba(15, 23, 42, .04);
}
.doc-input:focus,
.doc-select:focus,
.doc-textarea:focus {
outline: 2px solid rgba(37, 99, 235, .24);
border-color: #2563eb;
}
html.dark .doc-input,
html.dark .doc-select,
html.dark .doc-textarea {
background: #09090b;
color: #f4f4f5;
border-color: #3f3f46;
}
.doc-textarea {
min-height: 360px;
line-height: 1.6;
resize: vertical;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
}
.doc-editor {
border: 1px solid #d4d4d8;
border-radius: 1rem;
overflow: hidden;
background: #ffffff;
}
html.dark .doc-editor {
background: #09090b;
border-color: #3f3f46;
}
.doc-editor .doc-textarea {
border: 0;
border-radius: 0;
min-height: 420px;
}
.doc-editor-toolbar {
display: flex;
flex-wrap: wrap;
gap: .375rem;
padding: .625rem;
background: #f4f4f5;
border-bottom: 1px solid var(--doc-line);
}
html.dark .doc-editor-toolbar {
background: #18181b;
}
.doc-editor-toolbar button {
border: 1px solid #d4d4d8;
background: #ffffff;
color: #18181b;
border-radius: .625rem;
padding: .45rem .625rem;
font-weight: 800;
cursor: pointer;
}
html.dark .doc-editor-toolbar button {
border-color: #3f3f46;
background: #09090b;
color: #f4f4f5;
}
.doc-editor-toolbar button:hover,
.doc-editor-toolbar button:focus {
border-color: #2563eb;
outline: 2px solid rgba(37, 99, 235, .20);
}
.editor-help {
padding: 0 .875rem .75rem;
margin: -.25rem 0 0;
font-size: .8125rem;
}
.doc-error {
color: #dc2626;
font-size: .8125rem;
margin-top: .375rem;
}
.doc-alert {
border-radius: 1rem;
padding: .875rem 1rem;
background: #ecfdf5;
color: #065f46;
border: 1px solid #a7f3d0;
font-size: .875rem;
font-weight: 700;
}
html.dark .doc-alert {
background: #022c22;
color: #a7f3d0;
border-color: #065f46;
}
.doc-warning {
border-radius: 1rem;
padding: .875rem 1rem;
background: #fffbeb;
color: #92400e;
border: 1px solid #fcd34d;
font-size: .875rem;
}
html.dark .doc-warning {
background: #451a03;
color: #fef3c7;
border-color: #92400e;
}
.doc-filter {
display: grid;
grid-template-columns: 1fr 180px 220px auto;
gap: .75rem;
margin-bottom: 1.125rem;
}
.doc-content {
line-height: 1.75;
font-size: 1rem;
}
.doc-content h1,
.doc-content h2,
.doc-content h3 {
line-height: 1.2;
letter-spacing: -.025em;
margin: 1.4em 0 .55em;
}
.doc-content h1 { font-size: 2rem; }
.doc-content h2 { font-size: 1.55rem; border-bottom: 1px solid var(--doc-line); padding-bottom: .35rem; }
.doc-content h3 { font-size: 1.25rem; }
.doc-content p, .doc-content ul, .doc-content ol, .doc-content blockquote, .doc-content pre { margin: 0 0 1rem; }
.doc-content code { background: #f1f5f9; border-radius: 7px; padding: .14rem .32rem; font-size: .92em; }
.doc-content pre { overflow-x: auto; background: #0f172a; color: #e2e8f0; border-radius: 16px; padding: 16px; }
.doc-content p,
.doc-content ul,
.doc-content ol,
.doc-content blockquote,
.doc-content pre { margin: 0 0 1rem; }
.doc-content code { background: #f1f5f9; border-radius: .4375rem; padding: .14rem .32rem; font-size: .92em; }
html.dark .doc-content code { background: #1e293b; color: #e2e8f0; }
.doc-content pre { overflow-x: auto; background: #0f172a; color: #e2e8f0; border-radius: 1rem; padding: 1rem; }
.doc-content pre code { background: transparent; color: inherit; padding: 0; }
.doc-content blockquote { border-left: 4px solid var(--doc-brand); padding-left: 16px; color: var(--doc-muted); }
.doc-content blockquote { border-left: 4px solid #2563eb; padding-left: 1rem; color: var(--doc-muted); }
.doc-content table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
.doc-content th, .doc-content td { border: 1px solid var(--doc-line); padding: 10px 12px; text-align: left; }
.doc-content th,
.doc-content td { border: 1px solid var(--doc-line); padding: .625rem .75rem; text-align: left; }
.doc-muted { color: var(--doc-muted); }
.doc-link { color: var(--doc-brand-dark); font-weight: 800; text-decoration: none; }
.doc-attachment-list { display: grid; gap: 10px; }
.doc-attachment-item { display: flex; justify-content: space-between; align-items: center; gap: 14px; border: 1px solid var(--doc-line); border-radius: 14px; padding: 12px 14px; background: #fff; }
.doc-attachment-list {
display: grid;
gap: .625rem;
}
.doc-attachment-item {
display: flex;
justify-content: space-between;
align-items: center;
gap: .875rem;
border: 1px solid var(--doc-line);
border-radius: .875rem;
padding: .75rem .875rem;
background: var(--doc-panel);
}
@media (min-width: 1024px) {
.doc-hero-row {
flex-direction: row;
align-items: center;
justify-content: space-between;
}
}
@media (max-width: 860px) {
.doc-hero { grid-template-columns: 1fr; }
.doc-grid.stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.doc-filter, .doc-form-grid { grid-template-columns: 1fr; }
.doc-filter,
.doc-form-grid { grid-template-columns: 1fr; }
.doc-table { display: block; overflow-x: auto; }
}
@media (max-width: 560px) {
.doc-shell { padding: 16px 12px 36px; }
.doc-hero { padding: 22px; border-radius: 22px; }
.doc-grid.stats { grid-template-columns: 1fr; }
.doc-hero { padding: 1.375rem; border-radius: 1.375rem; }
}
</style>
</head>
@@ -1,13 +1,17 @@
<section class="doc-hero">
<div>
<p class="doc-eyebrow">{{ $eyebrow ?? 'Documentation Suite' }}</p>
<h1>{{ $title ?? 'Documentation' }}</h1>
<p>{{ $subtitle ?? 'Manage controlled documents, policies, guides, files, and operational knowledge in one professional workspace.' }}</p>
<div class="doc-actions">
<a class="doc-button primary" href="{{ route('documentation.documents.create') }}">Create document</a>
<a class="doc-button secondary" href="{{ route('documentation.categories.index') }}">Manage categories</a>
<a class="doc-button secondary" href="{{ route('documentation.documents.index') }}">Document register</a>
<section class="doc-hero-wrap">
<div class="doc-hero">
<div class="doc-hero-row">
<div>
<p class="doc-eyebrow">{{ $eyebrow ?? 'Documentation workflow' }}</p>
<h1>{{ $title ?? 'Documentation' }}</h1>
<p>{{ $subtitle ?? 'Manage controlled documents, policies, guides, files, and operational knowledge in one professional workspace.' }}</p>
</div>
<div class="doc-actions">
<a class="doc-button primary" href="{{ route('documentation.documents.create') }}" wire:navigate>Create document</a>
<a class="doc-button secondary" href="{{ route('documentation.categories.index') }}" wire:navigate>Manage categories</a>
<a class="doc-button secondary" href="{{ route('documentation.documents.index') }}" wire:navigate>Document register</a>
</div>
</div>
</div>
<div aria-hidden="true" style="width:140px;height:140px;border-radius:32px;background:rgba(255,255,255,.16);display:grid;place-items:center;border:1px solid rgba(255,255,255,.26);font-size:58px;font-weight:900;">D</div>
</section>