feat: A lot of stuffs, basic functionality

This commit is contained in:
Dendy 2025-03-31 08:25:05 +02:00
parent 27eef87174
commit 4525706b23
9 changed files with 881 additions and 14 deletions

View File

@ -1,10 +1,3 @@
import './bootstrap.js'; import './styles/vars.css';
/* import './styles/demdtrap.css';
* Welcome to your app's main JavaScript file!
*
* This file will be included onto the page via the importmap() Twig function,
* which should already be in your base.html.twig.
*/
import './styles/app.css'; import './styles/app.css';
console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉');

View File

@ -1,3 +1,13 @@
body { html {
background-color: skyblue; font-family: sans;
}
body {
}
pre {
padding: var(--dt-spacing-2);
background-color: black;
border: 1px solid var(--dt-neutral-4);
margin-bottom: var(--dt-spacing-2)
} }

210
assets/styles/demdtrap.css Normal file
View File

@ -0,0 +1,210 @@
* { margin: 0px; padding: 0px; }
ul {
margin-left: var(--dt-spacing-3)
}
h1 {
margin-bottom: var(--dt-spacing-2);
}
hr {
margin: var(--dt-spacing-2) var(--dt-spacing-0);
border: 0px;
border-bottom: 1px solid var(--dt-neutral-4);
}
a {
color: var(--dt-primary-lighter);
text-decoration: none;
&:hover {
background-color: var(--dt-primary-lighter);
color: var(--dt-neutral-2);
}
}
/* ------------------------------------------------------------- Margins --- */
.m-0 { margin: var(--dt-spacing-0); }
.m-1 { margin: var(--dt-spacing-1); }
.m-2 { margin: var(--dt-spacing-2); }
.m-3 { margin: var(--dt-spacing-3); }
.m-4 { margin: var(--dt-spacing-4); }
.m-5 { margin: var(--dt-spacing-5); }
.m-6 { margin: var(--dt-spacing-6); }
.mt-0 { margin-top: var(--dt-spacing-0); }
.mt-1 { margin-top: var(--dt-spacing-1); }
.mt-2 { margin-top: var(--dt-spacing-2); }
.mt-3 { margin-top: var(--dt-spacing-3); }
.mt-4 { margin-top: var(--dt-spacing-4); }
.mt-5 { margin-top: var(--dt-spacing-5); }
.mt-6 { margin-top: var(--dt-spacing-6); }
.mb-0 { margin-bottom: var(--dt-spacing-0); }
.mb-1 { margin-bottom: var(--dt-spacing-1); }
.mb-2 { margin-bottom: var(--dt-spacing-2); }
.mb-3 { margin-bottom: var(--dt-spacing-3); }
.mb-4 { margin-bottom: var(--dt-spacing-4); }
.mb-5 { margin-bottom: var(--dt-spacing-5); }
.mb-6 { margin-bottom: var(--dt-spacing-6); }
.ms-0 { margin-left: var(--dt-spacing-0); }
.ms-1 { margin-left: var(--dt-spacing-1); }
.ms-2 { margin-left: var(--dt-spacing-2); }
.ms-3 { margin-left: var(--dt-spacing-3); }
.ms-4 { margin-left: var(--dt-spacing-4); }
.ms-5 { margin-left: var(--dt-spacing-5); }
.ms-6 { margin-left: var(--dt-spacing-6); }
.me-0 { margin-right: var(--dt-spacing-0); }
.me-1 { margin-right: var(--dt-spacing-1); }
.me-2 { margin-right: var(--dt-spacing-2); }
.me-3 { margin-right: var(--dt-spacing-3); }
.me-4 { margin-right: var(--dt-spacing-4); }
.me-5 { margin-right: var(--dt-spacing-5); }
.me-6 { margin-right: var(--dt-spacing-6); }
/* -------------------------------------------------------------- Padding --- */
.p-0 { padding: var(--dt-spacing-0); }
.p-1 { padding: var(--dt-spacing-1); }
.p-2 { padding: var(--dt-spacing-2); }
.p-3 { padding: var(--dt-spacing-3); }
.p-4 { padding: var(--dt-spacing-4); }
.p-5 { padding: var(--dt-spacing-5); }
.p-6 { padding: var(--dt-spacing-6); }
.pt-0 { padding-top: var(--dt-spacing-0); }
.pt-1 { padding-top: var(--dt-spacing-1); }
.pt-2 { padding-top: var(--dt-spacing-2); }
.pt-3 { padding-top: var(--dt-spacing-3); }
.pt-4 { padding-top: var(--dt-spacing-4); }
.pt-5 { padding-top: var(--dt-spacing-5); }
.pt-6 { padding-top: var(--dt-spacing-6); }
.pb-0 { padding-bottom: var(--dt-spacing-0); }
.pb-1 { padding-bottom: var(--dt-spacing-1); }
.pb-2 { padding-bottom: var(--dt-spacing-2); }
.pb-3 { padding-bottom: var(--dt-spacing-3); }
.pb-4 { padding-bottom: var(--dt-spacing-4); }
.pb-5 { padding-bottom: var(--dt-spacing-5); }
.pb-6 { padding-bottom: var(--dt-spacing-6); }
.ps-0 { padding-left: var(--dt-spacing-0); }
.ps-1 { padding-left: var(--dt-spacing-1); }
.ps-2 { padding-left: var(--dt-spacing-2); }
.ps-3 { padding-left: var(--dt-spacing-3); }
.ps-4 { padding-left: var(--dt-spacing-4); }
.ps-5 { padding-left: var(--dt-spacing-5); }
.ps-6 { padding-left: var(--dt-spacing-6); }
.pe-0 { padding-right: var(--dt-spacing-0); }
.pe-1 { padding-right: var(--dt-spacing-1); }
.pe-2 { padding-right: var(--dt-spacing-2); }
.pe-3 { padding-right: var(--dt-spacing-3); }
.pe-4 { padding-right: var(--dt-spacing-4); }
.pe-5 { padding-right: var(--dt-spacing-5); }
.pe-6 { padding-right: var(--dt-spacing-6); }
/* ---------------------------------------------------------------- Floats ---*/
.float-end { float: right; }
.float-start { float: left; }
/* --------------------------------------------------------------- Borders ---*/
.border { border: 1px solid var(--dt-neutral-4); }
.border-top { border-top: 1px solid var(--dt-neutral-4); }
.border-bottom { border-bottom: 1px solid var(--dt-neutral-4); }
.border-start { border-left: 1px solid var(--dt-neutral-4); }
.border-end { border-right: 1px solid var(--dt-neutral-4); }
/* --------------------------------------------------------------- Colors --- */
.bg-neutral-1 { background-color: var(--dt-neutral-1) }
.bg-neutral-2 { background-color: var(--dt-neutral-2) }
.bg-neutral-3 { background-color: var(--dt-neutral-3) }
.bg-neutral-4 { background-color: var(--dt-neutral-4) }
.bg-neutral-5 { background-color: var(--dt-neutral-5) }
.bg-neutral-6 { background-color: var(--dt-neutral-6) }
.color-white { color: white; }
/* ------------------------------------------------------------------ Text ---*/
.fw-bold { font-weight: bold; }
.text-center { text-align: center; }
.text-start { text-align: left; }
.text-end { text-align: right; }
.text-muted { color: var(--dt-neutral-5); }
.fs-1 { font-size: 2.000rem !important; }
.fs-2 { font-size: 1.750rem !important; }
.fs-3 { font-size: 1.500rem !important; }
.fs-4 { font-size: 1.250rem !important; }
.fs-5 { font-size: 1.125rem !important; }
.fs-6 { font-size: 1.000rem !important; }
.fs-7 { font-size: 0.875rem !important; }
.fs-8 { font-size: 0.750rem !important; }
.fs-9 { font-size: 0.625rem !important; }
.fs-10 { font-size: 0.500rem !important; }
/* -------------------------------------------------------------- Display --- */
.d-contents { display: contents; }
.d-inline-block { display: inline-block; }
.d-block { display: block; }
.d-flex { display: flex; }
/* ----------------------------------------------------------------- Flex --- */
.flex-column { flex-direction: column; }
.flex-row { flex-direction: row; }
.flex-grow-1 { flex-grow: 1; }
.gap-0 { gap: var(--dt-spacing-0); }
.gap-1 { gap: var(--dt-spacing-1); }
.gap-2 { gap: var(--dt-spacing-2); }
.gap-3 { gap: var(--dt-spacing-3); }
.gap-4 { gap: var(--dt-spacing-4); }
.gap-5 { gap: var(--dt-spacing-5); }
.gap-6 { gap: var(--dt-spacing-6); }
.align-self-start { align-self: flex-start; }
.align-self-end { align-self: flex-end; }
.align-self-center { align-self: center; }
.align-self-baseline { align-self: baseline; }
.align-self-stretch { align-self: stretch; }
/* ---------------------------------------------------------------- Sizes --- */
.w-100 { width: 100%; }
/* -------------------------------------------------------------- Buttons --- */
.btn {
border: 0px;
padding: var(--dt-spacing-1) var(--dt-spacing-2);
color: white;
border: 1px solid red;
}
.btn-primary { background-color: var(--dt-primary); border-color: var(--dt-primary-darker); }
.btn-secondary { background-color: var(--dt-secondary); border-color: var(--dt-secondary-darker); }
.btn-success { background-color: var(--dt-success); border-color: var(--dt-success-darker); }
.btn-warning { background-color: var(--dt-warning); border-color: var(--dt-warning-darker); }
.btn-danger { background-color: var(--dt-danger); border-color: var(--dt-danger-darker); }
.btn-primary:hover { background-color: var(--dt-primary-darker); }
.btn-secondary:hover { background-color: var(--dt-secondary-darker); }
.btn-success:hover { background-color: var(--dt-success-darker); }
.btn-warning:hover { background-color: var(--dt-warning-darker); }
.btn-danger:hover { background-color: var(--dt-danger-darker); }
.btn-group {
display: flex;
gap: 0px;
}
.btn-group > * {
width: 30px;
height: 30px;
border: 1px solid black;
border-left: none;
text-align: center;
line-height: 41px;
display: block;
color: white;
text-decoration: none;
font-weight: bold;
background-position: center;
background-repeat: no-repeat;
background-size: 15px;
}
.btn-group > :first-child {
border-left: 1px solid black;
}

