├── .editorconfig ├── .env.example ├── .gitignore ├── README.MD ├── README2.MD ├── app ├── controllers │ └── Controller.php ├── database │ ├── password_resets.yml │ └── users.yml ├── models │ ├── Model.php │ └── User.php ├── routes │ ├── _app.php │ └── index.php └── views │ ├── errors │ ├── 404.html │ └── 500.html │ └── index.blade.php ├── composer.json ├── leaf └── public ├── .htaccess ├── assets ├── css │ └── styles.css ├── img │ └── eclipse.svg └── js │ └── app.js ├── favicon.ico ├── index.php ├── robots.txt └── web.config /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=LEAF_MVC 2 | APP_ENV=local 3 | APP_KEY=base64:AUAyDriQD1kFdIAPIbwTHlnCm2pYn+qxDBa55SFwB9PUzg= 4 | APP_DOWN=false 5 | APP_DEBUG=true 6 | APP_PORT=5500 7 | APP_URL=http://localhost:5500/ 8 | 9 | DB_CONNECTION=mysql 10 | DB_HOST=127.0.0.1 11 | DB_PORT=3306 12 | DB_DATABASE=LEAF_DB_NAME 13 | DB_USERNAME=LEAF_DB_USERNAME 14 | DB_PASSWORD= 15 | DB_CHARSET=utf8 16 | DB_COLLATION=utf8_unicode_ci 17 | # DB_COLLATION=utf8_general_ci 18 | 19 | MAIL_DRIVER=smtp 20 | MAIL_HOST=smtp.mailtrap.io 21 | MAIL_PORT=2525 22 | MAIL_DEBUG=SERVER 23 | MAIL_USERNAME=null 24 | MAIL_PASSWORD=null 25 | MAIL_ENCRYPTION=null 26 | 27 | PROD_SERVER=hello 28 | PROD_PORT=22 29 | PROD_USER=leaf 30 | 31 | SERVER_NAME=LEAF_SERVER 32 | SERVER_PORT=5500 33 | SERVER_USER= 34 | SERVER_PASSWORD= 35 | 36 | APPLICATION_DIR=leaf 37 | APPLICATION_PATH=leaf 38 | 39 | TOKEN_SECRET= 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Packages 2 | composer.phar 3 | vendor 4 | node_modules 5 | 6 | # Environment 7 | .env 8 | .env.backup 9 | .env.production 10 | 11 | # Build 12 | build 13 | dist 14 | compiled 15 | 16 | # System/Editor 17 | .fleet 18 | .idea 19 | .nova 20 | .vscode 21 | .zed 22 | 23 | # Leaf 24 | .hana 25 | .alchemy 26 | hot 27 | storage/framework 28 | storage/logs 29 | storage/database 30 | public/storage 31 | 32 | # Logs 33 | npm-debug.log 34 | yarn-error.log 35 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 |

2 | 3 | Leaf Logo 4 | 5 |

Leaf MVC

6 |

7 | 8 |

9 | Total Downloads 10 | Latest Stable Version 11 | License 12 |

