This commit is contained in:
Javier Feliz 2025-08-20 19:31:08 -04:00
parent 309d01693c
commit fef952edab
7 changed files with 805 additions and 42 deletions

View File

@ -4,6 +4,7 @@ namespace App\Commands;
use App\Build\SiteParser; use App\Build\SiteParser;
use App\Models\ContentCollection; use App\Models\ContentCollection;
use App\Models\Page;
use App\SiteConfiguration; use App\SiteConfiguration;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use LaravelZero\Framework\Commands\Command; use LaravelZero\Framework\Commands\Command;
@ -30,13 +31,16 @@ class ParseConfigCommand extends Command
*/ */
public function handle() public function handle()
{ {
// $col = new ContentCollection("projects"); dd(collectionPages('projects'));
// dd(SiteConfiguration::collections()); // dd(new Page("projects/authentikate/docs/quick-start/index.md"));
foreach ((new SiteParser)->getPages() as $p) { // dd(new Page("projects/flowtodo.md"));
$this->info($p->key); // foreach ((new SiteParser)->getPages() as $p) {
$this->warn("- " . $p->entityName); // $this->info($p->key);
$this->warn("- " . $p->collection); // $this->warn("- Entity Name: " . $p->entityName);
$this->warn("- " . $p->layout); // $this->warn("- Collection: " . $p->collection);
} // $this->warn("- Layout: " . $p->layout);
// var_dump($p->collectionProps);
// var_dump($p->collectionHierarchy);
// }
} }
} }

View File