48
assets/styles/vars.css Normal file
View File

@ -0,0 +1,48 @@
:root {
--dt-primary-darker: hsl(var(--dt-primary-darker-hsl));
--dt-primary: hsl(var(--dt-primary-hsl));
--dt-primary-lighter: hsl(var(--dt-primary-lighter-hsl));
--dt-secondary-darker: hsl(var(--dt-secondary-darker-hsl));
--dt-secondary: hsl(var(--dt-secondary-hsl));
--dt-secondary-lighter: hsl(var(--dt-secondary-lighter-hsl));
--dt-success-darker: hsl(var(--dt-success-darker-hsl));
--dt-success: hsl(var(--dt-success-hsl));
--dt-success-lighter: hsl(var(--dt-success-lighter-hsl));
--dt-warning-darker: hsl(var(--dt-warning-darker-hsl));
--dt-warning: hsl(var(--dt-warning-hsl));
--dt-warning-lighter: hsl(var(--dt-warning-lighter-hsl));
--dt-danger-darker: hsl(var(--dt-danger-darker-hsl));
--dt-danger: hsl(var(--dt-danger-hsl));
--dt-danger-lighter: hsl(var(--dt-danger-lighter-hsl));
--dt-primary-darker-hsl: 226deg 36% 19%;
--dt-primary-hsl: 226deg 36% 39%;
--dt-primary-lighter-hsl: 226deg 36% 59%;
--dt-secondary-darker-hsl: 219deg 87% 37%;
--dt-secondary-hsl: 219deg 87% 57%;
--dt-secondary-lighter-hsl: 219deg 87% 77%;
--dt-success-darker-hsl: 172deg 89% 17%;
--dt-success-hsl: 172deg 89% 37%;
--dt-success-lighter-hsl: 172deg 89% 57%;
--dt-warning-darker-hsl: 38deg 91% 43%;
--dt-warning-hsl: 38deg 91% 63%;
--dt-warning-lighter-hsl: 38deg 91% 83%;
--dt-danger-darker-hsl: 10deg 84% 41%;
--dt-danger-hsl: 10deg 84% 61%;
--dt-danger-lighter-hsl: 10deg 84% 81%;
--dt-neutral-1: hsl(230deg 20% 10%);
--dt-neutral-2: hsl(230deg 10% 20%);
--dt-neutral-3: hsl(230deg 5% 30%);
--dt-neutral-4: hsl(230deg 2% 40%);
--dt-neutral-5: hsl(230deg 1% 50%);
--dt-neutral-6: hsl(230deg 1% 60%);
--dt-spacing-0: 0.00rem;
--dt-spacing-1: 0.25rem;
--dt-spacing-2: 0.50rem;
--dt-spacing-3: 1.00rem;
--dt-spacing-4: 1.50rem;
--dt-spacing-5: 3.00rem;
--dt-spacing-6: 6.00rem;
}