13 | 14 | Leaf MVC is built on top of [leaf php](https://leafphp.dev), and is the framework for people who just want to ship. It gives you the structure and tools of larger frameworks like Laravel and Ruby on Rails with the simplicity and elegance of Leaf which lets you focus on shipping—fast. 15 | 16 | ## Setting up 17 | 18 | You can install Leaf MVC with the [Leaf CLI](https://cli.leafphp.dev) 19 | 20 | ```sh 21 | leaf create --mvc 22 | ``` 23 | 24 | This will create an MVC application for you. Start off your project with authentication, mailing, UI/UX, and a ton of other features using Leaf's [powerful modules](https://leafphp.dev/docs/modules/), and then run your app with: 25 | 26 | ```bash 27 | php leaf serve 28 | ``` 29 | 30 | ## Learning Leaf MVC 31 | 32 | - Leaf MVC is Leaf + an MVC wrapper, we provide a lot of [documentation](https://leafphp.dev/docs/mvc/) on how to use Leaf MVC. 33 | - You can also check out our [youtube channel](https://www.youtube.com/channel/UCllE-GsYy10RkxBUK0HIffw) which has video tutorials on different topics 34 | - Checkout the [learn page](https://leafphp.dev/learn/) on our website for more resources 35 | 36 | ## Contributing 37 | 38 | We are glad to have you. All contributions are welcome! To get started, familiarize yourself with our [contribution guide](https://leafphp.dev/community/contributing.html) and you'll be ready to make your first pull request 🚀. 39 | 40 | To report a security vulnerability, you can reach out to [@mychidarko](https://twitter.com/mychidarko) or [@leafphp](https://twitter.com/leafphp) on twitter. We will coordinate the fix and eventually commit the solution in this project. 41 | 42 | ## Sponsoring Leaf 43 | 44 | Leaf has always been open-source and free, but as the project grows, so do the challenges of maintaining and building new features. The costs—time, resources, and infrastructure—are increasing rapidly, and our small team can no longer sustain this alone. 45 | 46 | To keep Leaf alive and thriving, we need your support now more than ever. Sponsor us on [GitHub Sponsors](https://github.com/sponsors/leafsphp) or visit our [sponsors page](https://leafphp.dev/support/) to explore ways you can contribute. 47 | 48 | Your help makes all the difference—let’s keep Leaf moving forward together! 49 | 50 | And to all our [existing cash/code contributors](https://leafphp.dev#sponsors), we love you all ❤️ 51 | -------------------------------------------------------------------------------- /README2.MD: -------------------------------------------------------------------------------- 1 | # README 2 | 3 | This README would normally document whatever steps are necessary to get the 4 | application up and running. 5 | 6 | Things you may want to cover: 7 | 8 | ## App Info 9 | 10 | Created with Leaf MVC v4 + Leaf v4 11 | 12 | ## Installation 13 | 14 | You can set up your dependencies by running: 15 | 16 | ```bash 17 | composer install 18 | ``` 19 | 20 | ## System dependencies 21 | 22 | To run this application, you need to have: 23 | 24 | - PHP 7.4 or higher 25 | - Composer 26 | 27 | ## Configuration 28 | 29 | ## Database creation 30 | 31 | To create your database, you can run: 32 | 33 | ```bash 34 | php leaf db:migrate 35 | ``` 36 | 37 | ## Deployment instructions 38 | 39 | Check out the [Leaf documentation](https://leafphp.dev/learn/deployment/) for more information on how to deploy your Leaf app. 40 | -------------------------------------------------------------------------------- /app/controllers/Controller.php: -------------------------------------------------------------------------------- 1 | 'datetime', 35 | ]; 36 | } 37 | -------------------------------------------------------------------------------- /app/routes/_app.php: -------------------------------------------------------------------------------- 1 | view('/', 'index'); 4 | -------------------------------------------------------------------------------- /app/routes/index.php: -------------------------------------------------------------------------------- 1 | set404(function() { 14 | // response()->page(ViewsPath("errors/404.html", false), 404); 15 | // }); 16 | 17 | /* 18 | |-------------------------------------------------------------------------- 19 | | Set up 500 handler 20 | |-------------------------------------------------------------------------- 21 | | 22 | | Leaf provides a default 500 page, but you can create your own 23 | | 500 handler by uncommenting the code below. The function 24 | | you set here will be called when a 500 error is encountered 25 | | 26 | */ 27 | // app()->setErrorHandler(function() { 28 | // response()->page(ViewsPath("errors/500.html", false), 500); 29 | // }); 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Set middleware for all routes 34 | |-------------------------------------------------------------------------- 35 | | 36 | | You can use app()->use() to load middleware for all 37 | | routes in your application. 38 | | 39 | */ 40 | // app()->use(ExampleMiddleware::class); 41 | 42 | /* 43 | |-------------------------------------------------------------------------- 44 | | Your application routes 45 | |-------------------------------------------------------------------------- 46 | | 47 | | Leaf MVC automatically loads all files in the routes folder that 48 | | start with "_". We call these files route partials. An example 49 | | partial has been created for you. 50 | | 51 | | If you want to manually load routes, you can 52 | | create a file that doesn't start with "_" and manually require 53 | | it here like so: 54 | | 55 | */ 56 | // require __DIR__ . '/custom-route.php'; 57 | -------------------------------------------------------------------------------- /app/views/errors/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Page Not Found 5 | 6 | 10 | 14 | 23 | 24 | 25 | 26 |

Error 4😵4

27 |

28 | We could not find the page you requested, please check and try again 29 | or Go Back Home 30 |

31 | 32 | 33 | -------------------------------------------------------------------------------- /app/views/errors/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Internal Server Error 5 | 6 | 10 | 14 | 23 | 24 | 25 | 26 |

27 | Error 5😵😵 29 |

30 |

Internal Server Error. Please try again later.

31 | 32 | 33 | -------------------------------------------------------------------------------- /app/views/index.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{ _env('APP_NAME', 'My Leaf MVC App') }} 8 | 9 | 10 | 11 | {{-- @vite('css/app.css') --}} 12 | 13 | 16 | 17 | @alpine 18 | 19 | 20 | 22 |
23 | @includeIf('components.welcome.topnav') 24 | 25 |
26 | 27 |
28 | 158 |
159 | 160 | 214 |
215 | 216 | 217 | 218 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://getcomposer.org/schema.json", 3 | "name": "leafs/mvc", 4 | "description": "A lightweight framework for people who just want to ship", 5 | "type": "project", 6 | "keywords": [ 7 | "framework", 8 | "leaf", 9 | "mvc" 10 | ], 11 | "license": "MIT", 12 | "require": { 13 | "leafs/aloe": "^4.0", 14 | "leafs/blade": "^4.0", 15 | "leafs/mvc-core": "^4.0", 16 | "leafs/leaf": "^4.0", 17 | "leafs/logger": "^4.0" 18 | }, 19 | "require-dev": { 20 | "fakerphp/faker": "^1.24" 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "App\\": "app/", 25 | "Tests\\": "tests/", 26 | "Config\\": "config/", 27 | "App\\Http\\": "app/http/", 28 | "App\\Jobs\\": "app/jobs/", 29 | "App\\Lang\\": "app/lang/", 30 | "App\\Mail\\": "app/mail/", 31 | "App\\Views\\": "app/views/", 32 | "App\\Utils\\": "app/utils/", 33 | "App\\Events\\": "app/events/", 34 | "App\\Models\\": "app/models/", 35 | "App\\Mailers\\": "app/mailers/", 36 | "App\\Workers\\": "app/workers/", 37 | "App\\Console\\": "app/console/", 38 | "App\\Scripts\\": "app/scripts/", 39 | "App\\Helpers\\": "app/helpers/", 40 | "App\\Channels\\": "app/channels/", 41 | "App\\Services\\": "app/services/", 42 | "App\\Database\\": "app/database/", 43 | "App\\Middleware\\": "app/middleware/", 44 | "App\\Components\\": "app/components/", 45 | "App\\Controllers\\": "app/controllers/", 46 | "App\\Notifications\\": "app/notifications/", 47 | "App\\Database\\Seeds\\": "app/database/seeds/", 48 | "App\\Database\\Schema\\": "app/database/schema/", 49 | "App\\Database\\Factories\\": "app/database/factories/" 50 | }, 51 | "exclude-from-classmap": [ 52 | "app/database/migrations" 53 | ] 54 | }, 55 | "scripts": { 56 | "post-root-package-install": [ 57 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"", 58 | "@php -r \"if (file_exists('README2.MD')) {unlink('README.MD'); rename('README2.MD', 'README.MD');}\"" 59 | ], 60 | "post-create-project-cmd": [ 61 | "@php leaf key:generate" 62 | ], 63 | "dev": [ 64 | "Composer\\Config::disableProcessTimeout", 65 | "@php leaf serve --ansi" 66 | ] 67 | }, 68 | "config": { 69 | "optimize-autoloader": true, 70 | "sort-packages": false, 71 | "allow-plugins": { 72 | "pestphp/pest-plugin": true 73 | } 74 | }, 75 | "minimum-stability": "dev", 76 | "prefer-stable": true 77 | } 78 | -------------------------------------------------------------------------------- /leaf: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | load(); 38 | } catch (\Throwable $th) { 39 | trigger_error($th); 40 | } 41 | 42 | /* 43 | |-------------------------------------------------------------------------- 44 | | Boot Aloe Console 45 | |-------------------------------------------------------------------------- 46 | | 47 | | Automatically load your config, paths and commands, 48 | | and then run the console application. 49 | | 50 | */ 51 | Leaf\Core::loadConsole(); 52 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/assets/css/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "Bricolage Grotesque", serif; 3 | font-size: 14px; 4 | } 5 | 6 | *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-bottom-16{bottom:-4rem}.-left-16{left:-4rem}.-top-3{top:-.75rem}.bottom-0{bottom:0}.bottom-24{bottom:6rem}.left-0{left:0}.left-1\/2{left:50%}.left-6{left:1.5rem}.right-0{right:0}.top-0{top:0}.top-1\/2{top:50%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[99\]{z-index:99}.\!row-span-1{grid-row:span 1 / span 1!important}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.-ml-1{margin-left:-.25rem}.-mr-1{margin-right:-.25rem}.-mt-1{margin-top:-.25rem}.mb-6{margin-bottom:1.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-2\.5{margin-right:.625rem}.mr-6{margin-right:1.5rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.\!hidden{display:none!important}.hidden{display:none}.aspect-video{aspect-ratio:16 / 9}.size-12{width:3rem;height:3rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.size-8{width:2rem;height:2rem}.h-10{height:2.5rem}.h-3{height:.75rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-\[18px\]{height:18px}.h-\[70px\]{height:70px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-3{width:.75rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-\[18px\]{width:18px}.w-\[calc\(100\%_\+_8rem\)\]{width:calc(100% + 8rem)}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.min-w-full{min-width:100%}.max-w-7xl{max-width:80rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-top-right{transform-origin:top right}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-full{--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[32px_1fr\]{grid-template-columns:32px 1fr}.\!flex-row{flex-direction:row!important}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-\[rgba\(172\,175\,176\,0\.3\)\]{border-color:#acafb04d}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-700\/10{border-color:#3741511a}.border-b-slate-900\/5{border-bottom-color:#0f172a0d}.bg-\[\#3eaf7c\]\/10{background-color:#3eaf7c1a}.bg-\[\#647eff\]\/10{background-color:#647eff1a}.bg-\[\#F5F8F9\]{--tw-bg-opacity: 1;background-color:rgb(245 248 249 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-green-600\/70{background-color:#16a34ab3}.bg-indigo-600{--tw-bg-opacity: 1;background-color:rgb(79 70 229 / var(--tw-bg-opacity, 1))}.bg-orange-600{--tw-bg-opacity: 1;background-color:rgb(234 88 12 / var(--tw-bg-opacity, 1))}.bg-pink-600{--tw-bg-opacity: 1;background-color:rgb(219 39 119 / var(--tw-bg-opacity, 1))}.bg-red-300{--tw-bg-opacity: 1;background-color:rgb(252 165 165 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400\/10{background-color:#facc151a}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-opacity-75{--tw-bg-opacity: .75}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-white{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #fff var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-green-100{--tw-gradient-to: #dcfce7 var(--tw-gradient-to-position)}.to-white{--tw-gradient-to: #fff var(--tw-gradient-to-position)}.stroke-\[\#3eaf7c\]{stroke:#3eaf7c}.stroke-red-500{stroke:#ef4444}.stroke-slate-900{stroke:#0f172a}.stroke-yellow-400{stroke:#facc15}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-6{padding-bottom:1.5rem}.pl-5{padding-left:1.25rem}.pr-20{padding-right:5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[13px\]{font-size:13px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-sm\/relaxed{font-size:.875rem;line-height:1.625}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.text-xs\/relaxed{font-size:.75rem;line-height:1.625}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#3eaf7c\]{--tw-text-opacity: 1;color:rgb(62 175 124 / var(--tw-text-opacity, 1))}.text-\[\#5e79c7\]{--tw-text-opacity: 1;color:rgb(94 121 199 / var(--tw-text-opacity, 1))}.text-\[\#647eff\]{--tw-text-opacity: 1;color:rgb(100 126 255 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-black\/50{color:#00000080}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_5px_15px_-3px_rgb\(0_0_0_\/_0\.08\)\]{--tw-shadow: 0 5px 15px -3px rgb(0 0 0 / .08);--tw-shadow-colored: 0 5px 15px -3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0px_14px_34px_0px_rgba\(0\,0\,0\,0\.08\)\]{--tw-shadow: 0px 14px 34px 0px rgba(0,0,0,.08);--tw-shadow-colored: 0px 14px 34px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-black{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1))}.ring-gray-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity, 1))}.ring-white\/\[0\.05\]{--tw-ring-color: rgb(255 255 255 / .05)}.ring-opacity-5{--tw-ring-opacity: .05}.blur-xl{--tw-blur: blur(24px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0px_4px_34px_rgba\(0\,0\,0\,0\.06\)\]{--tw-drop-shadow: drop-shadow(0px 4px 34px rgba(0,0,0,.06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0px_4px_34px_rgba\(0\,0\,0\,0\.25\)\]{--tw-drop-shadow: drop-shadow(0px 4px 34px rgba(0,0,0,.25));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.hover\:bg-green-500:hover{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.hover\:bg-green-600\/50:hover{background-color:#16a34a80}.hover\:text-black:hover{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.hover\:text-black\/70:hover{color:#000000b3}.hover\:text-gray-100:hover{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.hover\:text-gray-500:hover{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.hover\:text-indigo-900:hover{--tw-text-opacity: 1;color:rgb(49 46 129 / var(--tw-text-opacity, 1))}.hover\:ring-\[\#42d392\]\/40:hover{--tw-ring-color: rgb(66 211 146 / .4)}.hover\:ring-\[\#647eff\]\/50:hover{--tw-ring-color: rgb(100 126 255 / .5)}.hover\:ring-red-500\/40:hover{--tw-ring-color: rgb(239 68 68 / .4)}.hover\:ring-yellow-400\/50:hover{--tw-ring-color: rgb(250 204 21 / .5)}.focus\:text-gray-800:focus{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-\[\#3eaf7c\]:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(62 175 124 / var(--tw-ring-opacity, 1))}@media (min-width: 640px){.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:mb-6{margin-bottom:1.5rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mr-6{margin-right:1.5rem}.sm\:mt-6{margin-top:1.5rem}.sm\:size-16{width:4rem;height:4rem}.sm\:size-6{width:1.5rem;height:1.5rem}.sm\:w-\[350px\]{width:350px}.sm\:max-w-xs{max-width:20rem}.sm\:flex-row{flex-direction:row}.sm\:justify-between{justify-content:space-between}.sm\:rounded-lg{border-radius:.5rem}.sm\:rounded-md{border-radius:.375rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-5{padding-top:1.25rem}}@media (min-width: 768px){.md\:row-span-3{grid-row:span 3 / span 3}.md\:mt-12{margin-top:3rem}.md\:mt-8{margin-top:2rem}.md\:flex{display:flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:items-center{align-items:center}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}}@media (min-width: 1024px){.lg\:static{position:static}.lg\:inset-0{top:0;right:0;bottom:0;left:0}.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:ml-8{margin-left:2rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:gap-8{gap:2rem}.lg\:border-l{border-left-width:1px}.lg\:border-slate-400\/15{border-color:#94a3b826}.lg\:p-10{padding:2.5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pb-10{padding-bottom:2.5rem}.lg\:pl-8{padding-left:2rem}.lg\:pt-0{padding-top:0}}@media (min-width: 1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.xl\:gap-16{gap:4rem}}@media (prefers-color-scheme: dark){.dark\:block{display:block}.dark\:hidden{display:none}.dark\:border-\[\#001e26\]{--tw-border-opacity: 1;border-color:rgb(0 30 38 / var(--tw-border-opacity, 1))}.dark\:border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.dark\:bg-\[\#001318\]{--tw-bg-opacity: 1;background-color:rgb(0 19 24 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#001e26\]{--tw-bg-opacity: 1;background-color:rgb(0 30 38 / var(--tw-bg-opacity, 1))}.dark\:from-\[\#001e26\]{--tw-gradient-from: #001e26 var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 30 38 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:from-\[\#102e36\]{--tw-gradient-from: #102e36 var(--tw-gradient-from-position);--tw-gradient-to: rgb(16 46 54 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:via-\[\#001318\]{--tw-gradient-to: rgb(0 19 24 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #001318 var(--tw-gradient-via-position), var(--tw-gradient-to)}.dark\:to-\[\#001318\]{--tw-gradient-to: #001318 var(--tw-gradient-to-position)}.dark\:to-\[\#001e26\]{--tw-gradient-to: #001e26 var(--tw-gradient-to-position)}.dark\:text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.dark\:text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:text-white\/50{color:#ffffff80}.dark\:ring-gray-800{--tw-ring-opacity: 1;--tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity, 1))}.dark\:hover\:bg-\[\#001e26\]:hover{--tw-bg-opacity: 1;background-color:rgb(0 30 38 / var(--tw-bg-opacity, 1))}.dark\:hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:hover\:text-white\/70:hover{color:#ffffffb3}.dark\:focus-visible\:ring-\[\#3eaf7c\]:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(62 175 124 / var(--tw-ring-opacity, 1))}} 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/assets/img/eclipse.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/assets/js/app.js: -------------------------------------------------------------------------------- 1 | console.log('Hello World from app.js'); 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leafsphp/leafMVC/9a1cf95f93f629c427095a59ba51c91c645c07d4/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | load(); 37 | } catch (\Throwable $th) { 38 | trigger_error($th); 39 | } 40 | 41 | /* 42 | |-------------------------------------------------------------------------- 43 | | Load application paths 44 | |-------------------------------------------------------------------------- 45 | | 46 | | Decline static file requests back to the PHP built-in webserver 47 | | 48 | */ 49 | if (php_sapi_name() === 'cli-server') { 50 | $path = realpath(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); 51 | 52 | if (is_string($path) && __FILE__ !== $path && is_file($path)) { 53 | return false; 54 | } 55 | 56 | unset($path); 57 | } 58 | 59 | /* 60 | |-------------------------------------------------------------------------- 61 | | Run your Leaf MVC application 62 | |-------------------------------------------------------------------------- 63 | | 64 | | This line brings in all your routes and starts your application 65 | | 66 | */ 67 | \Leaf\Core::runApplication(); 68 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | --------------------------------------------------------------------------------