@ -23,17 +23,22 @@ use function Illuminate\Filesystem\join_paths;
class Page class Page
{ {
public string $filename; public string $filename;
public string $fileBaseName; // Name of the file with extension removed
public string $fileExtension; public string $fileExtension;
public string $directory; public string $directory;
public string $title; public string $title;
public string $slug; public string $slug;
public bool $isIndex; public bool $isIndex = false;
public bool $isNestedIndex = false;
public string $key; public string $key;
protected Filesystem $sourceDisk; protected Filesystem $sourceDisk;
public ?string $layout; public ?string $layout;
public ?string $collection = null;
public string $entityName; // The name of this page. Ex: projects/myproject = myproject public string $entityName; // The name of this page. Ex: projects/myproject = myproject
protected string $content; protected string $content;
// Collection data
public ?string $collection = null;
public array $collectionHierarchy = []; // All collections matched from least to most
public array $collectionProps = [];
public function __construct(public string $path) public function __construct(public string $path)
{ {
@ -42,47 +47,95 @@ class Page
$this->filename = basename($this->path); $this->filename = basename($this->path);
$this->fileExtension = (str_ends_with($this->filename, '.blade.php')) ? 'blade.php' : pathinfo($this->filename, PATHINFO_EXTENSION); $this->fileExtension = (str_ends_with($this->filename, '.blade.php')) ? 'blade.php' : pathinfo($this->filename, PATHINFO_EXTENSION);
$this->fileExtension = str($this->fileExtension)->trim('.')->toString(); $this->fileExtension = str($this->fileExtension)->trim('.')->toString();
$this->fileBaseName = str($this->filename)->remove("." . $this->fileExtension)->toString();
$this->title = str($this->filename)->remove("." . $this->fileExtension)->title()->toString(); $this->title = str($this->filename)->remove("." . $this->fileExtension)->title()->toString();
$this->slug = str($this->title)->slug(); $this->slug = str($this->title)->slug();
$this->isIndex = str($this->filename)->remove("." . $this->fileExtension)->toString() == "index";
$this->directory = dirname($this->path); $this->directory = dirname($this->path);
$this->key = str($this->path)->remove("." . $this->fileExtension)->replace("/", ".")->lower()->toString(); $this->key = str($this->path)->remove("." . $this->fileExtension)->replace("/", ".")->lower()->toString();
if ($this->fileBaseName == "index") {
$this->isIndex = true;
$this->isNestedIndex = true;
}
$this->entityName = $this->isIndex ? basename($this->directory) : $this->slug; $this->entityName = $this->isIndex ? basename($this->directory) : $this->slug;
$this->detectCollection(); $this->detectCollection();
$this->fillAdditionalData(); $this->fillAdditionalData();
} }
// TODO: Do something with the [params] public function __get($name)
// from the collection name if present. {
// Maybe store it in a $collectionParams if (!empty($this->$name)) {
// array on the page or something. return $this->name;
}
return $this->collectionProps[$name] ?? null;
}
public function detectCollection() public function detectCollection()
{ {
$key_parts = explode('.', $this->key); $key_parts = explode('.', $this->key);
$collections = SiteConfiguration::collections(); $collections = SiteConfiguration::collections();
// Turn collections into an array containing
// the parts and the length so we can easily
// filter likely matches.
$collections = collect($collections)->map(function ($name) {
$parts = explode('.', $name);
return [
'name' => $name,
'parts' => $parts,
'length' => count($parts)
];
})
->filter(fn($col) => $col['length'] <= count($key_parts))
->sortBy('length');
foreach ($collections as $c) { foreach ($collections as $c) {
$parts = explode('.', $c); $parts = $c['parts'];
// If we have key: projects.something
// and collection projects.[project_name].docs
// then it's not it
if (count($parts) > $key_parts) {
continue;
}
// Get a subset of max length key parts // Get a subset of max length key parts
$key_compare = array_slice($key_parts, 0, count($parts)); $key_compare = array_slice($key_parts, 0, count($parts));
$props = [];
$match = true; $match = true;
foreach ($key_compare as $i => $v) { foreach ($key_compare as $i => $v) {
// TODO: Use regex here to search for [] instead of just [ $check = $parts[$i];
if ($v !== $parts[$i] && !str($parts[$i])->contains("[")) { // Check if it's a parameter like [project_name]
if (str($check)->isMatch('/\[[a-z_]+\]/')) {
$key = str($check)->remove(['[', ']'])->toString();
$props[$key] = $v;
continue;
}
if ($v !== $check) {
$match = false; $match = false;
break; break;
} }
} }
if ($match) $this->collection = $c; if ($match) {
$this->collectionHierarchy[] = $c['name'];
$this->collection = $c['name'];
$this->collectionProps = $props;
}
}
// After detecting the collection, we can also
// determine if the file is an index in that
// collection. Example:
// collection = projects
// file path = projects/myproject.md
if (str($this->key)->remove($this->collection)->remove(".") == $this->fileBaseName) {
$this->isIndex = true;
}
}
public function applyCollectionSettings(string $collection)
{
$config = SiteConfiguration::getConfig()['collections'][$collection];
$fill = ['layout'];
foreach ($fill as $field) {
$this->$field = $config[$field];
} }
} }
@ -95,20 +148,24 @@ class Page
*/ */
public function fillAdditionalData() public function fillAdditionalData()
{ {
// If we have a collection, get the settings from it // Apply collection settings in a hierarchical
if (!empty($this->collection)) { // manner, with the settings from the most
$config = SiteConfiguration::getConfig()['collections'][$this->collection]; // matched collection taking precedence
// over the least.
$fillIfEmpty = ['layout']; foreach ($this->collectionHierarchy as $collection) {
$this->applyCollectionSettings($collection);
foreach ($fillIfEmpty as $field) {
if (empty($this->$field) && !empty($config[$field])) {
$this->$field = $config[$field];
}
}
} }
// Grab front matter data if any // After the hierarchy, also apply settings
// from the detected collection to be
// safe.
if (!empty($this->collection)) {
$this->applyCollectionSettings($collection);
}
// Grab front matter data if any. Apply any settings
// from it since it takes precedence over
// collection settings.
if ($this->fileExtension == 'md') { if ($this->fileExtension == 'md') {
// Build the markdown parser // Build the markdown parser
$mdEnvironment = new Environment(); $mdEnvironment = new Environment();
@ -150,6 +207,16 @@ class Page
return join_paths($baseDirectory, "{$this->slug}", "index.html"); return join_paths($baseDirectory, "{$this->slug}", "index.html");
} }
public function url(): string
{
$baseDirectory = $this->directory;
if ($this->isIndex && $this->isNestedIndex) {
return str($this->directory)->prepend("/");
}
return str(join_paths($baseDirectory, "{$this->slug}"))->prepend("/");
}
public function content(): string public function content(): string
{ {
if (!empty($this->content)) { if (!empty($this->content)) {

View File

@ -1,6 +1,34 @@
<?php <?php
function yatusabe() use App\Build\SiteParser;
use Illuminate\Support\Collection;
// TODO: Have to make site parser a singleton
/**
* Get the pages belonging to a collection. If props
* are passed, also filter by those.
*
* Example:
* $collection = projects.[project_name].docs
* $props = ['project_name' => 'myproject']
*
* @param string $collection
* @param array $props
* @param bool $loose
* @return Collection<\App\Models\Page>
*/
function collectionPages(string $collection, array $props = [], bool $loose = false): Collection
{ {
return "worked papo"; $pages = (new SiteParser)->getPages();
if ($loose) {
$pages = $pages->filter(fn($p) => in_array($collection, $p->collectionHierarchy));
} else {
$pages = $pages->where('collection', $collection);
}
foreach ($props as $k => $v) {
$pages = $pages->filter(fn($p) => $p->collectionProps[$k] == $v);
}
return $pages;
} }

View File

@ -5,6 +5,7 @@
"dependencies": { "dependencies": {
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@tailwindcss/vite": "^4.1.12", "@tailwindcss/vite": "^4.1.12",
"@tailwindplus/elements": "^1.0.9",
"tailwindcss": "^4.1.12", "tailwindcss": "^4.1.12",
}, },
"devDependencies": { "devDependencies": {
@ -149,6 +150,8 @@
"@tailwindcss/vite": ["@tailwindcss/vite@4.1.12", "", { "dependencies": { "@tailwindcss/node": "4.1.12", "@tailwindcss/oxide": "4.1.12", "tailwindcss": "4.1.12" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ=="], "@tailwindcss/vite": ["@tailwindcss/vite@4.1.12", "", { "dependencies": { "@tailwindcss/node": "4.1.12", "@tailwindcss/oxide": "4.1.12", "tailwindcss": "4.1.12" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ=="],
"@tailwindplus/elements": ["@tailwindplus/elements@1.0.9", "", {}, "sha512-QRJ/GdkHnMArYaM3/zFcB913xL/QMaP32Odg8GWKzeolcL5uFH4xvZ/DHQwTLRHJyZn44xmaNXBx7l0OM8VHQg=="],
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
"chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],

651
package-lock.json generated Normal file
View File

@ -0,0 +1,651 @@
{
"name": "zap",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"@tailwindcss/typography": "^0.5.16",
"@tailwindcss/vite": "^4.1.12",
"@tailwindplus/elements": "^1.0.9",
"basecoat-css": "^0.3.2",
"tailwindcss": "^4.1.12"
},
"devDependencies": {
"vite": "^7.1.2"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.25.9",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@isaacs/fs-minipass": {
"version": "4.0.1",
"license": "ISC",
"dependencies": {
"minipass": "^7.0.4"
},
"engines": {
"node": ">=18.0.0"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/remapping": {
"version": "2.3.5",
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.30",
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.46.3",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.46.3",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@tailwindcss/node": {
"version": "4.1.12",
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
"enhanced-resolve": "^5.18.3",
"jiti": "^2.5.1",
"lightningcss": "1.30.1",
"magic-string": "^0.30.17",
"source-map-js": "^1.2.1",
"tailwindcss": "4.1.12"
}
},
"node_modules/@tailwindcss/oxide": {
"version": "4.1.12",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"detect-libc": "^2.0.4",
"tar": "^7.4.3"
},
"engines": {
"node": ">= 10"
},
"optionalDependencies": {
"@tailwindcss/oxide-android-arm64": "4.1.12",
"@tailwindcss/oxide-darwin-arm64": "4.1.12",
"@tailwindcss/oxide-darwin-x64": "4.1.12",
"@tailwindcss/oxide-freebsd-x64": "4.1.12",
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12",
"@tailwindcss/oxide-linux-arm64-gnu": "4.1.12",
"@tailwindcss/oxide-linux-arm64-musl": "4.1.12",
"@tailwindcss/oxide-linux-x64-gnu": "4.1.12",
"@tailwindcss/oxide-linux-x64-musl": "4.1.12",
"@tailwindcss/oxide-wasm32-wasi": "4.1.12",
"@tailwindcss/oxide-win32-arm64-msvc": "4.1.12",
"@tailwindcss/oxide-win32-x64-msvc": "4.1.12"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
"version": "4.1.12",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
"version": "4.1.12",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/typography": {
"version": "0.5.16",
"license": "MIT",
"dependencies": {
"lodash.castarray": "^4.4.0",
"lodash.isplainobject": "^4.0.6",
"lodash.merge": "^4.6.2",
"postcss-selector-parser": "6.0.10"
},
"peerDependencies": {
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
}
},
"node_modules/@tailwindcss/vite": {
"version": "4.1.12",
"license": "MIT",
"dependencies": {
"@tailwindcss/node": "4.1.12",
"@tailwindcss/oxide": "4.1.12",
"tailwindcss": "4.1.12"
},
"peerDependencies": {
"vite": "^5.2.0 || ^6 || ^7"
}
},
"node_modules/@tailwindplus/elements": {
"version": "1.0.9",
"license": "SEE LICENSE IN LICENSE.md"
},
"node_modules/@types/estree": {
"version": "1.0.8",
"license": "MIT"
},
"node_modules/basecoat-css": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/basecoat-css/-/basecoat-css-0.3.2.tgz",
"integrity": "sha512-WLdyYnyLU4kr3rZNl5n4YG0i3YUamYIISjpip0ipah9l4wwbmEEB/3v/K3l4tKCYg3PaEaallnvs04ZfxHZ7YQ==",
"license": "MIT"
},
"node_modules/chownr": {
"version": "3.0.0",
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=18"
}
},
"node_modules/cssesc": {
"version": "3.0.0",
"license": "MIT",
"bin": {
"cssesc": "bin/cssesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/detect-libc": {
"version": "2.0.4",
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
},
"node_modules/enhanced-resolve": {
"version": "5.18.3",
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/esbuild": {
"version": "0.25.9",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.25.9",
"@esbuild/android-arm": "0.25.9",
"@esbuild/android-arm64": "0.25.9",
"@esbuild/android-x64": "0.25.9",
"@esbuild/darwin-arm64": "0.25.9",
"@esbuild/darwin-x64": "0.25.9",
"@esbuild/freebsd-arm64": "0.25.9",
"@esbuild/freebsd-x64": "0.25.9",
"@esbuild/linux-arm": "0.25.9",
"@esbuild/linux-arm64": "0.25.9",
"@esbuild/linux-ia32": "0.25.9",
"@esbuild/linux-loong64": "0.25.9",
"@esbuild/linux-mips64el": "0.25.9",
"@esbuild/linux-ppc64": "0.25.9",
"@esbuild/linux-riscv64": "0.25.9",
"@esbuild/linux-s390x": "0.25.9",
"@esbuild/linux-x64": "0.25.9",
"@esbuild/netbsd-arm64": "0.25.9",
"@esbuild/netbsd-x64": "0.25.9",
"@esbuild/openbsd-arm64": "0.25.9",
"@esbuild/openbsd-x64": "0.25.9",
"@esbuild/openharmony-arm64": "0.25.9",
"@esbuild/sunos-x64": "0.25.9",
"@esbuild/win32-arm64": "0.25.9",
"@esbuild/win32-ia32": "0.25.9",
"@esbuild/win32-x64": "0.25.9"
}
},
"node_modules/fdir": {
"version": "6.5.0",
"license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"license": "ISC"
},
"node_modules/jiti": {
"version": "2.5.1",
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
},
"node_modules/lightningcss": {
"version": "1.30.1",
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
},
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
"lightningcss-darwin-arm64": "1.30.1",
"lightningcss-darwin-x64": "1.30.1",
"lightningcss-freebsd-x64": "1.30.1",
"lightningcss-linux-arm-gnueabihf": "1.30.1",
"lightningcss-linux-arm64-gnu": "1.30.1",
"lightningcss-linux-arm64-musl": "1.30.1",
"lightningcss-linux-x64-gnu": "1.30.1",
"lightningcss-linux-x64-musl": "1.30.1",
"lightningcss-win32-arm64-msvc": "1.30.1",
"lightningcss-win32-x64-msvc": "1.30.1"
}
},
"node_modules/lightningcss-linux-x64-gnu": {
"version": "1.30.1",
"cpu": [
"x64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-x64-musl": {
"version": "1.30.1",
"cpu": [
"x64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lodash.castarray": {
"version": "4.4.0",
"license": "MIT"
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"license": "MIT"
},
"node_modules/magic-string": {
"version": "0.30.17",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/minipass": {
"version": "7.1.2",
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/minizlib": {
"version": "3.0.2",
"license": "MIT",
"dependencies": {
"minipass": "^7.1.2"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/mkdirp": {
"version": "3.0.1",
"license": "MIT",
"bin": {
"mkdirp": "dist/cjs/src/bin.js"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/nanoid": {
"version": "3.3.11",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/picocolors": {
"version": "1.1.1",
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.3",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/postcss": {
"version": "8.5.6",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.10",
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/rollup": {
"version": "4.46.3",
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.8"
},
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=18.0.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.46.3",
"@rollup/rollup-android-arm64": "4.46.3",
"@rollup/rollup-darwin-arm64": "4.46.3",
"@rollup/rollup-darwin-x64": "4.46.3",
"@rollup/rollup-freebsd-arm64": "4.46.3",
"@rollup/rollup-freebsd-x64": "4.46.3",
"@rollup/rollup-linux-arm-gnueabihf": "4.46.3",
"@rollup/rollup-linux-arm-musleabihf": "4.46.3",
"@rollup/rollup-linux-arm64-gnu": "4.46.3",
"@rollup/rollup-linux-arm64-musl": "4.46.3",
"@rollup/rollup-linux-loongarch64-gnu": "4.46.3",
"@rollup/rollup-linux-ppc64-gnu": "4.46.3",
"@rollup/rollup-linux-riscv64-gnu": "4.46.3",
"@rollup/rollup-linux-riscv64-musl": "4.46.3",
"@rollup/rollup-linux-s390x-gnu": "4.46.3",
"@rollup/rollup-linux-x64-gnu": "4.46.3",
"@rollup/rollup-linux-x64-musl": "4.46.3",
"@rollup/rollup-win32-arm64-msvc": "4.46.3",
"@rollup/rollup-win32-ia32-msvc": "4.46.3",
"@rollup/rollup-win32-x64-msvc": "4.46.3",
"fsevents": "~2.3.2"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/tailwindcss": {
"version": "4.1.12",
"license": "MIT"
},
"node_modules/tapable": {
"version": "2.2.2",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/tar": {
"version": "7.4.3",
"license": "ISC",
"dependencies": {
"@isaacs/fs-minipass": "^4.0.0",
"chownr": "^3.0.0",
"minipass": "^7.1.2",
"minizlib": "^3.0.1",
"mkdirp": "^3.0.1",
"yallist": "^5.0.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/tinyglobby": {
"version": "0.2.14",
"license": "MIT",
"dependencies": {
"fdir": "^6.4.4",
"picomatch": "^4.0.2"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"license": "MIT"
},
"node_modules/vite": {
"version": "7.1.2",
"license": "MIT",
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.6",
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
"rollup": "^4.43.0",
"tinyglobby": "^0.2.14"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
},
"peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0",
"jiti": ">=1.21.0",
"less": "^4.0.0",
"lightningcss": "^1.21.0",
"sass": "^1.70.0",
"sass-embedded": "^1.70.0",
"stylus": ">=0.54.8",
"sugarss": "^5.0.0",
"terser": "^5.16.0",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"jiti": {
"optional": true
},
"less": {
"optional": true
},
"lightningcss": {
"optional": true
},
"sass": {
"optional": true
},
"sass-embedded": {
"optional": true
},
"stylus": {
"optional": true
},
"sugarss": {
"optional": true
},
"terser": {
"optional": true
},
"tsx": {
"optional": true
},
"yaml": {
"optional": true
}
}
},
"node_modules/yallist": {
"version": "5.0.0",
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=18"
}
}
}
}

View File

@ -7,9 +7,11 @@
"dependencies": { "dependencies": {
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@tailwindcss/vite": "^4.1.12", "@tailwindcss/vite": "^4.1.12",
"@tailwindplus/elements": "^1.0.9",
"basecoat-css": "^0.3.2",
"tailwindcss": "^4.1.12" "tailwindcss": "^4.1.12"
}, },
"devDependencies": { "devDependencies": {
"vite": "^7.1.2" "vite": "^7.1.2"
} }
} }

10
zap.yml
View File

@ -9,4 +9,12 @@ collections:
layout: docs layout: docs
schema: schema:
- title: string - title: string
- section: string - section: string
projects.[project_name].docs.[section]:
layout: docs
schema:
- title: string
- section: string
guides:
schema:
- category: string