View File

@ -11,6 +11,7 @@
"doctrine/doctrine-bundle": "^2.14", "doctrine/doctrine-bundle": "^2.14",
"doctrine/doctrine-migrations-bundle": "^3.4", "doctrine/doctrine-migrations-bundle": "^3.4",
"doctrine/orm": "^3.3", "doctrine/orm": "^3.3",
"league/commonmark": "^2.6",
"phpdocumentor/reflection-docblock": "^5.6", "phpdocumentor/reflection-docblock": "^5.6",
"phpstan/phpdoc-parser": "^2.1", "phpstan/phpdoc-parser": "^2.1",
"symfony/asset": "7.2.*", "symfony/asset": "7.2.*",
@ -42,7 +43,8 @@
"symfony/validator": "7.2.*", "symfony/validator": "7.2.*",
"symfony/web-link": "7.2.*", "symfony/web-link": "7.2.*",
"symfony/yaml": "7.2.*", "symfony/yaml": "7.2.*",
"twig/extra-bundle": "^2.12|^3.0", "twig/extra-bundle": "^3.20",
"twig/markdown-extra": "^3.20",
"twig/twig": "^2.12|^3.0" "twig/twig": "^2.12|^3.0"
}, },
"config": { "config": {

486
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "f68397016d06f528151706c36312cad7", "content-hash": "266b862176b540dfaa8cfb44566a8161",
"packages": [ "packages": [
{ {
"name": "composer/semver", "name": "composer/semver",
@ -87,6 +87,81 @@
], ],
"time": "2024-09-19T14:15:21+00:00" "time": "2024-09-19T14:15:21+00:00"
}, },
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
"source": {
"type": "git",
"url": "https://github.com/dflydev/dflydev-dot-access-data.git",
"reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^0.12.42",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
"scrutinizer/ocular": "1.6.0",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^4.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Dflydev\\DotAccessData\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Dragonfly Development Inc.",
"email": "info@dflydev.com",
"homepage": "http://dflydev.com"
},
{
"name": "Beau Simensen",
"email": "beau@dflydev.com",
"homepage": "http://beausimensen.com"
},
{
"name": "Carlos Frutos",
"email": "carlos@kiwing.it",
"homepage": "https://github.com/cfrutos"
},
{
"name": "Colin O'Dell",
"email": "colinodell@gmail.com",
"homepage": "https://www.colinodell.com"
}
],
"description": "Given a deep data structure, access data by dot notation.",
"homepage": "https://github.com/dflydev/dflydev-dot-access-data",
"keywords": [
"access",
"data",
"dot",
"notation"
],
"support": {
"issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
"source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
},
"time": "2024-07-08T12:26:09+00:00"
},
{ {
"name": "doctrine/cache", "name": "doctrine/cache",
"version": "2.2.0", "version": "2.2.0",
@ -1369,6 +1444,195 @@
], ],
"time": "2025-03-06T22:45:56+00:00" "time": "2025-03-06T22:45:56+00:00"
}, },
{
"name": "league/commonmark",
"version": "2.6.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/commonmark.git",
"reference": "d990688c91cedfb69753ffc2512727ec646df2ad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad",
"reference": "d990688c91cedfb69753ffc2512727ec646df2ad",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"league/config": "^1.1.1",
"php": "^7.4 || ^8.0",
"psr/event-dispatcher": "^1.0",
"symfony/deprecation-contracts": "^2.1 || ^3.0",
"symfony/polyfill-php80": "^1.16"
},
"require-dev": {
"cebe/markdown": "^1.0",
"commonmark/cmark": "0.31.1",
"commonmark/commonmark.js": "0.31.1",
"composer/package-versions-deprecated": "^1.8",
"embed/embed": "^4.4",
"erusev/parsedown": "^1.0",
"ext-json": "*",
"github/gfm": "0.29.0",
"michelf/php-markdown": "^1.4 || ^2.0",
"nyholm/psr7": "^1.5",
"phpstan/phpstan": "^1.8.2",
"phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
"scrutinizer/ocular": "^1.8.1",
"symfony/finder": "^5.3 | ^6.0 | ^7.0",
"symfony/process": "^5.4 | ^6.0 | ^7.0",
"symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
"unleashedtech/php-coding-standard": "^3.1.1",
"vimeo/psalm": "^4.24.0 || ^5.0.0"
},
"suggest": {
"symfony/yaml": "v2.3+ required if using the Front Matter extension"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.7-dev"
}
},
"autoload": {
"psr-4": {
"League\\CommonMark\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Colin O'Dell",
"email": "colinodell@gmail.com",
"homepage": "https://www.colinodell.com",
"role": "Lead Developer"
}
],
"description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
"homepage": "https://commonmark.thephpleague.com",
"keywords": [
"commonmark",
"flavored",
"gfm",
"github",
"github-flavored",
"markdown",
"md",
"parser"
],
"support": {
"docs": "https://commonmark.thephpleague.com/",
"forum": "https://github.com/thephpleague/commonmark/discussions",
"issues": "https://github.com/thephpleague/commonmark/issues",
"rss": "https://github.com/thephpleague/commonmark/releases.atom",
"source": "https://github.com/thephpleague/commonmark"
},
"funding": [
{
"url": "https://www.colinodell.com/sponsor",
"type": "custom"
},
{
"url": "https://www.paypal.me/colinpodell/10.00",
"type": "custom"
},
{
"url": "https://github.com/colinodell",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/league/commonmark",
"type": "tidelift"
}
],
"time": "2024-12-29T14:10:59+00:00"
},
{
"name": "league/config",
"version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/config.git",
"reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
"reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
"shasum": ""
},
"require": {
"dflydev/dot-access-data": "^3.0.1",
"nette/schema": "^1.2",
"php": "^7.4 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.8.2",
"phpunit/phpunit": "^9.5.5",
"scrutinizer/ocular": "^1.8.1",
"unleashedtech/php-coding-standard": "^3.1",
"vimeo/psalm": "^4.7.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.2-dev"
}
},
"autoload": {
"psr-4": {
"League\\Config\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Colin O'Dell",
"email": "colinodell@gmail.com",
"homepage": "https://www.colinodell.com",
"role": "Lead Developer"
}
],
"description": "Define configuration arrays with strict schemas and access values with dot notation",
"homepage": "https://config.thephpleague.com",
"keywords": [
"array",
"config",
"configuration",
"dot",
"dot-access",
"nested",
"schema"
],
"support": {
"docs": "https://config.thephpleague.com/",
"issues": "https://github.com/thephpleague/config/issues",
"rss": "https://github.com/thephpleague/config/releases.atom",
"source": "https://github.com/thephpleague/config"
},
"funding": [
{
"url": "https://www.colinodell.com/sponsor",
"type": "custom"
},
{
"url": "https://www.paypal.me/colinpodell/10.00",
"type": "custom"
},
{
"url": "https://github.com/colinodell",
"type": "github"
}
],
"time": "2022-12-11T20:36:23+00:00"
},
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
"version": "3.9.0", "version": "3.9.0",
@ -1472,6 +1736,154 @@
], ],
"time": "2025-03-24T10:02:05+00:00" "time": "2025-03-24T10:02:05+00:00"
}, },
{
"name": "nette/schema",
"version": "v1.3.2",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
"reference": "da801d52f0354f70a638673c4a0f04e16529431d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d",
"reference": "da801d52f0354f70a638673c4a0f04e16529431d",
"shasum": ""
},
"require": {
"nette/utils": "^4.0",
"php": "8.1 - 8.4"
},
"require-dev": {
"nette/tester": "^2.5.2",
"phpstan/phpstan-nette": "^1.0",
"tracy/tracy": "^2.8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.3-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
"GPL-2.0-only",
"GPL-3.0-only"
],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/contributors"
}
],
"description": "📐 Nette Schema: validating data structures against a given Schema.",
"homepage": "https://nette.org",
"keywords": [
"config",
"nette"
],
"support": {
"issues": "https://github.com/nette/schema/issues",
"source": "https://github.com/nette/schema/tree/v1.3.2"
},
"time": "2024-10-06T23:10:23+00:00"
},
{
"name": "nette/utils",
"version": "v4.0.6",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
"reference": "ce708655043c7050eb050df361c5e313cf708309"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309",
"reference": "ce708655043c7050eb050df361c5e313cf708309",
"shasum": ""
},
"require": {
"php": "8.0 - 8.4"
},
"conflict": {
"nette/finder": "<3",
"nette/schema": "<1.2.2"
},
"require-dev": {
"jetbrains/phpstorm-attributes": "dev-master",
"nette/tester": "^2.5",
"phpstan/phpstan": "^1.0",
"tracy/tracy": "^2.9"
},
"suggest": {
"ext-gd": "to use Image",
"ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
"ext-json": "to use Nette\\Utils\\Json",
"ext-mbstring": "to use Strings::lower() etc...",
"ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
"GPL-2.0-only",
"GPL-3.0-only"
],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/contributors"
}
],
"description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
"homepage": "https://nette.org",
"keywords": [
"array",
"core",
"datetime",
"images",
"json",
"nette",
"paginator",
"password",
"slugify",
"string",
"unicode",
"utf-8",
"utility",
"validation"
],
"support": {
"issues": "https://github.com/nette/utils/issues",
"source": "https://github.com/nette/utils/tree/v4.0.6"
},
"time": "2025-03-30T21:06:30+00:00"
},
{ {
"name": "phpdocumentor/reflection-common", "name": "phpdocumentor/reflection-common",
"version": "2.2.0", "version": "2.2.0",
@ -7499,6 +7911,78 @@
], ],
"time": "2025-02-08T09:47:15+00:00" "time": "2025-02-08T09:47:15+00:00"
}, },
{
"name": "twig/markdown-extra",
"version": "v3.20.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/markdown-extra.git",
"reference": "f4616e1dd375209dacf6026f846e6b537d036ce4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/f4616e1dd375209dacf6026f846e6b537d036ce4",
"reference": "f4616e1dd375209dacf6026f846e6b537d036ce4",
"shasum": ""
},
"require": {
"php": ">=8.1.0",
"symfony/deprecation-contracts": "^2.5|^3",
"twig/twig": "^3.13|^4.0"
},
"require-dev": {
"erusev/parsedown": "dev-master as 1.x-dev",
"league/commonmark": "^1.0|^2.0",
"league/html-to-markdown": "^4.8|^5.0",
"michelf/php-markdown": "^1.8|^2.0",
"symfony/phpunit-bridge": "^6.4|^7.0"
},
"type": "library",
"autoload": {
"files": [
"Resources/functions.php"
],
"psr-4": {
"Twig\\Extra\\Markdown\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com",
"homepage": "http://fabien.potencier.org",
"role": "Lead Developer"
}
],
"description": "A Twig extension for Markdown",
"homepage": "https://twig.symfony.com",
"keywords": [
"html",
"markdown",
"twig"
],
"support": {
"source": "https://github.com/twigphp/markdown-extra/tree/v3.20.0"
},
"funding": [
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/twig/twig",
"type": "tidelift"
}
],
"time": "2025-01-31T20:45:36+00:00"
},
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v3.20.0", "version": "v3.20.0",

