From fef952edab705a446d4c8d4a26d775ee5a9c62ba Mon Sep 17 00:00:00 2001 From: Javier Feliz Date: Wed, 20 Aug 2025 19:31:08 -0400 Subject: [PATCH] Progress --- app/Commands/ParseConfigCommand.php | 20 +- app/Models/Page.php | 127 ++++-- app/helpers.php | 32 +- bun.lock | 3 + package-lock.json | 651 ++++++++++++++++++++++++++++ package.json | 4 +- zap.yml | 10 +- 7 files changed, 805 insertions(+), 42 deletions(-) create mode 100644 package-lock.json diff --git a/app/Commands/ParseConfigCommand.php b/app/Commands/ParseConfigCommand.php index 9d07b60..668d4cd 100644 --- a/app/Commands/ParseConfigCommand.php +++ b/app/Commands/ParseConfigCommand.php @@ -4,6 +4,7 @@ namespace App\Commands; use App\Build\SiteParser; use App\Models\ContentCollection; +use App\Models\Page; use App\SiteConfiguration; use Illuminate\Console\Scheduling\Schedule; use LaravelZero\Framework\Commands\Command; @@ -30,13 +31,16 @@ class ParseConfigCommand extends Command */ public function handle() { - // $col = new ContentCollection("projects"); - // dd(SiteConfiguration::collections()); - foreach ((new SiteParser)->getPages() as $p) { - $this->info($p->key); - $this->warn("- " . $p->entityName); - $this->warn("- " . $p->collection); - $this->warn("- " . $p->layout); - } + dd(collectionPages('projects')); + // dd(new Page("projects/authentikate/docs/quick-start/index.md")); + // dd(new Page("projects/flowtodo.md")); + // foreach ((new SiteParser)->getPages() as $p) { + // $this->info($p->key); + // $this->warn("- Entity Name: " . $p->entityName); + // $this->warn("- Collection: " . $p->collection); + // $this->warn("- Layout: " . $p->layout); + // var_dump($p->collectionProps); + // var_dump($p->collectionHierarchy); + // } } } diff --git a/app/Models/Page.php b/app/Models/Page.php index 278896c..16ab35d 100644 --- a/app/Models/Page.php +++ b/app/Models/Page.php @@ -23,17 +23,22 @@ use function Illuminate\Filesystem\join_paths; class Page { public string $filename; + public string $fileBaseName; // Name of the file with extension removed public string $fileExtension; public string $directory; public string $title; public string $slug; - public bool $isIndex; + public bool $isIndex = false; + public bool $isNestedIndex = false; public string $key; protected Filesystem $sourceDisk; public ?string $layout; - public ?string $collection = null; public string $entityName; // The name of this page. Ex: projects/myproject = myproject 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) { @@ -42,47 +47,95 @@ class Page $this->filename = basename($this->path); $this->fileExtension = (str_ends_with($this->filename, '.blade.php')) ? 'blade.php' : pathinfo($this->filename, PATHINFO_EXTENSION); $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->slug = str($this->title)->slug(); - $this->isIndex = str($this->filename)->remove("." . $this->fileExtension)->toString() == "index"; $this->directory = dirname($this->path); $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->detectCollection(); $this->fillAdditionalData(); } - // TODO: Do something with the [params] - // from the collection name if present. - // Maybe store it in a $collectionParams - // array on the page or something. + public function __get($name) + { + if (!empty($this->$name)) { + return $this->name; + } + return $this->collectionProps[$name] ?? null; + } + public function detectCollection() { $key_parts = explode('.', $this->key); $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) { - $parts = explode('.', $c); - // If we have key: projects.something - // and collection projects.[project_name].docs - // then it's not it - if (count($parts) > $key_parts) { - continue; - } - + $parts = $c['parts']; // Get a subset of max length key parts $key_compare = array_slice($key_parts, 0, count($parts)); + $props = []; $match = true; foreach ($key_compare as $i => $v) { - // TODO: Use regex here to search for [] instead of just [ - if ($v !== $parts[$i] && !str($parts[$i])->contains("[")) { + $check = $parts[$i]; + // 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; 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() { - // If we have a collection, get the settings from it - if (!empty($this->collection)) { - $config = SiteConfiguration::getConfig()['collections'][$this->collection]; - - $fillIfEmpty = ['layout']; - - foreach ($fillIfEmpty as $field) { - if (empty($this->$field) && !empty($config[$field])) { - $this->$field = $config[$field]; - } - } + // Apply collection settings in a hierarchical + // manner, with the settings from the most + // matched collection taking precedence + // over the least. + foreach ($this->collectionHierarchy as $collection) { + $this->applyCollectionSettings($collection); } - // 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') { // Build the markdown parser $mdEnvironment = new Environment(); @@ -150,6 +207,16 @@ class Page 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 { if (!empty($this->content)) { diff --git a/app/helpers.php b/app/helpers.php index 45b871a..0768d4e 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -1,6 +1,34 @@ '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; } diff --git a/bun.lock b/bun.lock index 2fd34a8..9a5474c 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "dependencies": { "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.1.12", + "@tailwindplus/elements": "^1.0.9", "tailwindcss": "^4.1.12", }, "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=="], + "@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=="], "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3cf2819 --- /dev/null +++ b/package-lock.json @@ -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" + } + } + } +} diff --git a/package.json b/package.json index b29c20d..395c7de 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,11 @@ "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" } -} \ No newline at end of file +} diff --git a/zap.yml b/zap.yml index 87165e1..d1348be 100644 --- a/zap.yml +++ b/zap.yml @@ -9,4 +9,12 @@ collections: layout: docs schema: - title: string - - section: string \ No newline at end of file + - section: string + projects.[project_name].docs.[section]: + layout: docs + schema: + - title: string + - section: string + guides: + schema: + - category: string