View File

@ -0,0 +1,81 @@
<?php
namespace App\Controller;
use SplFileInfo;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Process\Process;
use Symfony\Component\Routing\Attribute\Route;
final class MainController extends AbstractController
{
#[Route('/sync', 'app_sync')]
public function sync(): Response
{
$gitDir = $this->getParameter('kernel.project_dir') . '/var/data';
new Process(['git', '-C', $gitDir, 'fetch'])->mustRun();
new Process(['git', '-C', $gitDir, 'reset', '--hard', 'FETCH_HEAD'])->mustRun();
return new Response('Updated.');
}
#[Route('/{path}', 'app_index', ['path' => '.+'])]
public function index(string $path): Response
{
$gitDir = $this->getParameter('kernel.project_dir') . '/var/data';
// ---------------------------------------------- Get file contents ---
$fullPath = sprintf(
'%s/var/data/%s',
$this->getParameter('kernel.project_dir'),
$path,
);
$fs = new Filesystem();
if (!$fs->exists($fullPath)) throw $this->createNotFoundException();
$contents = $fs->readFile($fullPath);
// -------------------------------------------------- Get data tree ---
$finder = new Finder();
$finder->files()->in($this->getParameter('kernel.project_dir') . '/var/data/');
if (!$finder->hasResults()) throw $this->createNotFoundException();
// Convert flat list into a nested tree
$tree = [];
foreach ($finder as $file) {
/** @var SplFileInfo $file */
$current = &$tree;
// Dunno why it is undefined, it works
foreach (explode('/', $file->getRelativePath()) as $part) {
if ($part === '') break;
if (!isset($current[$part])) {
$current[$part] = [];
}
$current = &$current[$part];
}
$current[] = $file;
//usort($current, fn($a, $b) => strcmp(implode('/', $a), implode('/', $b)));
}
return $this->render('main/index.html.twig', [
'path' => $path,
'contents' => $contents,
'tree' => $tree,
'version' => new Process(['git', '-C', $gitDir, 'rev-parse', 'HEAD'])->mustRun()->getOutput(),
]);
}
}

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html class="bg-neutral-1 color-white">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title> <title>{% block title %}Welcome!{% endblock %}</title>

View File

@ -0,0 +1,39 @@
{% extends 'base.html.twig' %}
{% block title %}{{ path }} | Gaisen{% endblock %}
{% macro render_tree(tree) %}
<ul>
{% for key, value in tree %}
<li>
{% if value is iterable and value|length > 0 %}
{{ key }}
{{ _self.render_tree(value) }} {# Recursive call #}
{% else %}
<a href="{{ path('app_index', {
path: value.relativePathname
}) }}">
{{ value.filename }}
</a>
{% endif %}
</li>
{% endfor %}
</ul>
{% endmacro %}
{% block body %}
<div class="bg-neutral-3 border-bottom w-100 p-2 fs-1 ps-3">
Gaisen
</div>
<div class="d-flex flex-row">
<div class="border-end bg-neutral-2 p-3">
{{ _self.render_tree(tree) }}
</div>
<div class="p-3">
{{ contents|markdown_to_html }}
</div>
</div>
<div class="bg-neutral-3 border-top w-100 p-2">
Version: <span class="text-muted">{{ version }}</span>
</div>
{% endblock %}