├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── README.md ├── app ├── Actions │ ├── Fortify │ │ ├── CreateNewUser.php │ │ ├── PasswordValidationRules.php │ │ ├── ResetUserPassword.php │ │ ├── UpdateUserPassword.php │ │ └── UpdateUserProfileInformation.php │ ├── Jetstream │ │ └── DeleteUser.php │ └── Social │ │ ├── Contracts │ │ └── CreatesUser.php │ │ └── CreateXUser.php ├── Enums │ ├── ArticleStatus.php │ ├── OrderStatus.php │ ├── ProductStatus.php │ └── ProductVariantType.php ├── Factories │ └── Social │ │ └── CreateUserFactory.php ├── Filament │ ├── Fabricator │ │ ├── Layouts │ │ │ └── DefaultLayout.php │ │ └── PageBlocks │ │ │ ├── ArticleBlock.php │ │ │ └── CarouselBlock.php │ ├── Pages │ │ └── Dashboard.php │ ├── Resources │ │ ├── ArticleResource.php │ │ ├── ArticleResource │ │ │ └── Pages │ │ │ │ ├── CreateArticle.php │ │ │ │ ├── EditArticle.php │ │ │ │ └── ListArticles.php │ │ ├── CategoryResource.php │ │ ├── CategoryResource │ │ │ └── Pages │ │ │ │ ├── CreateCategory.php │ │ │ │ ├── EditCategory.php │ │ │ │ └── ListCategories.php │ │ ├── CountryResource.php │ │ ├── CountryResource │ │ │ └── Pages │ │ │ │ ├── CreateCountry.php │ │ │ │ ├── EditCountry.php │ │ │ │ └── ListCountries.php │ │ ├── OrderResource.php │ │ ├── OrderResource │ │ │ └── Pages │ │ │ │ ├── CreateOrder.php │ │ │ │ ├── EditOrder.php │ │ │ │ ├── ListOrders.php │ │ │ │ └── ViewOrder.php │ │ ├── ProductResource.php │ │ ├── ProductResource │ │ │ └── Pages │ │ │ │ ├── CreateProduct.php │ │ │ │ ├── EditProduct.php │ │ │ │ └── ListProducts.php │ │ ├── UserResource.php │ │ └── UserResource │ │ │ └── Pages │ │ │ ├── CreateUser.php │ │ │ ├── EditUser.php │ │ │ └── ListUsers.php │ ├── Settings │ │ └── Forms │ │ │ └── SocialMedia.php │ └── Tiptap │ │ ├── Carousel.php │ │ └── Stats.php ├── Forms │ └── Components │ │ └── Slug.php ├── Http │ └── Controllers │ │ ├── AuthCallbackController.php │ │ ├── AuthRedirectController.php │ │ └── Controller.php ├── Livewire │ ├── Components │ │ ├── ArticleCard.php │ │ ├── ArticleGrid.php │ │ ├── Basket.php │ │ ├── Navbar.php │ │ ├── ProductCard.php │ │ └── ProductVariantSelector.php │ └── Pages │ │ ├── Article.php │ │ ├── Category.php │ │ ├── Home.php │ │ ├── Page.php │ │ └── Product.php ├── Mail │ └── TestEmail.php ├── Models │ ├── Address.php │ ├── Article.php │ ├── Category.php │ ├── Country.php │ ├── Order.php │ ├── Product.php │ ├── ProductImage.php │ └── User.php ├── Observers │ └── OrderObserver.php ├── Policies │ ├── ArticlePolicy.php │ ├── CategoryPolicy.php │ ├── MediaPolicy.php │ └── RolePolicy.php ├── Providers │ ├── AppServiceProvider.php │ ├── Filament │ │ └── AdminPanelProvider.php │ ├── FortifyServiceProvider.php │ └── JetstreamServiceProvider.php ├── Support │ └── Spotlight.php └── View │ └── Components │ ├── AppLayout.php │ ├── GuestLayout.php │ └── TagComponent.php ├── artisan ├── bootstrap ├── app.php ├── cache │ └── .gitignore └── providers.php ├── composer.json ├── composer.lock ├── config ├── app-settings.php ├── app.php ├── auth.php ├── cache.php ├── cashier.php ├── curator.php ├── database.php ├── filament-email-templates.php ├── filament-fabricator.php ├── filament-laravel-pulse.php ├── filament-menu-builder.php ├── filament-shield.php ├── filament-tiptap-editor.php ├── filesystems.php ├── fortify.php ├── jetstream.php ├── laracart.php ├── laravel-cart.php ├── logging.php ├── mail.php ├── mary.php ├── permission.php ├── pulse.php ├── queue.php ├── sanctum.php ├── scout.php ├── seo.php ├── services.php ├── session.php └── wire-comments.php ├── database ├── .gitignore ├── factories │ ├── AddressFactory.php │ ├── CountryFactory.php │ └── UserFactory.php ├── migrations │ ├── 0001_01_01_000000_create_users_table.php │ ├── 0001_01_01_000001_create_cache_table.php │ ├── 0001_01_01_000002_create_jobs_table.php │ ├── 2024_05_31_102710_create_carts_table.php │ ├── 2024_05_31_103315_create_cart_items_table.php │ ├── 2024_06_23_141032_add_two_factor_columns_to_users_table.php │ ├── 2024_06_23_141039_create_personal_access_tokens_table.php │ ├── 2024_06_23_141740_create_media_table.php │ ├── 2024_06_23_141741_add_tenant_aware_column_to_media_table.php │ ├── 2024_06_23_142502_create_articles_table.php │ ├── 2024_06_26_184907_2024_06_15_create_comments_table.php │ ├── 2024_06_26_184908_2024_06_15_create_reactions_table.php │ ├── 2024_06_26_184909_2024_06_17_add_guest_to_comments_table.php │ ├── 2024_06_26_184910_2024_06_17_add_guest_to_reactions_table.php │ ├── 2024_06_30_153527_add_user_id_to_articles_table.php │ ├── 2024_06_30_160328_add_x_id_to_users_table.php │ ├── 2024_07_12_081932_create_categories_table.php │ ├── 2024_07_12_082401_create_article_category_table.php │ ├── 2024_07_24_085945_add_extra_info_to_articles_table.php │ ├── 2024_07_26_085358_create_seo_table.php │ ├── 2024_08_03_090448_create_permission_tables.php │ ├── 2024_08_22_122955_create_notifications_table.php │ ├── 2024_09_28_065034_create_pages_table.php │ ├── 2024_09_28_065035_fix_slug_unique_constraint_on_pages_table.php │ ├── 2024_09_29_101132_create_views_table.php │ ├── 2024_10_06_142931_add_themes_settings_to_users_table.php │ ├── 2024_10_06_143352_create_menus_table.php │ ├── 2024_10_06_143755_create_pulse_tables.php │ ├── 2024_10_16_192852_add_icon_to_filament_menu_table.php │ ├── 2024_10_16_192852_add_is_logged_in_filament_menu_table.php │ ├── 2024_10_21_112926_create_email_templates_themes_table.php │ ├── 2024_10_21_112927_create_email_templates_table.php │ ├── 2024_10_23_200026_create_customer_columns.php │ ├── 2024_10_23_200027_create_subscriptions_table.php │ ├── 2024_10_23_200028_create_subscription_items_table.php │ ├── 2024_10_29_205607_create_products_table.php │ ├── 2024_11_02_094109_create_category_product_table.php │ ├── 2024_11_02_094845_create_orders_table.php │ ├── 2024_11_02_095155_create_order_product_table.php │ ├── 2024_11_02_095552_add_order_status_to_orders_table.php │ ├── 2024_11_02_110243_create_product_images_table.php │ ├── 2024_12_30_210512_add_variants_to_products_table.php │ ├── 2025_02_16_100933_create_countries_table.php │ ├── 2025_02_16_152246_add_cart_session_id_to_users_table.php │ ├── 2025_02_16_152827_create_addresses_table.php │ ├── 2025_03_16_124214_add_address_id_to_orders_table.php │ └── 2025_03_29_180914_create_app_settings_table.php └── seeders │ ├── DatabaseSeeder.php │ ├── EmailTemplateSeeder.php │ └── EmailTemplateThemeSeeder.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── pint.json ├── postcss.config.js ├── public ├── .htaccess ├── css │ ├── awcodes │ │ ├── curator │ │ │ └── curator.css │ │ └── tiptap-editor │ │ │ └── tiptap.css │ ├── codewithdennis │ │ └── filament-price-filter │ │ │ └── filament-price-filter.css │ ├── datlechin │ │ └── filament-menu-builder │ │ │ └── filament-menu-builder-styles.css │ ├── dotswan │ │ └── filament-laravel-pulse │ │ │ └── filament-laravel-pulse.css │ ├── filament │ │ ├── filament │ │ │ └── app.css │ │ ├── forms │ │ │ └── forms.css │ │ └── support │ │ │ └── support.css │ ├── hasnayeen │ │ └── themes │ │ │ ├── default.css │ │ │ ├── dracula.css │ │ │ ├── nord.css │ │ │ └── sunset.css │ ├── pboivin │ │ └── filament-peek │ │ │ └── filament-peek.css │ ├── pxlrbt │ │ └── filament-spotlight │ │ │ └── spotlight-css.css │ ├── saade │ │ └── filament-adjacency-list │ │ │ └── filament-adjacency-list-styles.css │ └── ysfkaya │ │ └── filament-phone-input │ │ └── filament-phone-input.css ├── favicon.ico ├── index.php ├── js │ ├── awcodes │ │ ├── curator │ │ │ └── components │ │ │ │ └── curation.js │ │ └── tiptap-editor │ │ │ └── components │ │ │ └── tiptap.js │ ├── codewithdennis │ │ └── filament-price-filter │ │ │ └── components │ │ │ └── filament-price-filter.js │ ├── datlechin │ │ └── filament-menu-builder │ │ │ └── components │ │ │ └── filament-menu-builder.js │ ├── dotswan │ │ └── filament-laravel-pulse │ │ │ └── filament-laravel-pulse.js │ ├── filament │ │ ├── filament │ │ │ ├── app.js │ │ │ └── echo.js │ │ ├── forms │ │ │ └── components │ │ │ │ ├── color-picker.js │ │ │ │ ├── date-time-picker.js │ │ │ │ ├── file-upload.js │ │ │ │ ├── key-value.js │ │ │ │ ├── markdown-editor.js │ │ │ │ ├── rich-editor.js │ │ │ │ ├── select.js │ │ │ │ ├── tags-input.js │ │ │ │ └── textarea.js │ │ ├── notifications │ │ │ └── notifications.js │ │ ├── support │ │ │ ├── async-alpine.js │ │ │ └── support.js │ │ ├── tables │ │ │ └── components │ │ │ │ └── table.js │ │ └── widgets │ │ │ └── components │ │ │ ├── chart.js │ │ │ └── stats-overview │ │ │ └── stat │ │ │ └── chart.js │ ├── pboivin │ │ └── filament-peek │ │ │ └── filament-peek.js │ ├── pxlrbt │ │ └── filament-spotlight │ │ │ └── spotlight-js.js │ ├── saade │ │ └── filament-adjacency-list │ │ │ └── components │ │ │ └── filament-adjacency-list.js │ └── ysfkaya │ │ └── filament-phone-input │ │ └── components │ │ └── filament-phone-input.js ├── media │ └── email-templates │ │ ├── BuildClass.png │ │ ├── EmailEditor.png │ │ ├── Languages.png │ │ ├── TemplateScreenShot.png │ │ ├── ThemeEditor.jpg │ │ ├── ThemeEditor.png │ │ └── logo.png ├── robots.txt └── vendor │ ├── filament-email-templates │ └── .gitkeep │ └── themes │ ├── .gitkeep │ ├── default.css │ ├── dracula.css │ ├── nord.css │ └── sunset.css ├── resources ├── css │ ├── app.css │ └── filament │ │ └── admin │ │ ├── tailwind.config.js │ │ └── theme.css ├── js │ ├── app.js │ └── bootstrap.js ├── markdown │ ├── policy.md │ └── terms.md └── views │ ├── api │ ├── api-token-manager.blade.php │ └── index.blade.php │ ├── auth │ ├── confirm-password.blade.php │ ├── forgot-password.blade.php │ ├── login.blade.php │ ├── register.blade.php │ ├── reset-password.blade.php │ ├── two-factor-challenge.blade.php │ └── verify-email.blade.php │ ├── blocks │ ├── previews │ │ ├── carousel.blade.php │ │ └── stats.blade.php │ └── rendered │ │ ├── carousel.blade.php │ │ └── stats.blade.php │ ├── components │ ├── action-message.blade.php │ ├── action-section.blade.php │ ├── application-logo.blade.php │ ├── application-mark.blade.php │ ├── authentication-card-logo.blade.php │ ├── authentication-card.blade.php │ ├── banner.blade.php │ ├── button.blade.php │ ├── checkbox.blade.php │ ├── confirmation-modal.blade.php │ ├── confirms-password.blade.php │ ├── danger-button.blade.php │ ├── dialog-modal.blade.php │ ├── dropdown-link.blade.php │ ├── dropdown.blade.php │ ├── filament-fabricator │ │ ├── layouts │ │ │ └── default.blade.php │ │ └── page-blocks │ │ │ ├── article.blade.php │ │ │ └── carousel.blade.php │ ├── form-section.blade.php │ ├── input-error.blade.php │ ├── input.blade.php │ ├── label.blade.php │ ├── modal.blade.php │ ├── nav-link.blade.php │ ├── responsive-nav-link.blade.php │ ├── secondary-button.blade.php │ ├── section-border.blade.php │ ├── section-title.blade.php │ ├── switchable-team.blade.php │ ├── tag-component.blade.php │ ├── validation-errors.blade.php │ └── welcome.blade.php │ ├── dashboard.blade.php │ ├── emails │ └── team-invitation.blade.php │ ├── forms │ └── components │ │ └── slug.blade.php │ ├── layouts │ ├── .editorconfig │ ├── app.blade.php │ └── guest.blade.php │ ├── livewire │ ├── components │ │ ├── article-card.blade.php │ │ ├── article-grid.blade.php │ │ ├── basket.blade.php │ │ ├── navbar.blade.php │ │ ├── product-card.blade.php │ │ ├── product-variant-selector.blade.php │ │ └── variant-tree.blade.php │ └── pages │ │ ├── article.blade.php │ │ ├── category.blade.php │ │ ├── home.blade.php │ │ ├── page.blade.php │ │ └── product.blade.php │ ├── policy.blade.php │ ├── profile │ ├── delete-user-form.blade.php │ ├── logout-other-browser-sessions-form.blade.php │ ├── show.blade.php │ ├── two-factor-authentication-form.blade.php │ ├── update-password-form.blade.php │ └── update-profile-information-form.blade.php │ ├── terms.blade.php │ └── vendor │ ├── filament-laravel-pulse │ ├── .gitkeep │ └── widgets │ │ ├── pulse-cache.blade.php │ │ ├── pulse-exceptions.blade.php │ │ ├── pulse-queues.blade.php │ │ ├── pulse-servers.blade.php │ │ ├── pulse-slow-jobs.blade.php │ │ ├── pulse-slow-outgoing-requests.blade.php │ │ ├── pulse-slow-queries.blade.php │ │ ├── pulse-slow-requests.blade.php │ │ └── pulse-usage.blade.php │ ├── pulse │ └── dashboard.blade.php │ ├── vb-email-templates │ ├── email │ │ ├── default.blade.php │ │ ├── default_preview.blade.php │ │ └── parts │ │ │ ├── _body.blade.php │ │ │ ├── _button.blade.php │ │ │ ├── _closing_tags.blade.php │ │ │ ├── _content.blade.php │ │ │ ├── _footer.blade.php │ │ │ ├── _head.blade.php │ │ │ ├── _hero_title.blade.php │ │ │ └── _support_block.blade.php │ └── forms │ │ └── components │ │ └── iframe.blade.php │ └── wire-comments │ ├── .gitkeep │ ├── components │ └── markdown-editor.blade.php │ └── livewire │ └── components │ ├── comment-chunk.blade.php │ ├── comment-item.blade.php │ ├── comment-reactions.blade.php │ └── comments.blade.php ├── routes ├── api.php ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tailwind.config.js ├── tests ├── Feature │ ├── ApiTokenPermissionsTest.php │ ├── AuthenticationTest.php │ ├── BrowserSessionsTest.php │ ├── CreateApiTokenTest.php │ ├── DeleteAccountTest.php │ ├── DeleteApiTokenTest.php │ ├── EmailVerificationTest.php │ ├── ExampleTest.php │ ├── PasswordConfirmationTest.php │ ├── PasswordResetTest.php │ ├── ProfileInformationTest.php │ ├── RegistrationTest.php │ ├── TwoFactorAuthenticationSettingsTest.php │ └── UpdatePasswordTest.php ├── Pest.php ├── TestCase.php └── Unit │ └── ExampleTest.php └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_TIMEZONE=UTC 6 | APP_URL=http://localhost 7 | 8 | APP_LOCALE=en 9 | APP_FALLBACK_LOCALE=en 10 | APP_FAKER_LOCALE=en_US 11 | 12 | APP_MAINTENANCE_DRIVER=file 13 | APP_MAINTENANCE_STORE=database 14 | 15 | BCRYPT_ROUNDS=12 16 | 17 | LOG_CHANNEL=stack 18 | LOG_STACK=single 19 | LOG_DEPRECATIONS_CHANNEL=null 20 | LOG_LEVEL=debug 21 | 22 | DB_CONNECTION=pgsql 23 | DB_HOST=127.0.0.1 24 | DB_PORT=5432 25 | DB_DATABASE=wire_content 26 | DB_USERNAME=root 27 | DB_PASSWORD= 28 | 29 | SESSION_DRIVER=database 30 | SESSION_LIFETIME=120 31 | SESSION_ENCRYPT=false 32 | SESSION_PATH=/ 33 | SESSION_DOMAIN=null 34 | 35 | BROADCAST_CONNECTION=log 36 | FILESYSTEM_DISK=local 37 | QUEUE_CONNECTION=database 38 | 39 | CACHE_STORE=database 40 | CACHE_PREFIX= 41 | 42 | MEMCACHED_HOST=127.0.0.1 43 | 44 | REDIS_CLIENT=phpredis 45 | REDIS_HOST=127.0.0.1 46 | REDIS_PASSWORD=null 47 | REDIS_PORT=6379 48 | 49 | MAIL_MAILER=log 50 | MAIL_HOST=127.0.0.1 51 | MAIL_PORT=2525 52 | MAIL_USERNAME=null 53 | MAIL_PASSWORD=null 54 | MAIL_ENCRYPTION=null 55 | MAIL_FROM_ADDRESS="hello@example.com" 56 | MAIL_FROM_NAME="${APP_NAME}" 57 | 58 | AWS_ACCESS_KEY_ID= 59 | AWS_SECRET_ACCESS_KEY= 60 | AWS_DEFAULT_REGION=us-east-1 61 | AWS_BUCKET= 62 | AWS_USE_PATH_STYLE_ENDPOINT=false 63 | 64 | VITE_APP_NAME="${APP_NAME}" 65 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /vendor 8 | .env 9 | .env.backup 10 | .env.production 11 | .phpactor.json 12 | .phpunit.result.cache 13 | Homestead.json 14 | Homestead.yaml 15 | auth.json 16 | npm-debug.log 17 | yarn-error.log 18 | /.fleet 19 | /.idea 20 | /.vscode 21 | -------------------------------------------------------------------------------- /app/Actions/Fortify/CreateNewUser.php: -------------------------------------------------------------------------------- 1 | $input 21 | */ 22 | public function create(array $input): User 23 | { 24 | Validator::make($input, [ 25 | 'name' => ['required', 'string', 'max:255'], 26 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 27 | 'password' => $this->passwordRules(), 28 | 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', 29 | ])->validate(); 30 | 31 | return User::create([ 32 | 'name' => $input['name'], 33 | 'email' => $input['email'], 34 | 'password' => Hash::make($input['password']), 35 | ]); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Actions/Fortify/PasswordValidationRules.php: -------------------------------------------------------------------------------- 1 | |string> 16 | */ 17 | protected function passwordRules(): array 18 | { 19 | return ['required', 'string', Password::default(), 'confirmed']; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Actions/Fortify/ResetUserPassword.php: -------------------------------------------------------------------------------- 1 | $input 20 | */ 21 | public function reset(User $user, array $input): void 22 | { 23 | Validator::make($input, [ 24 | 'password' => $this->passwordRules(), 25 | ])->validate(); 26 | 27 | $user->forceFill([ 28 | 'password' => Hash::make($input['password']), 29 | ])->save(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Actions/Fortify/UpdateUserPassword.php: -------------------------------------------------------------------------------- 1 | $input 20 | */ 21 | public function update(User $user, array $input): void 22 | { 23 | Validator::make($input, [ 24 | 'current_password' => ['required', 'string', 'current_password:web'], 25 | 'password' => $this->passwordRules(), 26 | ], [ 27 | 'current_password.current_password' => __('The provided password does not match your current password.'), 28 | ])->validateWithBag('updatePassword'); 29 | 30 | $user->forceFill([ 31 | 'password' => Hash::make($input['password']), 32 | ])->save(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Actions/Fortify/UpdateUserProfileInformation.php: -------------------------------------------------------------------------------- 1 | $input 19 | */ 20 | public function update(User $user, array $input): void 21 | { 22 | Validator::make($input, [ 23 | 'name' => ['required', 'string', 'max:255'], 24 | 'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)], 25 | 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], 26 | ])->validateWithBag('updateProfileInformation'); 27 | 28 | if (isset($input['photo'])) { 29 | $user->updateProfilePhoto($input['photo']); 30 | } 31 | 32 | if ($input['email'] !== $user->email && 33 | $user instanceof MustVerifyEmail) { 34 | $this->updateVerifiedUser($user, $input); 35 | } else { 36 | $user->forceFill([ 37 | 'name' => $input['name'], 38 | 'email' => $input['email'], 39 | ])->save(); 40 | } 41 | } 42 | 43 | /** 44 | * Update the given verified user's profile information. 45 | * 46 | * @param array $input 47 | */ 48 | private function updateVerifiedUser(User $user, array $input): void 49 | { 50 | $user->forceFill([ 51 | 'name' => $input['name'], 52 | 'email' => $input['email'], 53 | 'email_verified_at' => null, 54 | ])->save(); 55 | 56 | $user->sendEmailVerificationNotification(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/DeleteUser.php: -------------------------------------------------------------------------------- 1 | deleteProfilePhoto(); 18 | $user->tokens->each->delete(); 19 | $user->delete(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Actions/Social/Contracts/CreatesUser.php: -------------------------------------------------------------------------------- 1 | $user->getId(), 16 | ], [ 17 | 'name' => $user->getName(), 18 | 'email' => $user->getEmail(), 19 | 'profile_photo_path' => $user->getAvatar(), 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Enums/ArticleStatus.php: -------------------------------------------------------------------------------- 1 | mapWithKeys(fn ($case) => [$case->value => Str::of(Str::title($case->name))->replace('_', ' ')]) 23 | ->all(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Enums/OrderStatus.php: -------------------------------------------------------------------------------- 1 | mapWithKeys(fn ($case) => [$case->value => Str::of(Str::title($case->name))->replace('_', ' ')]) 26 | ->all(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Enums/ProductStatus.php: -------------------------------------------------------------------------------- 1 | mapWithKeys(fn ($case) => [$case->value => Str::of(Str::title($case->name))->replace('_', ' ')]) 25 | ->all(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Enums/ProductVariantType.php: -------------------------------------------------------------------------------- 1 | mapWithKeys(fn ($case) => [$case->value => Str::of(Str::title($case->name))->replace('_', ' ')]) 24 | ->all(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Factories/Social/CreateUserFactory.php: -------------------------------------------------------------------------------- 1 | new CreateXUser, 19 | default => throw new Exception('Unsupported service') 20 | }; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Filament/Fabricator/Layouts/DefaultLayout.php: -------------------------------------------------------------------------------- 1 | schema([ 21 | TextInput::make('title')->required(), 22 | TiptapEditor::make('description') 23 | ->label('Short Description') 24 | ->output(TiptapOutput::Json), 25 | Repeater::make('images') 26 | ->schema([ 27 | FileUpload::make('image')->required() 28 | ->image() 29 | ->imageEditor(), 30 | ]), 31 | ]); 32 | } 33 | 34 | public static function mutateData(array $data): array 35 | { 36 | return $data; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Filament/Resources/ArticleResource/Pages/CreateArticle.php: -------------------------------------------------------------------------------- 1 | title('Changes saved!') 20 | ->success() 21 | ->body('Your changes have been saved!') 22 | ->send() 23 | ->sendToDatabase(auth()->user()); 24 | 25 | parent::save($shouldRedirect, $shouldSendSavedNotification); 26 | } 27 | 28 | protected function getHeaderActions(): array 29 | { 30 | return [ 31 | Actions\DeleteAction::make(), 32 | ]; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Filament/Resources/ArticleResource/Pages/ListArticles.php: -------------------------------------------------------------------------------- 1 | Tab::make('All Posts'), 21 | 'published' => Tab::make('Published') 22 | ->modifyQueryUsing(function ($query) { 23 | return $query->where('status', ArticleStatus::PUBLISHED); 24 | }), 25 | 'draft' => Tab::make('Draft') 26 | ->modifyQueryUsing(function ($query) { 27 | return $query->where('status', ArticleStatus::DRAFT); 28 | }), 29 | ]; 30 | } 31 | 32 | protected function getHeaderActions(): array 33 | { 34 | return [ 35 | Actions\CreateAction::make(), 36 | ]; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Filament/Resources/CategoryResource/Pages/CreateCategory.php: -------------------------------------------------------------------------------- 1 | schema([ 25 | Forms\Components\TextInput::make('name'), 26 | Forms\Components\TextInput::make('code'), 27 | ]); 28 | } 29 | 30 | public static function table(Table $table): Table 31 | { 32 | return $table 33 | ->columns([ 34 | Tables\Columns\TextColumn::make('name') 35 | ->searchable() 36 | ->sortable(), 37 | Tables\Columns\TextColumn::make('code') 38 | ->searchable() 39 | ->sortable(), 40 | ]) 41 | ->filters([ 42 | // 43 | ]) 44 | ->actions([ 45 | Tables\Actions\EditAction::make(), 46 | ]) 47 | ->bulkActions([ 48 | Tables\Actions\BulkActionGroup::make([ 49 | Tables\Actions\DeleteBulkAction::make(), 50 | ]), 51 | ]); 52 | } 53 | 54 | public static function getRelations(): array 55 | { 56 | return [ 57 | // 58 | ]; 59 | } 60 | 61 | public static function getPages(): array 62 | { 63 | return [ 64 | 'index' => Pages\ListCountries::route('/'), 65 | 'create' => Pages\CreateCountry::route('/create'), 66 | 'edit' => Pages\EditCountry::route('/{record}/edit'), 67 | ]; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/Filament/Resources/CountryResource/Pages/CreateCountry.php: -------------------------------------------------------------------------------- 1 | label(__('Social Media')) 17 | ->icon('heroicon-o-computer-desktop') 18 | ->schema(self::getFields()) 19 | ->columns() 20 | ->statePath('social_media') 21 | ->visible(true); 22 | } 23 | 24 | public static function getFields(): array 25 | { 26 | return [ 27 | TextInput::make('facebook_url'), 28 | ]; 29 | } 30 | 31 | public static function getSortOrder(): int 32 | { 33 | return 1; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Filament/Tiptap/Carousel.php: -------------------------------------------------------------------------------- 1 | schema([ 22 | FileUpload::make('image')->required(), 23 | ]), 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Filament/Tiptap/Stats.php: -------------------------------------------------------------------------------- 1 | required(), 20 | TextInput::make('value')->required(), 21 | TextInput::make('description')->required(), 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Forms/Components/Slug.php: -------------------------------------------------------------------------------- 1 | afterStateHydrated(function (Slug $component, $state) { 23 | $component->id($component->getIdAttribute()); 24 | }); 25 | } 26 | 27 | public function getValue(): string 28 | { 29 | $value = parent::getValue(); 30 | 31 | return Str::slug($value); 32 | } 33 | 34 | public function getIdAttribute(): string 35 | { 36 | return 'slug-'.Str::slug($this->getLabel()); 37 | } 38 | 39 | public function minLength(int $length): static 40 | { 41 | $this->minLength = $length; 42 | $this->rule('min:'.$length); 43 | 44 | return $this; 45 | } 46 | 47 | public function maxLength(int $length): static 48 | { 49 | $this->maxLength = $length; 50 | $this->rule('max:'.$length); 51 | 52 | return $this; 53 | } 54 | 55 | public function getMinLength(): ?int 56 | { 57 | return $this->minLength; 58 | } 59 | 60 | public function getMaxLength(): ?int 61 | { 62 | return $this->maxLength; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/Http/Controllers/AuthCallbackController.php: -------------------------------------------------------------------------------- 1 | user(); 20 | 21 | auth()->login( 22 | $user = app(CreateUserFactory::class) 23 | ->forService($service) 24 | ->create($user) 25 | ); 26 | 27 | if ($user->wasRecentlyCreated) { 28 | event(new Registered($user)); 29 | } 30 | 31 | return redirect()->route('home'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Http/Controllers/AuthRedirectController.php: -------------------------------------------------------------------------------- 1 | redirect(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | responsiveMenu = ! $this->responsiveMenu; 18 | } 19 | 20 | public function render(): View 21 | { 22 | return view('livewire.components.navbar', [ 23 | 'menu' => Menu::location('header'), 24 | 'dropdown' => Menu::location('dropdown'), 25 | ]); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Livewire/Components/ProductCard.php: -------------------------------------------------------------------------------- 1 | article)->record(); 19 | } 20 | 21 | #[Layout('layouts.app')] 22 | public function render(): View 23 | { 24 | return view('livewire.pages.article'); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Livewire/Pages/Category.php: -------------------------------------------------------------------------------- 1 | articles = ArticleModel::isPublished()->limit(8)->get(); 24 | $this->products = ProductModel::isPublished()->limit(8)->get(); 25 | } 26 | 27 | #[Layout('layouts.app')] 28 | public function render(): Factory|Application|View|\Illuminate\Contracts\Foundation\Application 29 | { 30 | return view('livewire.pages.home'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Livewire/Pages/Page.php: -------------------------------------------------------------------------------- 1 | product)->record(); 22 | $this->previewUrl = (string) $this->product->images?->first()->path; 23 | } 24 | 25 | public function getSlides(): array 26 | { 27 | return $this->product->images->map(function ($image) { 28 | return [ 29 | 'image' => Storage::url($image->path), 30 | ]; 31 | })->toArray(); 32 | } 33 | 34 | public function setPreviewUrl($image): void 35 | { 36 | $this->previewUrl = (string) $image['path']; 37 | } 38 | 39 | #[Layout('layouts.app')] 40 | public function render(): View 41 | { 42 | return view('livewire.pages.product'); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/Mail/TestEmail.php: -------------------------------------------------------------------------------- 1 | sendTo = $user; 29 | } 30 | 31 | /** 32 | * Get the message envelope. 33 | */ 34 | public function envelope(): Envelope 35 | { 36 | return new Envelope( 37 | subject: 'Test Email', 38 | ); 39 | } 40 | 41 | /** 42 | * Get the message content definition. 43 | */ 44 | public function content(): Content 45 | { 46 | return new Content( 47 | view: 'view.name', 48 | ); 49 | } 50 | 51 | /** 52 | * Get the attachments for the message. 53 | * 54 | * @return array 55 | */ 56 | public function attachments(): array 57 | { 58 | return []; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/Models/Address.php: -------------------------------------------------------------------------------- 1 | */ 15 | use HasFactory; 16 | 17 | protected $fillable = [ 18 | 'country_id', 19 | 'address_line_1', 20 | 'address_line_2', 21 | 'city', 22 | 'state', 23 | 'zip', 24 | 'name', 25 | ]; 26 | 27 | // protected $casts = [ 28 | // 'address_line_1' => 'encrypted', 29 | // 'address_line_2' => 'encrypted', 30 | // 'city' => 'encrypted', 31 | // 'state' => 'encrypted', 32 | // 'zip' => 'encrypted', 33 | // ]; 34 | 35 | public function country(): BelongsTo 36 | { 37 | return $this->belongsTo(Country::class); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Models/Article.php: -------------------------------------------------------------------------------- 1 | ArticleStatus::class, 36 | 'content' => 'array', 37 | ]; 38 | 39 | public function scopeIsPublished(Builder $builder): Builder 40 | { 41 | return $builder->where('status', ArticleStatus::PUBLISHED); 42 | } 43 | 44 | public function image(): BelongsTo 45 | { 46 | return $this->belongsTo(Media::class, 'media_id'); 47 | } 48 | 49 | public function user(): BelongsTo 50 | { 51 | return $this->belongsTo(User::class); 52 | } 53 | 54 | public function categories(): BelongsToMany 55 | { 56 | return $this->belongsToMany(Category::class); 57 | } 58 | 59 | public function getDynamicSEOData(): SEOData 60 | { 61 | return new SEOData( 62 | title: $this->title, 63 | description: Str::limit(tiptap_converter()->asText($this->content, 100)), 64 | image: $this->image?->path, 65 | ); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/Models/Category.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class); 38 | } 39 | 40 | public function image(): BelongsTo 41 | { 42 | return $this->belongsTo(Media::class, 'media_id'); 43 | } 44 | 45 | public function parent(): BelongsTo 46 | { 47 | return $this->belongsTo(self::class, 'parent_id'); 48 | } 49 | 50 | public function articles(): BelongsToMany 51 | { 52 | return $this->belongsToMany(Article::class, 'article_category'); 53 | } 54 | 55 | public function products(): BelongsToMany 56 | { 57 | return $this->belongsToMany(Product::class, 'category_product'); 58 | } 59 | 60 | public function getDynamicSEOData(): SEOData 61 | { 62 | return new SEOData( 63 | title: $this->title, 64 | description: tiptap_converter()->asText(Str::limit($this->content, 160)), 65 | image: $this->image?->path, 66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/Models/Country.php: -------------------------------------------------------------------------------- 1 | */ 14 | use HasFactory; 15 | 16 | protected $fillable = [ 17 | 'name', 18 | 'code', 19 | ]; 20 | } 21 | -------------------------------------------------------------------------------- /app/Models/Order.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class); 21 | } 22 | 23 | public function address(): BelongsTo 24 | { 25 | return $this->belongsTo(Address::class); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Models/ProductImage.php: -------------------------------------------------------------------------------- 1 | belongsTo(Product::class); 19 | } 20 | 21 | public function image(): BelongsTo 22 | { 23 | return $this->belongsTo(Media::class, 'media_id'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Observers/OrderObserver.php: -------------------------------------------------------------------------------- 1 | order_id = Str::uuid(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | blocks([ 22 | Stats::class, 23 | Carousel::class, 24 | ]); 25 | }); 26 | } 27 | 28 | /** 29 | * Bootstrap any application services. 30 | */ 31 | public function boot(): void 32 | { 33 | // 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Providers/FortifyServiceProvider.php: -------------------------------------------------------------------------------- 1 | input(Fortify::username())).'|'.$request->ip()); 40 | 41 | return Limit::perMinute(5)->by($throttleKey); 42 | }); 43 | 44 | RateLimiter::for('two-factor', function (Request $request) { 45 | return Limit::perMinute(5)->by($request->session()->get('login.id')); 46 | }); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Providers/JetstreamServiceProvider.php: -------------------------------------------------------------------------------- 1 | configurePermissions(); 27 | 28 | Jetstream::deleteUsersUsing(DeleteUser::class); 29 | } 30 | 31 | /** 32 | * Configure the permissions that are available within the application. 33 | */ 34 | protected function configurePermissions(): void 35 | { 36 | Jetstream::defaultApiTokenPermissions(['read']); 37 | 38 | Jetstream::permissions([ 39 | 'create', 40 | 'read', 41 | 'update', 42 | 'delete', 43 | ]); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/View/Components/AppLayout.php: -------------------------------------------------------------------------------- 1 | handleCommand(new ArgvInput); 14 | 15 | exit($status); 16 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | withRouting( 11 | web: __DIR__.'/../routes/web.php', 12 | api: __DIR__.'/../routes/api.php', 13 | commands: __DIR__.'/../routes/console.php', 14 | health: '/up', 15 | ) 16 | ->withMiddleware(function (Middleware $middleware) { 17 | // 18 | }) 19 | ->withExceptions(function (Exceptions $exceptions) { 20 | // 21 | })->create(); 22 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/providers.php: -------------------------------------------------------------------------------- 1 | \CWSPS154\AppSettings\Page\AppSettings::class, 11 | ]; 12 | -------------------------------------------------------------------------------- /config/filament-fabricator.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'enabled' => true, 18 | 'prefix' => null, // /pages 19 | ], 20 | 21 | 'layouts' => [ 22 | 'namespace' => 'App\\Filament\\Fabricator\\Layouts', 23 | 'path' => app_path('Filament/Fabricator/Layouts'), 24 | 'register' => [ 25 | // 26 | ], 27 | ], 28 | 29 | 'page-blocks' => [ 30 | 'namespace' => 'App\\Filament\\Fabricator\\PageBlocks', 31 | 'path' => app_path('Filament/Fabricator/PageBlocks'), 32 | 'register' => [ 33 | // 34 | ], 35 | ], 36 | 37 | 'middleware' => [ 38 | EncryptCookies::class, 39 | AddQueuedCookiesToResponse::class, 40 | StartSession::class, 41 | // \Illuminate\Session\Middleware\AuthenticateSession::class, 42 | ShareErrorsFromSession::class, 43 | VerifyCsrfToken::class, 44 | SubstituteBindings::class, 45 | ], 46 | 47 | 'page-model' => Page::class, 48 | 49 | 'page-resource' => PageResource::class, 50 | 51 | 'enable-view-page' => false, 52 | 53 | /* 54 | * This is the name of the table that will be created by the migration and 55 | * used by the above page-model shipped with this package. 56 | */ 57 | 'table_name' => 'pages', 58 | ]; 59 | -------------------------------------------------------------------------------- /config/filament-menu-builder.php: -------------------------------------------------------------------------------- 1 | [ 7 | 'menus' => 'menus', 8 | 'menu_items' => 'menu_items', 9 | 'menu_locations' => 'menu_locations', 10 | ], 11 | ]; 12 | -------------------------------------------------------------------------------- /config/laravel-cart.php: -------------------------------------------------------------------------------- 1 | [ 12 | /* 13 | * The user table name. 14 | */ 15 | 'table' => 'users', 16 | 17 | /* 18 | * The user foreign key. 19 | */ 20 | 'foreign_id' => 'user_id', 21 | ], 22 | 23 | /* 24 | * Carts 25 | * 26 | * This value is about the cart table name, foreign key and, ... . 27 | */ 28 | 'carts' => [ 29 | /* 30 | * The cart table name. 31 | */ 32 | 'table' => 'carts', 33 | 34 | /* 35 | * The cart foreign key name. 36 | */ 37 | 'foreign_id' => 'cart_id', 38 | ], 39 | 40 | /* 41 | * Cart Items 42 | * 43 | * This value is about the items of one cart. 44 | */ 45 | 'cart_items' => [ 46 | /* 47 | * The cart items table name. 48 | */ 49 | 'table' => 'cart_items', 50 | ], 51 | 52 | /* 53 | * Driver 54 | */ 55 | 'driver' => [ 56 | 'default' => 'database', 57 | ], 58 | ]; 59 | -------------------------------------------------------------------------------- /config/mary.php: -------------------------------------------------------------------------------- 1 | '' 12 | * 13 | * 14 | * 15 | * prefix => 'mary-' 16 | * 17 | * 18 | */ 19 | 'prefix' => 'mary-', 20 | 21 | /** 22 | * Default route prefix. 23 | * 24 | * Some maryUI components make network request to its internal routes. 25 | * 26 | * route_prefix => '' 27 | * - Spotlight: '/mary/spotlight' 28 | * - Editor: '/mary/upload' 29 | * - ... 30 | * 31 | * route_prefix => 'my-components' 32 | * - Spotlight: '/my-components/mary/spotlight' 33 | * - Editor: '/my-components/mary/upload' 34 | * - ... 35 | */ 36 | 'route_prefix' => '', 37 | 38 | /** 39 | * Components settings 40 | */ 41 | 'components' => [ 42 | 'spotlight' => [ 43 | 'class' => 'App\Support\Spotlight', 44 | ], 45 | ], 46 | ]; 47 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 20 | 'token' => env('POSTMARK_TOKEN'), 21 | ], 22 | 23 | 'ses' => [ 24 | 'key' => env('AWS_ACCESS_KEY_ID'), 25 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 26 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 27 | ], 28 | 29 | 'resend' => [ 30 | 'key' => env('RESEND_KEY'), 31 | ], 32 | 33 | 'slack' => [ 34 | 'notifications' => [ 35 | 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), 36 | 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), 37 | ], 38 | ], 39 | 40 | 'twitter' => [ 41 | 'client_id' => env('X_CLIENT_ID'), 42 | 'client_secret' => env('X_CLIENT_SECRET'), 43 | 'redirect' => env('X_REDIRECT_URL'), 44 | ], 45 | ]; 46 | -------------------------------------------------------------------------------- /config/wire-comments.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class AddressFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/CountryFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class CountryFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->timestamp('email_verified_at')->nullable(); 21 | $table->string('password')->nullable(); 22 | $table->rememberToken(); 23 | $table->foreignId('current_team_id')->nullable(); 24 | $table->string('profile_photo_path', 2048)->nullable(); 25 | $table->timestamps(); 26 | }); 27 | 28 | Schema::create('password_reset_tokens', function (Blueprint $table) { 29 | $table->string('email')->primary(); 30 | $table->string('token'); 31 | $table->timestamp('created_at')->nullable(); 32 | }); 33 | 34 | Schema::create('sessions', function (Blueprint $table) { 35 | $table->string('id')->primary(); 36 | $table->foreignId('user_id')->nullable()->index(); 37 | $table->string('ip_address', 45)->nullable(); 38 | $table->text('user_agent')->nullable(); 39 | $table->longText('payload'); 40 | $table->integer('last_activity')->index(); 41 | }); 42 | } 43 | 44 | /** 45 | * Reverse the migrations. 46 | */ 47 | public function down(): void 48 | { 49 | Schema::dropIfExists('users'); 50 | Schema::dropIfExists('password_reset_tokens'); 51 | Schema::dropIfExists('sessions'); 52 | } 53 | }; 54 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000001_create_cache_table.php: -------------------------------------------------------------------------------- 1 | string('key')->primary(); 18 | $table->mediumText('value'); 19 | $table->integer('expiration'); 20 | }); 21 | 22 | Schema::create('cache_locks', function (Blueprint $table) { 23 | $table->string('key')->primary(); 24 | $table->string('owner'); 25 | $table->integer('expiration'); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | */ 32 | public function down(): void 33 | { 34 | Schema::dropIfExists('cache'); 35 | Schema::dropIfExists('cache_locks'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000002_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('queue')->index(); 19 | $table->longText('payload'); 20 | $table->unsignedTinyInteger('attempts'); 21 | $table->unsignedInteger('reserved_at')->nullable(); 22 | $table->unsignedInteger('available_at'); 23 | $table->unsignedInteger('created_at'); 24 | }); 25 | 26 | Schema::create('job_batches', function (Blueprint $table) { 27 | $table->string('id')->primary(); 28 | $table->string('name'); 29 | $table->integer('total_jobs'); 30 | $table->integer('pending_jobs'); 31 | $table->integer('failed_jobs'); 32 | $table->longText('failed_job_ids'); 33 | $table->mediumText('options')->nullable(); 34 | $table->integer('cancelled_at')->nullable(); 35 | $table->integer('created_at'); 36 | $table->integer('finished_at')->nullable(); 37 | }); 38 | 39 | Schema::create('failed_jobs', function (Blueprint $table) { 40 | $table->id(); 41 | $table->string('uuid')->unique(); 42 | $table->text('connection'); 43 | $table->text('queue'); 44 | $table->longText('payload'); 45 | $table->longText('exception'); 46 | $table->timestamp('failed_at')->useCurrent(); 47 | }); 48 | } 49 | 50 | /** 51 | * Reverse the migrations. 52 | */ 53 | public function down(): void 54 | { 55 | Schema::dropIfExists('jobs'); 56 | Schema::dropIfExists('job_batches'); 57 | Schema::dropIfExists('failed_jobs'); 58 | } 59 | }; 60 | -------------------------------------------------------------------------------- /database/migrations/2024_05_31_102710_create_carts_table.php: -------------------------------------------------------------------------------- 1 | id(); 22 | 23 | $table->foreignId($userForeignName)->constrained($userTableName)->cascadeOnDelete(); 24 | 25 | $table->timestamps(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | */ 32 | public function down(): void 33 | { 34 | $table = config('laravel-cart.carts.table', 'carts'); 35 | 36 | Schema::dropIfExists($table); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /database/migrations/2024_05_31_103315_create_cart_items_table.php: -------------------------------------------------------------------------------- 1 | id(); 22 | 23 | $table->foreignId($cartForeignName)->constrained($cartTableName)->cascadeOnDelete(); 24 | $table->morphs('itemable'); 25 | $table->unsignedInteger('quantity')->default(1); 26 | 27 | $table->timestamps(); 28 | }); 29 | } 30 | 31 | /** 32 | * Reverse the migrations. 33 | */ 34 | public function down(): void 35 | { 36 | $table = config('laravel-cart.cart_items.table', 'cart_items'); 37 | 38 | Schema::dropIfExists($table); 39 | } 40 | }; 41 | -------------------------------------------------------------------------------- /database/migrations/2024_06_23_141032_add_two_factor_columns_to_users_table.php: -------------------------------------------------------------------------------- 1 | text('two_factor_secret') 19 | ->after('password') 20 | ->nullable(); 21 | 22 | $table->text('two_factor_recovery_codes') 23 | ->after('two_factor_secret') 24 | ->nullable(); 25 | 26 | if (Fortify::confirmsTwoFactorAuthentication()) { 27 | $table->timestamp('two_factor_confirmed_at') 28 | ->after('two_factor_recovery_codes') 29 | ->nullable(); 30 | } 31 | }); 32 | } 33 | 34 | /** 35 | * Reverse the migrations. 36 | */ 37 | public function down(): void 38 | { 39 | Schema::table('users', function (Blueprint $table) { 40 | $table->dropColumn(array_merge([ 41 | 'two_factor_secret', 42 | 'two_factor_recovery_codes', 43 | ], Fortify::confirmsTwoFactorAuthentication() ? [ 44 | 'two_factor_confirmed_at', 45 | ] : [])); 46 | }); 47 | } 48 | }; 49 | -------------------------------------------------------------------------------- /database/migrations/2024_06_23_141039_create_personal_access_tokens_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->morphs('tokenable'); 19 | $table->string('name'); 20 | $table->string('token', 64)->unique(); 21 | $table->text('abilities')->nullable(); 22 | $table->timestamp('last_used_at')->nullable(); 23 | $table->timestamp('expires_at')->nullable(); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | */ 31 | public function down(): void 32 | { 33 | Schema::dropIfExists('personal_access_tokens'); 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /database/migrations/2024_06_23_141740_create_media_table.php: -------------------------------------------------------------------------------- 1 | getTable(), function (Blueprint $table) { 14 | $table->id(); 15 | $table->string('disk')->default('public'); 16 | $table->string('directory')->default('media'); 17 | $table->string('visibility')->default('public'); 18 | $table->string('name'); 19 | $table->string('path'); 20 | $table->unsignedInteger('width')->nullable(); 21 | $table->unsignedInteger('height')->nullable(); 22 | $table->unsignedInteger('size')->nullable(); 23 | $table->string('type')->default('image'); 24 | $table->string('ext'); 25 | $table->string('alt')->nullable(); 26 | $table->string('title')->nullable(); 27 | $table->text('description')->nullable(); 28 | $table->text('caption')->nullable(); 29 | $table->text('exif')->nullable(); 30 | $table->longText('curations')->nullable(); 31 | $table->timestamps(); 32 | }); 33 | } 34 | 35 | public function down(): void 36 | { 37 | Schema::dropIfExists(app(config('curator.model'))->getTable()); 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /database/migrations/2024_06_23_141741_add_tenant_aware_column_to_media_table.php: -------------------------------------------------------------------------------- 1 | getTable(), function (Blueprint $table) { 15 | $table->integer(config('curator.tenant_ownership_relationship_name').'_id')->nullable(); 16 | }); 17 | } 18 | } 19 | 20 | public function down(): void 21 | { 22 | if (Schema::hasColumn(app(config('curator.model'))->getTable(), config('curator.tenant_ownership_relationship_name').'_id')) { 23 | Schema::table(app(config('curator.model'))->getTable(), function (Blueprint $table) { 24 | $table->dropColumn(config('curator.tenant_ownership_relationship_name').'_id'); 25 | }); 26 | } 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_06_23_142502_create_articles_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('title'); 19 | $table->string('slug')->unique(); 20 | $table->text('content'); 21 | $table->foreignId('media_id')->nullable()->constrained('media')->nullOnDelete(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('articles'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_06_26_184907_2024_06_15_create_comments_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); 19 | $table->text('body'); 20 | $table->nullableMorphs('commentable'); 21 | $table->foreignId('parent_id')->nullable()->constrained('comments'); 22 | $table->softDeletes(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::dropIfExists('comments'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/2024_06_26_184908_2024_06_15_create_reactions_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('user_id')->constrained()->onDelete('cascade'); 19 | $table->foreignId('comment_id')->constrained()->onDelete('cascade'); 20 | $table->string('emoji'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('reactions'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_06_26_184909_2024_06_17_add_guest_to_comments_table.php: -------------------------------------------------------------------------------- 1 | string('guest_id')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::table('comments', function (Blueprint $table) { 27 | $table->dropColumn('guest_id'); 28 | }); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_06_26_184910_2024_06_17_add_guest_to_reactions_table.php: -------------------------------------------------------------------------------- 1 | string('guest_id')->nullable(); 18 | $table->foreignId('user_id')->nullable()->change(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::table('reactions', function (Blueprint $table) { 28 | $table->dropColumn('guest_id'); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_06_30_153527_add_user_id_to_articles_table.php: -------------------------------------------------------------------------------- 1 | foreignId('user_id')->nullable()->constrained()->cascadeOnDelete(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::table('articles', function (Blueprint $table) { 27 | $table->dropColumn('user_id'); 28 | }); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_06_30_160328_add_x_id_to_users_table.php: -------------------------------------------------------------------------------- 1 | string('x_id')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::table('users', function (Blueprint $table) { 27 | $table->dropColumn('x_id'); 28 | }); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_12_081932_create_categories_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('title'); 19 | $table->text('content')->nullable(); 20 | $table->string('slug')->nullable()->unique(); 21 | $table->string('text_color')->nullable(); 22 | $table->string('background_color')->nullable(); 23 | $table->boolean('is_tag')->default(false); 24 | $table->foreignId('user_id')->constrained()->cascadeOnDelete(); 25 | $table->foreignId('media_id')->nullable()->constrained('media')->nullOnDelete(); 26 | $table->foreignId('parent_id')->nullable()->constrained('categories')->cascadeOnDelete(); 27 | $table->timestamps(); 28 | }); 29 | } 30 | 31 | /** 32 | * Reverse the migrations. 33 | */ 34 | public function down(): void 35 | { 36 | Schema::dropIfExists('categories'); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /database/migrations/2024_07_12_082401_create_article_category_table.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->foreignIdFor(Article::class); 21 | $table->foreignIdFor(Category::class); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('article_category'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_085945_add_extra_info_to_articles_table.php: -------------------------------------------------------------------------------- 1 | timestamp('deleted_at')->nullable(); 19 | $table->enum('status', [ArticleStatus::values()]) 20 | ->default(ArticleStatus::DRAFT)->nullable(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::table('articles', function (Blueprint $table) { 30 | $table->dropColumn('deleted_at', 'status'); 31 | }); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_07_26_085358_create_seo_table.php: -------------------------------------------------------------------------------- 1 | id(); 15 | 16 | $table->morphs('model'); 17 | 18 | $table->longText('description')->nullable(); 19 | $table->string('title')->nullable(); 20 | $table->string('image')->nullable(); 21 | $table->string('author')->nullable(); 22 | $table->string('robots')->nullable(); 23 | $table->string('canonical_url')->nullable(); 24 | 25 | $table->timestamps(); 26 | }); 27 | } 28 | 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('seo'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_08_22_122955_create_notifications_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->string('type'); 19 | $table->morphs('notifiable'); 20 | $table->jsonb('data'); 21 | $table->timestamp('read_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('notifications'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_09_28_065034_create_pages_table.php: -------------------------------------------------------------------------------- 1 | id(); 15 | $table->string('title')->index(); 16 | $table->string('slug')->unique(); 17 | $table->string('layout')->default('default')->index(); 18 | $table->json('blocks'); 19 | $table->foreignId('parent_id')->nullable()->constrained(config('filament-fabricator.table_name', 'pages'))->cascadeOnDelete()->cascadeOnUpdate(); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | public function down() 25 | { 26 | Schema::dropIfExists(config('filament-fabricator.table_name', 'pages')); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_09_28_065035_fix_slug_unique_constraint_on_pages_table.php: -------------------------------------------------------------------------------- 1 | dropUnique(['slug']); 15 | $table->unique(['slug', 'parent_id']); 16 | }); 17 | } 18 | 19 | public function down() 20 | { 21 | Schema::table(config('filament-fabricator.table_name', 'pages'), function (Blueprint $table) { 22 | $table->dropUnique(['slug', 'parent_id']); 23 | $table->unique(['slug']); 24 | }); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /database/migrations/2024_09_29_101132_create_views_table.php: -------------------------------------------------------------------------------- 1 | schema = Schema::connection( 33 | config('eloquent-viewable.models.view.connection') 34 | ); 35 | 36 | $this->table = config('eloquent-viewable.models.view.table_name'); 37 | } 38 | 39 | /** 40 | * Run the migrations. 41 | * 42 | * @return void 43 | */ 44 | public function up() 45 | { 46 | $this->schema->create($this->table, function (Blueprint $table) { 47 | $table->bigIncrements('id'); 48 | $table->morphs('viewable'); 49 | $table->text('visitor')->nullable(); 50 | $table->string('collection')->nullable(); 51 | $table->timestamp('viewed_at')->useCurrent(); 52 | }); 53 | } 54 | 55 | /** 56 | * Reverse the migrations. 57 | * 58 | * @return void 59 | */ 60 | public function down() 61 | { 62 | Schema::dropIfExists($this->table); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /database/migrations/2024_10_06_142931_add_themes_settings_to_users_table.php: -------------------------------------------------------------------------------- 1 | string('theme')->nullable()->default('default'); 15 | $table->string('theme_color')->nullable(); 16 | }); 17 | } 18 | 19 | public function down() 20 | { 21 | Schema::table('users', function (Blueprint $table) { 22 | $table->dropColumn(['theme', 'theme_color']); 23 | }); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /database/migrations/2024_10_06_143352_create_menus_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->boolean('is_visible')->default(true); 20 | $table->timestamps(); 21 | }); 22 | 23 | Schema::create(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { 24 | $table->id(); 25 | $table->foreignIdFor(Menu::class)->constrained()->cascadeOnDelete(); 26 | $table->foreignIdFor(MenuItem::class, 'parent_id')->nullable()->constrained($table->getTable())->nullOnDelete(); 27 | $table->nullableMorphs('linkable'); 28 | $table->string('title'); 29 | $table->string('url')->nullable(); 30 | $table->string('target', 10)->default(LinkTarget::Self); 31 | $table->integer('order')->default(0); 32 | $table->timestamps(); 33 | }); 34 | 35 | Schema::create(config('filament-menu-builder.tables.menu_locations'), function (Blueprint $table) { 36 | $table->id(); 37 | $table->foreignIdFor(Menu::class)->constrained()->cascadeOnDelete(); 38 | $table->string('location')->unique(); 39 | $table->timestamps(); 40 | }); 41 | } 42 | 43 | public function down(): void 44 | { 45 | Schema::dropIfExists(config('filament-menu-builder.tables.menu_locations')); 46 | Schema::dropIfExists(config('filament-menu-builder.tables.menu_items')); 47 | Schema::dropIfExists(config('filament-menu-builder.tables.menus')); 48 | } 49 | }; 50 | -------------------------------------------------------------------------------- /database/migrations/2024_10_16_192852_add_icon_to_filament_menu_table.php: -------------------------------------------------------------------------------- 1 | string('icon')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | 27 | Schema::table(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { 28 | $table->dropColumn('icon'); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_10_16_192852_add_is_logged_in_filament_menu_table.php: -------------------------------------------------------------------------------- 1 | boolean('is_logged_in')->default(false); 18 | }); 19 | 20 | Schema::table(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { 21 | $table->string('classes')->nullable(); 22 | $table->boolean('is_admin')->nullable(); 23 | $table->boolean('use_navigate')->nullable(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::table(config('filament-menu-builder.tables.menus'), function (Blueprint $table) { 33 | $table->dropColumn('is_logged_in'); 34 | }); 35 | 36 | Schema::table(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { 37 | $table->dropColumn('classes'); 38 | }); 39 | } 40 | }; 41 | -------------------------------------------------------------------------------- /database/migrations/2024_10_21_112926_create_email_templates_themes_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 20 | $table->string('name', 191)->nullable()->comment('Name'); 21 | $table->json('colours')->nullable(); 22 | $table->boolean('is_default')->default(0)->comment('1: Active | 0: Not Active'); 23 | $table->softDeletes(); 24 | $table->timestamps(); 25 | }); 26 | 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists(config('filament-email-templates.theme_table_name')); 37 | } 38 | }; 39 | -------------------------------------------------------------------------------- /database/migrations/2024_10_23_200026_create_customer_columns.php: -------------------------------------------------------------------------------- 1 | string('stripe_id')->nullable()->index(); 18 | $table->string('pm_type')->nullable(); 19 | $table->string('pm_last_four', 4)->nullable(); 20 | $table->timestamp('trial_ends_at')->nullable(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::table('users', function (Blueprint $table) { 30 | $table->dropIndex([ 31 | 'stripe_id', 32 | ]); 33 | 34 | $table->dropColumn([ 35 | 'stripe_id', 36 | 'pm_type', 37 | 'pm_last_four', 38 | 'trial_ends_at', 39 | ]); 40 | }); 41 | } 42 | }; 43 | -------------------------------------------------------------------------------- /database/migrations/2024_10_23_200027_create_subscriptions_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('user_id'); 19 | $table->string('type'); 20 | $table->string('stripe_id')->unique(); 21 | $table->string('stripe_status'); 22 | $table->string('stripe_price')->nullable(); 23 | $table->integer('quantity')->nullable(); 24 | $table->timestamp('trial_ends_at')->nullable(); 25 | $table->timestamp('ends_at')->nullable(); 26 | $table->timestamps(); 27 | 28 | $table->index(['user_id', 'stripe_status']); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | */ 35 | public function down(): void 36 | { 37 | Schema::dropIfExists('subscriptions'); 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /database/migrations/2024_10_23_200028_create_subscription_items_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('subscription_id'); 19 | $table->string('stripe_id')->unique(); 20 | $table->string('stripe_product'); 21 | $table->string('stripe_price'); 22 | $table->integer('quantity')->nullable(); 23 | $table->timestamps(); 24 | 25 | $table->index(['subscription_id', 'stripe_price']); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | */ 32 | public function down(): void 33 | { 34 | Schema::dropIfExists('subscription_items'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2024_10_29_205607_create_products_table.php: -------------------------------------------------------------------------------- 1 | id(); 19 | $table->string('title'); 20 | $table->string('slug')->unique(); 21 | $table->foreignId('user_id')->constrained('users')->nullOnDelete(); 22 | $table->text('content'); 23 | $table->integer('price')->nullable(); // if no variants exist 24 | $table->integer('stock')->nullable(); // if no variants exist 25 | $table->enum('status', [ProductStatus::values()]); 26 | $table->timestamps(); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | */ 33 | public function down(): void 34 | { 35 | Schema::dropIfExists('products'); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /database/migrations/2024_11_02_094109_create_category_product_table.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->foreignIdFor(Product::class); 21 | $table->foreignIdFor(Category::class); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('category_product'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_11_02_094845_create_orders_table.php: -------------------------------------------------------------------------------- 1 | id(); 19 | $table->uuid('order_id'); 20 | $table->string('email'); 21 | $table->foreignIdFor(User::class)->nullable()->constrained()->nullOnDelete(); 22 | $table->integer('taxes')->nullable(); 23 | $table->integer('discount')->nullable(); 24 | $table->integer('total')->nullable(); 25 | $table->timestamps(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | */ 32 | public function down(): void 33 | { 34 | Schema::dropIfExists('orders'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2024_11_02_095155_create_order_product_table.php: -------------------------------------------------------------------------------- 1 | id(); 20 | $table->foreignIdFor(Order::class)->constrained()->cascadeOnDelete(); 21 | $table->foreignIdFor(Product::class)->constrained()->cascadeOnDelete(); 22 | $table->json('variants')->nullable(); 23 | $table->integer('quantity'); 24 | $table->integer('price'); 25 | $table->timestamps(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | */ 32 | public function down(): void 33 | { 34 | Schema::dropIfExists('order_product'); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /database/migrations/2024_11_02_095552_add_order_status_to_orders_table.php: -------------------------------------------------------------------------------- 1 | enum('status', OrderStatus::values()) 19 | ->after('total') 20 | ->default(OrderStatus::PENDING); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::table('orders', function (Blueprint $table) { 30 | $table->dropColumn('status'); 31 | }); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_11_02_110243_create_product_images_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->foreignId('media_id')->nullable()->constrained('media')->nullOnDelete(); 19 | $table->foreignId('product_id')->constrained('products')->cascadeOnDelete(); 20 | $table->integer('position'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('product_images'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_12_30_210512_add_variants_to_products_table.php: -------------------------------------------------------------------------------- 1 | json('variants')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::table('products', function (Blueprint $table) { 27 | $table->dropColumn('variants'); 28 | }); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2025_02_16_100933_create_countries_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('name'); 17 | $table->string('code'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('countries'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2025_02_16_152246_add_cart_session_id_to_users_table.php: -------------------------------------------------------------------------------- 1 | string('cart_session_id')->nullable()->default(null); 18 | }); 19 | } 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | * 25 | * @return void 26 | */ 27 | public function down() 28 | { 29 | if ((Schema::hasColumn(config('laracart.database.table'), 'cart_session_id'))) { 30 | Schema::table(config('laracart.database.table'), function (Blueprint $table) { 31 | $table->dropColumn('cart_session_id'); 32 | }); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2025_02_16_152827_create_addresses_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('name'); 17 | $table->string('address_line_1'); 18 | $table->string('address_line_2')->nullable(); 19 | $table->string('state')->nullable(); 20 | $table->string('city'); 21 | $table->string('zip'); 22 | $table->foreignId('country_id')->constrained('countries')->nullOnDelete(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::dropIfExists('addresses'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/2025_03_16_124214_add_address_id_to_orders_table.php: -------------------------------------------------------------------------------- 1 | foreignIdFor(Address::class)->nullable()->constrained()->nullOnDelete(); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | Schema::table('orders', function (Blueprint $table) { 26 | $table->dropColumn('address_id'); 27 | }); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2025_03_29_180914_create_app_settings_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('tab')->nullable(); 17 | $table->string('key')->nullable(); 18 | $table->longText('default')->nullable(); 19 | $table->longText('value')->nullable(); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('app_settings'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 19 | 20 | User::factory()->create([ 21 | 'name' => 'Test User', 22 | 'email' => 'test@example.com', 23 | ]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build" 7 | }, 8 | "devDependencies": { 9 | "@tailwindcss/forms": "^0.5.7", 10 | "@tailwindcss/typography": "^0.5.13", 11 | "autoprefixer": "^10.4.19", 12 | "axios": "^1.6.4", 13 | "cropperjs": "^1.6.2", 14 | "daisyui": "^4.12.8", 15 | "laravel-vite-plugin": "^1.0", 16 | "postcss": "^8.4.38", 17 | "postcss-nesting": "^12.1.5", 18 | "tailwindcss": "^3.4.4", 19 | "vite": "^5.0" 20 | }, 21 | "dependencies": { 22 | "dayjs": "^1.11.11", 23 | "tippy.js": "^6.3.7" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | tests/Unit 10 | 11 | 12 | tests/Feature 13 | 14 | 15 | 16 | 17 | app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /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 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/css/codewithdennis/filament-price-filter/filament-price-filter.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/css/codewithdennis/filament-price-filter/filament-price-filter.css -------------------------------------------------------------------------------- /public/css/pxlrbt/filament-spotlight/spotlight-css.css: -------------------------------------------------------------------------------- 1 | .right-5{right:1.25rem}.ml-1{margin-left:.25rem}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.pt-16{padding-top:4rem}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity))}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.duration-150,.transition-opacity{transition-duration:.15s}[x-cloak=""]{display:none!important}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.focus\:border-0:focus{border-width:0}.focus\:border-transparent:focus{border-color:transparent}.focus\:shadow-none:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.sm\:pt-24{padding-top:6rem}} -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handleRequest(Request::capture()); 20 | -------------------------------------------------------------------------------- /public/js/codewithdennis/filament-price-filter/components/filament-price-filter.js: -------------------------------------------------------------------------------- 1 | function t({state:i}){return{state:i,init:function(){}}}export{t as default}; 2 | -------------------------------------------------------------------------------- /public/js/filament/forms/components/key-value.js: -------------------------------------------------------------------------------- 1 | function r({state:o}){return{state:o,rows:[],shouldUpdateRows:!0,init:function(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(t,e)=>{let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(t)===0&&s(e)===0||this.updateRows()})},addRow:function(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow:function(t){this.rows.splice(t,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows:function(t){let e=Alpine.raw(this.rows);this.rows=[];let s=e.splice(t.oldIndex,1)[0];e.splice(t.newIndex,0,s),this.$nextTick(()=>{this.rows=e,this.updateState()})},updateRows:function(){if(!this.shouldUpdateRows){this.shouldUpdateRows=!0;return}let t=[];for(let[e,s]of Object.entries(this.state??{}))t.push({key:e,value:s});this.rows=t},updateState:function(){let t={};this.rows.forEach(e=>{e.key===""||e.key===null||(t[e.key]=e.value)}),this.shouldUpdateRows=!1,this.state=t}}}export{r as default}; 2 | -------------------------------------------------------------------------------- /public/js/filament/forms/components/tags-input.js: -------------------------------------------------------------------------------- 1 | function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{["x-on:blur"]:"createTag()",["x-model"]:"newTag",["x-on:keydown"](t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},["x-on:paste"](){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default}; 2 | -------------------------------------------------------------------------------- /public/js/filament/forms/components/textarea.js: -------------------------------------------------------------------------------- 1 | function r({initialHeight:t,shouldAutosize:i,state:s}){return{state:s,wrapperEl:null,init:function(){this.wrapperEl=this.$el.parentNode,this.setInitialHeight(),i?this.$watch("state",()=>{this.resize()}):this.setUpResizeObserver()},setInitialHeight:function(){this.$el.scrollHeight<=0||(this.wrapperEl.style.height=t+"rem")},resize:function(){if(this.setInitialHeight(),this.$el.scrollHeight<=0)return;let e=this.$el.scrollHeight+"px";this.wrapperEl.style.height!==e&&(this.wrapperEl.style.height=e)},setUpResizeObserver:function(){new ResizeObserver(()=>{this.wrapperEl.style.height=this.$el.style.height}).observe(this.$el)}}}export{r as default}; 2 | -------------------------------------------------------------------------------- /public/media/email-templates/BuildClass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/media/email-templates/BuildClass.png -------------------------------------------------------------------------------- /public/media/email-templates/EmailEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/media/email-templates/EmailEditor.png -------------------------------------------------------------------------------- /public/media/email-templates/Languages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/media/email-templates/Languages.png -------------------------------------------------------------------------------- /public/media/email-templates/TemplateScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/media/email-templates/TemplateScreenShot.png -------------------------------------------------------------------------------- /public/media/email-templates/ThemeEditor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/media/email-templates/ThemeEditor.jpg -------------------------------------------------------------------------------- /public/media/email-templates/ThemeEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/media/email-templates/ThemeEditor.png -------------------------------------------------------------------------------- /public/media/email-templates/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/media/email-templates/logo.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/vendor/filament-email-templates/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/vendor/filament-email-templates/.gitkeep -------------------------------------------------------------------------------- /public/vendor/themes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/public/vendor/themes/.gitkeep -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | [x-cloak] { 6 | display: none; 7 | } 8 | 9 | .login-form hr { 10 | @apply border-t dark:border-gray-700 border-gray-200; 11 | } 12 | -------------------------------------------------------------------------------- /resources/css/filament/admin/tailwind.config.js: -------------------------------------------------------------------------------- 1 | import preset from '../../../../vendor/filament/filament/tailwind.config.preset' 2 | 3 | export default { 4 | presets: [preset], 5 | content: [ 6 | './app/Filament/**/*.php', 7 | './resources/views/filament/**/*.blade.php', 8 | './vendor/filament/**/*.blade.php', 9 | './vendor/codewithdennis/filament-price-filter/resources/**/*.blade.php', 10 | './vendor/awcodes/filament-tiptap-editor/resources/**/*.blade.php', 11 | ], 12 | } 13 | -------------------------------------------------------------------------------- /resources/css/filament/admin/theme.css: -------------------------------------------------------------------------------- 1 | @import '/vendor/filament/filament/resources/css/theme.css'; 2 | @import '/node_modules/cropperjs/dist/cropper.css'; 3 | @import '/vendor/awcodes/filament-curator/resources/css/plugin.css'; 4 | @import '/vendor/awcodes/filament-tiptap-editor/resources/css/plugin.css'; 5 | @import "/node_modules/tippy.js/dist/tippy.css"; 6 | @config 'tailwind.config.js'; 7 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import './bootstrap'; 2 | import { Livewire, Alpine } from '../../vendor/livewire/livewire/dist/livewire.esm.js'; 3 | import humanDate from "../../vendor/matildevoldsen/wire-comments/resources/js/directives/humanDate.js"; 4 | Alpine.directive('human-date', humanDate) 5 | 6 | Livewire.start() 7 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | window.axios = axios; 3 | 4 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 5 | -------------------------------------------------------------------------------- /resources/markdown/policy.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | Edit this file to define the privacy policy for your application. 4 | -------------------------------------------------------------------------------- /resources/markdown/terms.md: -------------------------------------------------------------------------------- 1 | # Terms of Service 2 | 3 | Edit this file to define the terms of service for your application. 4 | -------------------------------------------------------------------------------- /resources/views/api/index.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | {{ __('API Tokens') }} 5 |

6 |
7 | 8 |
9 |
10 | @livewire('api.api-token-manager') 11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /resources/views/auth/confirm-password.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | {{ __('This is a secure area of the application. Please confirm your password before continuing.') }} 9 |
10 | 11 | 12 | 13 |
14 | @csrf 15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | {{ __('Confirm') }} 24 | 25 |
26 |
27 |
28 |
29 | -------------------------------------------------------------------------------- /resources/views/auth/forgot-password.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }} 9 |
10 | 11 | @session('status') 12 |
13 | {{ $value }} 14 |
15 | @endsession 16 | 17 | 18 | 19 |
20 | @csrf 21 | 22 |
23 | 24 | 25 |
26 | 27 |
28 | 29 | {{ __('Email Password Reset Link') }} 30 | 31 |
32 |
33 |
34 |
35 | -------------------------------------------------------------------------------- /resources/views/auth/reset-password.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | @csrf 11 | 12 | 13 | 14 |
15 | 16 | 17 |
18 | 19 |
20 | 21 | 22 |
23 | 24 |
25 | 26 | 27 |
28 | 29 |
30 | 31 | {{ __('Reset Password') }} 32 | 33 |
34 |
35 |
36 |
37 | -------------------------------------------------------------------------------- /resources/views/blocks/previews/carousel.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @foreach($images as $image) 3 | 4 | @endforeach 5 |
6 | -------------------------------------------------------------------------------- /resources/views/blocks/previews/stats.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 7 |
8 | -------------------------------------------------------------------------------- /resources/views/blocks/rendered/carousel.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 7 |
8 | -------------------------------------------------------------------------------- /resources/views/blocks/rendered/stats.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 7 |
8 | -------------------------------------------------------------------------------- /resources/views/components/action-message.blade.php: -------------------------------------------------------------------------------- 1 | @props(['on']) 2 | 3 |
merge(['class' => 'text-sm text-gray-600 dark:text-gray-400']) }}> 9 | {{ $slot->isEmpty() ? 'Saved.' : $slot }} 10 |
11 | -------------------------------------------------------------------------------- /resources/views/components/action-section.blade.php: -------------------------------------------------------------------------------- 1 |
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> 2 | 3 | {{ $title }} 4 | {{ $description }} 5 | 6 | 7 |
8 |
9 | {{ $content }} 10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /resources/views/components/application-mark.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /resources/views/components/authentication-card-logo.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /resources/views/components/authentication-card.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ $logo }} 4 |
5 | 6 |
7 | {{ $slot }} 8 |
9 |
10 | -------------------------------------------------------------------------------- /resources/views/components/button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/views/components/checkbox.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800']) !!}> 2 | -------------------------------------------------------------------------------- /resources/views/components/confirmation-modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => null, 'maxWidth' => null]) 2 | 3 | 4 |
5 |
6 |
7 | 8 | 9 | 10 |
11 | 12 |
13 |

14 | {{ $title }} 15 |

16 | 17 |
18 | {{ $content }} 19 |
20 |
21 |
22 |
23 | 24 |
25 | {{ $footer }} 26 |
27 |
28 | -------------------------------------------------------------------------------- /resources/views/components/confirms-password.blade.php: -------------------------------------------------------------------------------- 1 | @props(['title' => __('Confirm Password'), 'content' => __('For your security, please confirm your password to continue.'), 'button' => __('Confirm')]) 2 | 3 | @php 4 | $confirmableId = md5($attributes->wire('then')); 5 | @endphp 6 | 7 | wire('then') }} 9 | x-data 10 | x-ref="span" 11 | x-on:click="$wire.startConfirmingPassword('{{ $confirmableId }}')" 12 | x-on:password-confirmed.window="setTimeout(() => $event.detail.id === '{{ $confirmableId }}' && $refs.span.dispatchEvent(new CustomEvent('then', { bubbles: false })), 250);" 13 | > 14 | {{ $slot }} 15 | 16 | 17 | @once 18 | 19 | 20 | {{ $title }} 21 | 22 | 23 | 24 | {{ $content }} 25 | 26 |
27 | 31 | 32 | 33 |
34 |
35 | 36 | 37 | 38 | {{ __('Cancel') }} 39 | 40 | 41 | 42 | {{ $button }} 43 | 44 | 45 |
46 | @endonce 47 | -------------------------------------------------------------------------------- /resources/views/components/danger-button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/views/components/dialog-modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => null, 'maxWidth' => null]) 2 | 3 | 4 |
5 |
6 | {{ $title }} 7 |
8 | 9 |
10 | {{ $content }} 11 |
12 |
13 | 14 |
15 | {{ $footer }} 16 |
17 |
18 | -------------------------------------------------------------------------------- /resources/views/components/dropdown-link.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out']) }}>{{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/components/dropdown.blade.php: -------------------------------------------------------------------------------- 1 | @props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white dark:bg-gray-700', 'dropdownClasses' => '']) 2 | 3 | @php 4 | switch ($align) { 5 | case 'left': 6 | $alignmentClasses = 'ltr:origin-top-left rtl:origin-top-right start-0'; 7 | break; 8 | case 'top': 9 | $alignmentClasses = 'origin-top'; 10 | break; 11 | case 'none': 12 | case 'false': 13 | $alignmentClasses = ''; 14 | break; 15 | case 'right': 16 | default: 17 | $alignmentClasses = 'ltr:origin-top-right rtl:origin-top-left end-0'; 18 | break; 19 | } 20 | 21 | switch ($width) { 22 | case '48': 23 | $width = 'w-48'; 24 | break; 25 | } 26 | @endphp 27 | 28 |
29 |
30 | {{ $trigger }} 31 |
32 | 33 | 47 |
48 | -------------------------------------------------------------------------------- /resources/views/components/filament-fabricator/layouts/default.blade.php: -------------------------------------------------------------------------------- 1 | @props(['page']) 2 | 3 | {{-- Header Here --}} 4 | 5 | 6 | 7 | {{-- Footer Here --}} 8 | -------------------------------------------------------------------------------- /resources/views/components/filament-fabricator/page-blocks/article.blade.php: -------------------------------------------------------------------------------- 1 | @aware(['page']) 2 | @props(['limit', 'category', 'sort_by', 'show_load_more', 'heading', 'description']) 3 |
4 | 5 |
6 |
7 |

8 | {{ $heading }} 9 |

10 | @if (tiptap_converter()->asText($description)) 11 |

12 | {!! tiptap_converter()->asHTML($description ?? '', toc: true, maxDepth: 4) !!} 13 |

14 | @endif 15 |
16 | 17 | 18 | 20 |
21 |
22 | -------------------------------------------------------------------------------- /resources/views/components/filament-fabricator/page-blocks/carousel.blade.php: -------------------------------------------------------------------------------- 1 | @aware(['page']) 2 | @props(['images', 'title', 'description']) 3 |
4 |
5 | 6 |

7 | {{ $title }} 8 |

9 | 10 | @if (tiptap_converter()->asText($description)) 11 |

12 | {!! tiptap_converter()->asHTML($description ?? '', toc: true, maxDepth: 4) !!} 13 |

14 | @endif 15 |
16 | 17 |
18 | 23 |
24 |
25 | -------------------------------------------------------------------------------- /resources/views/components/form-section.blade.php: -------------------------------------------------------------------------------- 1 | @props(['submit']) 2 | 3 |
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> 4 | 5 | {{ $title }} 6 | {{ $description }} 7 | 8 | 9 |
10 |
11 |
12 |
13 | {{ $form }} 14 |
15 |
16 | 17 | @if (isset($actions)) 18 |
19 | {{ $actions }} 20 |
21 | @endif 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /resources/views/components/input-error.blade.php: -------------------------------------------------------------------------------- 1 | @props(['for']) 2 | 3 | @error($for) 4 |

merge(['class' => 'text-sm text-red-600 dark:text-red-400']) }}>{{ $message }}

5 | @enderror 6 | -------------------------------------------------------------------------------- /resources/views/components/input.blade.php: -------------------------------------------------------------------------------- 1 | @props(['disabled' => false]) 2 | 3 | merge(['class' => 'border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm']) !!}> 4 | -------------------------------------------------------------------------------- /resources/views/components/label.blade.php: -------------------------------------------------------------------------------- 1 | @props(['value']) 2 | 3 | 6 | -------------------------------------------------------------------------------- /resources/views/components/modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id', 'maxWidth']) 2 | 3 | @php 4 | $id = $id ?? md5($attributes->wire('model')); 5 | 6 | $maxWidth = [ 7 | 'sm' => 'sm:max-w-sm', 8 | 'md' => 'sm:max-w-md', 9 | 'lg' => 'sm:max-w-lg', 10 | 'xl' => 'sm:max-w-xl', 11 | '2xl' => 'sm:max-w-2xl', 12 | ][$maxWidth ?? '2xl']; 13 | @endphp 14 | 15 | 44 | -------------------------------------------------------------------------------- /resources/views/components/nav-link.blade.php: -------------------------------------------------------------------------------- 1 | @props(['active']) 2 | 3 | @php 4 | $classes = ($active ?? false) 5 | ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out' 6 | : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-none focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out'; 7 | @endphp 8 | 9 | merge(['class' => $classes]) }}> 10 | {{ $slot }} 11 | 12 | -------------------------------------------------------------------------------- /resources/views/components/responsive-nav-link.blade.php: -------------------------------------------------------------------------------- 1 | @props(['active']) 2 | 3 | @php 4 | $classes = ($active ?? false) 5 | ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-none focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out' 6 | : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out'; 7 | @endphp 8 | 9 | merge(['class' => $classes]) }}> 10 | {{ $slot }} 11 | 12 | -------------------------------------------------------------------------------- /resources/views/components/secondary-button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/views/components/section-border.blade.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /resources/views/components/section-title.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{{ $title }}

4 | 5 |

6 | {{ $description }} 7 |

8 |
9 | 10 |
11 | {{ $aside ?? '' }} 12 |
13 |
14 | -------------------------------------------------------------------------------- /resources/views/components/switchable-team.blade.php: -------------------------------------------------------------------------------- 1 | @props(['team', 'component' => 'dropdown-link']) 2 | 3 |
4 | @method('PUT') 5 | @csrf 6 | 7 | 8 | 9 | 10 | 11 |
12 | @if (Auth::user()->isCurrentTeam($team)) 13 | 14 | 15 | 16 | @endif 17 | 18 |
{{ $team->name }}
19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /resources/views/components/tag-component.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/components/validation-errors.blade.php: -------------------------------------------------------------------------------- 1 | @if ($errors->any()) 2 |
3 |
{{ __('Whoops! Something went wrong.') }}
4 | 5 |
    6 | @foreach ($errors->all() as $error) 7 |
  • {{ $error }}
  • 8 | @endforeach 9 |
10 |
11 | @endif 12 | -------------------------------------------------------------------------------- /resources/views/dashboard.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | {{ __('Dashboard') }} 5 |

6 |
7 | 8 |
9 |
10 |
11 | 12 |
13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /resources/views/emails/team-invitation.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ __('You have been invited to join the :team team!', ['team' => $invitation->team->name]) }} 3 | 4 | @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::registration())) 5 | {{ __('If you do not have an account, you may create one by clicking the button below. After creating an account, you may click the invitation acceptance button in this email to accept the team invitation:') }} 6 | 7 | @component('mail::button', ['url' => route('register')]) 8 | {{ __('Create Account') }} 9 | @endcomponent 10 | 11 | {{ __('If you already have an account, you may accept this invitation by clicking the button below:') }} 12 | 13 | @else 14 | {{ __('You may accept this invitation by clicking the button below:') }} 15 | @endif 16 | 17 | 18 | @component('mail::button', ['url' => $acceptUrl]) 19 | {{ __('Accept Invitation') }} 20 | @endcomponent 21 | 22 | {{ __('If you did not expect to receive an invitation to this team, you may discard this email.') }} 23 | @endcomponent 24 | -------------------------------------------------------------------------------- /resources/views/forms/components/slug.blade.php: -------------------------------------------------------------------------------- 1 | 5 |
7 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /resources/views/layouts/.editorconfig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/resources/views/layouts/.editorconfig -------------------------------------------------------------------------------- /resources/views/layouts/guest.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{ config('app.name', 'Laravel') }} 9 | 10 | 11 | 12 | 13 | 14 | 15 | @vite(['resources/css/app.css', 'resources/js/app.js']) 16 | 17 | 18 | @livewireStyles 19 | 20 | 21 |
22 | {{ $slot }} 23 |
24 | 25 | @livewireScripts 26 | 27 | 28 | -------------------------------------------------------------------------------- /resources/views/livewire/components/article-card.blade.php: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /resources/views/livewire/components/article-grid.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @if ($this->articles->count() > 0) 3 |
4 | @foreach($this->articles as $article) 5 | 6 | @endforeach 7 |
8 | @if ($this->show_load_more) 9 |
10 |
11 | 16 |
17 |
18 | @endif 19 | @endif 20 |
21 | -------------------------------------------------------------------------------- /resources/views/livewire/components/product-card.blade.php: -------------------------------------------------------------------------------- 1 | 4 |
5 | {{  $product?->image?->alt_text }} 9 |

10 | {{ $product->title }} 11 |

12 | @if ($product->content) 13 |

14 | {!! Str::limit(tiptap_converter()->asText($product?->content, 100)) !!} 15 |

16 | @endif 17 |
18 |
19 | {{ Number::currency(number_format($product->price / 100, 3)) }} 20 |
21 |
22 | -------------------------------------------------------------------------------- /resources/views/livewire/pages/article.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

6 | {{ $article?->title }} 7 |

8 | 9 | {{  $article->image->alt_text }} 10 | 11 | {!! tiptap_converter()->asHTML($article?->content ?? '', toc: true, maxDepth: 4) !!} 12 | 13 | @foreach($article->categories as $category) 14 | 15 | @endforeach 16 |
17 |
18 |
19 |
20 |
21 | 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /resources/views/livewire/pages/category.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

6 | {{ $category?->title }} 7 |

8 | 9 | {{  $category->image->alt_text }} 10 | 11 | {!! tiptap_converter()->asHTML($category?->content ?? '', toc: true, maxDepth: 4) !!} 12 |
13 |
14 | 15 |
16 | @foreach($category->articles as $article) 17 | 18 | @endforeach 19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /resources/views/livewire/pages/home.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @if ($this->articles->count() > 0) 3 |
4 |
5 |

6 | Latest Articles 7 |

8 |
9 | 10 |
11 | @foreach($this->articles as $article) 12 | 13 | @endforeach 14 |
15 |
16 | @endif 17 | 18 | @if ($this->products->count() > 0) 19 |
20 |
21 |

22 | Latest Products 23 |

24 |
25 | 26 |
27 | @foreach($this->products as $product) 28 | 29 | @endforeach 30 |
31 |
32 | @endif 33 |
34 | -------------------------------------------------------------------------------- /resources/views/livewire/pages/page.blade.php: -------------------------------------------------------------------------------- 1 | @props(['page']) 2 |
3 | 4 | 5 | 6 |
7 | -------------------------------------------------------------------------------- /resources/views/policy.blade.php: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 | 6 |
7 | 8 |
9 | {!! $policy !!} 10 |
11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /resources/views/profile/show.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | {{ __('Profile') }} 5 |

6 |
7 | 8 |
9 |
10 | @if (Laravel\Fortify\Features::canUpdateProfileInformation()) 11 | @livewire('profile.update-profile-information-form') 12 | 13 | 14 | @endif 15 | 16 | @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::updatePasswords())) 17 |
18 | @livewire('profile.update-password-form') 19 |
20 | 21 | 22 | @endif 23 | 24 | @if (Laravel\Fortify\Features::canManageTwoFactorAuthentication()) 25 |
26 | @livewire('profile.two-factor-authentication-form') 27 |
28 | 29 | 30 | @endif 31 | 32 |
33 | @livewire('profile.logout-other-browser-sessions-form') 34 |
35 | 36 | @if (Laravel\Jetstream\Jetstream::hasAccountDeletionFeatures()) 37 | 38 | 39 |
40 | @livewire('profile.delete-user-form') 41 |
42 | @endif 43 |
44 |
45 |
46 | -------------------------------------------------------------------------------- /resources/views/profile/update-password-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ __('Update Password') }} 4 | 5 | 6 | 7 | {{ __('Ensure your account is using a long, random password to stay secure.') }} 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
16 | 17 |
18 | 19 | 20 | 21 |
22 | 23 |
24 | 25 | 26 | 27 |
28 |
29 | 30 | 31 | 32 | {{ __('Saved.') }} 33 | 34 | 35 | 36 | {{ __('Save') }} 37 | 38 | 39 |
40 | -------------------------------------------------------------------------------- /resources/views/terms.blade.php: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 | 6 |
7 | 8 |
9 | {!! $terms !!} 10 |
11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/resources/views/vendor/filament-laravel-pulse/.gitkeep -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-cache.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-exceptions.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-queues.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-servers.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-slow-jobs.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-slow-outgoing-requests.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-slow-queries.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-slow-requests.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/filament-laravel-pulse/widgets/pulse-usage.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/views/vendor/pulse/dashboard.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/email/default.blade.php: -------------------------------------------------------------------------------- 1 | @include('vb-email-templates::email.parts._head') 2 | 3 | @include('vb-email-templates::email.parts._body') 4 | 5 | @include('vb-email-templates::email.parts._hero_title') 6 | 7 | @include('vb-email-templates::email.parts._content') 8 | 9 | @include('vb-email-templates::email.parts._support_block') 10 | 11 | @include('vb-email-templates::email.parts._footer') 12 | 13 | @include('vb-email-templates::email.parts._closing_tags') 14 | 15 | 16 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/email/default_preview.blade.php: -------------------------------------------------------------------------------- 1 | 2 | data['colours'] ?> 3 | 4 |
5 | 6 | @include('vb-email-templates::email.parts._body') 7 | 8 | @include('vb-email-templates::email.parts._hero_title') 9 | 10 | @include('vb-email-templates::email.parts._content') 11 | 12 | @include('vb-email-templates::email.parts._support_block') 13 | 14 | @include('vb-email-templates::email.parts._footer') 15 | 16 |
17 | 18 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/email/parts/_button.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 20 |
4 | 5 | 6 | 16 | 17 |
7 | 13 | {{$title??''}} 14 | 15 |
18 |
21 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/email/parts/_closing_tags.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/email/parts/_content.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 18 | 19 |
14 | 15 | {!! $data['content']??'' !!} 16 | 17 |
20 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/email/parts/_hero_title.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 15 | 16 |
13 |

{{ $data['title'] ?? '' }}

14 |
17 | 22 | 23 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/email/parts/_support_block.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 21 | 22 |
14 |

{{__('vb-email-templates::email-templates.general-labels.need-help')}}

15 |

{{__('vb-email-templates::email-templates.general-labels.call-support')}} 16 | 17 | {{config('filament-email-templates.customer-services.phone')}} 18 | 19 |

20 |
23 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /resources/views/vendor/vb-email-templates/forms/components/iframe.blade.php: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /resources/views/vendor/wire-comments/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matildevoldsen/Wire-Content-v2/6111406bfc943b1f781695797a7a4b1408777183/resources/views/vendor/wire-comments/.gitkeep -------------------------------------------------------------------------------- /resources/views/vendor/wire-comments/livewire/components/comment-chunk.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @foreach($comments as $comment) 3 |
4 | 5 |
6 | @endforeach 7 |
8 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | user(); 10 | })->middleware('auth:sanctum'); 11 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 10 | })->purpose('Display an inspiring quote')->hourly(); 11 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | name('home'); 15 | Route::get('/articles/{article:slug}', Article::class)->name('article.show'); 16 | Route::get('/products/{product:slug}', Product::class)->name('product.show'); 17 | Route::get('/{page:slug}', Page::class)->name('page.show'); 18 | Route::get('/categories/{category:slug}', Category::class)->name('category.show'); 19 | 20 | Route::middleware([ 21 | 'auth:sanctum', 22 | config('jetstream.auth_session'), 23 | 'verified', 24 | ])->group(function () { 25 | Route::get('/dashboard', function () { 26 | return view('dashboard'); 27 | })->name('dashboard'); 28 | }); 29 | 30 | Route::middleware('guest')->group(function () { 31 | Route::get('/auth/redirect/{service}', AuthRedirectController::class)->name('auth.redirect'); 32 | Route::get('/auth/callback/{service}', AuthCallbackController::class)->name('auth.callback'); 33 | }); 34 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | import defaultTheme from 'tailwindcss/defaultTheme'; 2 | import forms from '@tailwindcss/forms'; 3 | import typography from '@tailwindcss/typography'; 4 | 5 | /** @type {import('tailwindcss').Config} */ 6 | export default { 7 | content: [ 8 | './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', 9 | './vendor/laravel/jetstream/**/*.blade.php', 10 | './storage/framework/views/*.php', 11 | './resources/views/**/*.blade.php', 12 | './vendor/awcodes/filament-curator/resources/**/*.blade.php', 13 | './vendor/awcodes/filament-tiptap-editor/resources/**/*.blade.php', 14 | "./vendor/robsontenorio/mary/src/View/Components/**/*.php" 15 | ], 16 | 17 | theme: { 18 | extend: { 19 | fontFamily: { 20 | sans: ['Figtree', ...defaultTheme.fontFamily.sans], 21 | }, 22 | }, 23 | }, 24 | 25 | plugins: [ 26 | forms, 27 | typography, 28 | require("daisyui") 29 | ], 30 | }; 31 | -------------------------------------------------------------------------------- /tests/Feature/ApiTokenPermissionsTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 14 | } else { 15 | $this->actingAs($user = User::factory()->create()); 16 | } 17 | 18 | $token = $user->tokens()->create([ 19 | 'name' => 'Test Token', 20 | 'token' => Str::random(40), 21 | 'abilities' => ['create', 'read'], 22 | ]); 23 | 24 | Livewire::test(ApiTokenManager::class) 25 | ->set(['managingPermissionsFor' => $token]) 26 | ->set(['updateApiTokenForm' => [ 27 | 'permissions' => [ 28 | 'delete', 29 | 'missing-permission', 30 | ], 31 | ]]) 32 | ->call('updateApiToken'); 33 | 34 | expect($user->fresh()->tokens->first()) 35 | ->can('delete')->toBeTrue() 36 | ->can('read')->toBeFalse() 37 | ->can('missing-permission')->toBeFalse(); 38 | })->skip(function () { 39 | return ! Features::hasApiFeatures(); 40 | }, 'API support is not enabled.'); 41 | -------------------------------------------------------------------------------- /tests/Feature/AuthenticationTest.php: -------------------------------------------------------------------------------- 1 | get('/login'); 9 | 10 | $response->assertStatus(200); 11 | }); 12 | 13 | test('users can authenticate using the login screen', function () { 14 | $user = User::factory()->create(); 15 | 16 | $response = $this->post('/login', [ 17 | 'email' => $user->email, 18 | 'password' => 'password', 19 | ]); 20 | 21 | $this->assertAuthenticated(); 22 | $response->assertRedirect(route('dashboard', absolute: false)); 23 | }); 24 | 25 | test('users cannot authenticate with invalid password', function () { 26 | $user = User::factory()->create(); 27 | 28 | $this->post('/login', [ 29 | 'email' => $user->email, 30 | 'password' => 'wrong-password', 31 | ]); 32 | 33 | $this->assertGuest(); 34 | }); 35 | -------------------------------------------------------------------------------- /tests/Feature/BrowserSessionsTest.php: -------------------------------------------------------------------------------- 1 | actingAs(User::factory()->create()); 11 | 12 | Livewire::test(LogoutOtherBrowserSessionsForm::class) 13 | ->set('password', 'password') 14 | ->call('logoutOtherBrowserSessions') 15 | ->assertSuccessful(); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/Feature/CreateApiTokenTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 13 | } else { 14 | $this->actingAs($user = User::factory()->create()); 15 | } 16 | 17 | Livewire::test(ApiTokenManager::class) 18 | ->set(['createApiTokenForm' => [ 19 | 'name' => 'Test Token', 20 | 'permissions' => [ 21 | 'read', 22 | 'update', 23 | ], 24 | ]]) 25 | ->call('createApiToken'); 26 | 27 | expect($user->fresh()->tokens)->toHaveCount(1); 28 | expect($user->fresh()->tokens->first()) 29 | ->name->toEqual('Test Token') 30 | ->can('read')->toBeTrue() 31 | ->can('delete')->toBeFalse(); 32 | })->skip(function () { 33 | return ! Features::hasApiFeatures(); 34 | }, 'API support is not enabled.'); 35 | -------------------------------------------------------------------------------- /tests/Feature/DeleteAccountTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 12 | 13 | Livewire::test(DeleteUserForm::class) 14 | ->set('password', 'password') 15 | ->call('deleteUser'); 16 | 17 | expect($user->fresh())->toBeNull(); 18 | })->skip(function () { 19 | return ! Features::hasAccountDeletionFeatures(); 20 | }, 'Account deletion is not enabled.'); 21 | 22 | test('correct password must be provided before account can be deleted', function () { 23 | $this->actingAs($user = User::factory()->create()); 24 | 25 | Livewire::test(DeleteUserForm::class) 26 | ->set('password', 'wrong-password') 27 | ->call('deleteUser') 28 | ->assertHasErrors(['password']); 29 | 30 | expect($user->fresh())->not->toBeNull(); 31 | })->skip(function () { 32 | return ! Features::hasAccountDeletionFeatures(); 33 | }, 'Account deletion is not enabled.'); 34 | -------------------------------------------------------------------------------- /tests/Feature/DeleteApiTokenTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->withPersonalTeam()->create()); 14 | } else { 15 | $this->actingAs($user = User::factory()->create()); 16 | } 17 | 18 | $token = $user->tokens()->create([ 19 | 'name' => 'Test Token', 20 | 'token' => Str::random(40), 21 | 'abilities' => ['create', 'read'], 22 | ]); 23 | 24 | Livewire::test(ApiTokenManager::class) 25 | ->set(['apiTokenIdBeingDeleted' => $token->id]) 26 | ->call('deleteApiToken'); 27 | 28 | expect($user->fresh()->tokens)->toHaveCount(0); 29 | })->skip(function () { 30 | return ! Features::hasApiFeatures(); 31 | }, 'API support is not enabled.'); 32 | -------------------------------------------------------------------------------- /tests/Feature/EmailVerificationTest.php: -------------------------------------------------------------------------------- 1 | withPersonalTeam()->create([ 13 | 'email_verified_at' => null, 14 | ]); 15 | 16 | $response = $this->actingAs($user)->get('/email/verify'); 17 | 18 | $response->assertStatus(200); 19 | })->skip(function () { 20 | return ! Features::enabled(Features::emailVerification()); 21 | }, 'Email verification not enabled.'); 22 | 23 | test('email can be verified', function () { 24 | Event::fake(); 25 | 26 | $user = User::factory()->create([ 27 | 'email_verified_at' => null, 28 | ]); 29 | 30 | $verificationUrl = URL::temporarySignedRoute( 31 | 'verification.verify', 32 | now()->addMinutes(60), 33 | ['id' => $user->id, 'hash' => sha1($user->email)] 34 | ); 35 | 36 | $response = $this->actingAs($user)->get($verificationUrl); 37 | 38 | Event::assertDispatched(Verified::class); 39 | 40 | expect($user->fresh()->hasVerifiedEmail())->toBeTrue(); 41 | $response->assertRedirect(route('dashboard', absolute: false).'?verified=1'); 42 | })->skip(function () { 43 | return ! Features::enabled(Features::emailVerification()); 44 | }, 'Email verification not enabled.'); 45 | 46 | test('email can not verified with invalid hash', function () { 47 | $user = User::factory()->create([ 48 | 'email_verified_at' => null, 49 | ]); 50 | 51 | $verificationUrl = URL::temporarySignedRoute( 52 | 'verification.verify', 53 | now()->addMinutes(60), 54 | ['id' => $user->id, 'hash' => sha1('wrong-email')] 55 | ); 56 | 57 | $this->actingAs($user)->get($verificationUrl); 58 | 59 | expect($user->fresh()->hasVerifiedEmail())->toBeFalse(); 60 | })->skip(function () { 61 | return ! Features::enabled(Features::emailVerification()); 62 | }, 'Email verification not enabled.'); 63 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 7 | 8 | $response->assertStatus(200); 9 | }); 10 | -------------------------------------------------------------------------------- /tests/Feature/PasswordConfirmationTest.php: -------------------------------------------------------------------------------- 1 | withPersonalTeam()->create() 11 | : User::factory()->create(); 12 | 13 | $response = $this->actingAs($user)->get('/user/confirm-password'); 14 | 15 | $response->assertStatus(200); 16 | }); 17 | 18 | test('password can be confirmed', function () { 19 | $user = User::factory()->create(); 20 | 21 | $response = $this->actingAs($user)->post('/user/confirm-password', [ 22 | 'password' => 'password', 23 | ]); 24 | 25 | $response->assertRedirect(); 26 | $response->assertSessionHasNoErrors(); 27 | }); 28 | 29 | test('password is not confirmed with invalid password', function () { 30 | $user = User::factory()->create(); 31 | 32 | $response = $this->actingAs($user)->post('/user/confirm-password', [ 33 | 'password' => 'wrong-password', 34 | ]); 35 | 36 | $response->assertSessionHasErrors(); 37 | }); 38 | -------------------------------------------------------------------------------- /tests/Feature/ProfileInformationTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 11 | 12 | $component = Livewire::test(UpdateProfileInformationForm::class); 13 | 14 | expect($component->state['name'])->toEqual($user->name); 15 | expect($component->state['email'])->toEqual($user->email); 16 | }); 17 | 18 | test('profile information can be updated', function () { 19 | $this->actingAs($user = User::factory()->create()); 20 | 21 | Livewire::test(UpdateProfileInformationForm::class) 22 | ->set('state', ['name' => 'Test Name', 'email' => 'test@example.com']) 23 | ->call('updateProfileInformation'); 24 | 25 | expect($user->fresh()) 26 | ->name->toEqual('Test Name') 27 | ->email->toEqual('test@example.com'); 28 | }); 29 | -------------------------------------------------------------------------------- /tests/Feature/RegistrationTest.php: -------------------------------------------------------------------------------- 1 | get('/register'); 10 | 11 | $response->assertStatus(200); 12 | })->skip(function () { 13 | return ! Features::enabled(Features::registration()); 14 | }, 'Registration support is not enabled.'); 15 | 16 | test('registration screen cannot be rendered if support is disabled', function () { 17 | $response = $this->get('/register'); 18 | 19 | $response->assertStatus(404); 20 | })->skip(function () { 21 | return Features::enabled(Features::registration()); 22 | }, 'Registration support is enabled.'); 23 | 24 | test('new users can register', function () { 25 | $response = $this->post('/register', [ 26 | 'name' => 'Test User', 27 | 'email' => 'test@example.com', 28 | 'password' => 'password', 29 | 'password_confirmation' => 'password', 30 | 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature(), 31 | ]); 32 | 33 | $this->assertAuthenticated(); 34 | $response->assertRedirect(route('dashboard', absolute: false)); 35 | })->skip(function () { 36 | return ! Features::enabled(Features::registration()); 37 | }, 'Registration support is not enabled.'); 38 | -------------------------------------------------------------------------------- /tests/Feature/UpdatePasswordTest.php: -------------------------------------------------------------------------------- 1 | actingAs($user = User::factory()->create()); 12 | 13 | Livewire::test(UpdatePasswordForm::class) 14 | ->set('state', [ 15 | 'current_password' => 'password', 16 | 'password' => 'new-password', 17 | 'password_confirmation' => 'new-password', 18 | ]) 19 | ->call('updatePassword'); 20 | 21 | expect(Hash::check('new-password', $user->fresh()->password))->toBeTrue(); 22 | }); 23 | 24 | test('current password must be correct', function () { 25 | $this->actingAs($user = User::factory()->create()); 26 | 27 | Livewire::test(UpdatePasswordForm::class) 28 | ->set('state', [ 29 | 'current_password' => 'wrong-password', 30 | 'password' => 'new-password', 31 | 'password_confirmation' => 'new-password', 32 | ]) 33 | ->call('updatePassword') 34 | ->assertHasErrors(['current_password']); 35 | 36 | expect(Hash::check('password', $user->fresh()->password))->toBeTrue(); 37 | }); 38 | 39 | test('new passwords must match', function () { 40 | $this->actingAs($user = User::factory()->create()); 41 | 42 | Livewire::test(UpdatePasswordForm::class) 43 | ->set('state', [ 44 | 'current_password' => 'password', 45 | 'password' => 'new-password', 46 | 'password_confirmation' => 'wrong-password', 47 | ]) 48 | ->call('updatePassword') 49 | ->assertHasErrors(['password']); 50 | 51 | expect(Hash::check('password', $user->fresh()->password))->toBeTrue(); 52 | }); 53 | -------------------------------------------------------------------------------- /tests/Pest.php: -------------------------------------------------------------------------------- 1 | in('Feature'); 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Expectations 24 | |-------------------------------------------------------------------------- 25 | | 26 | | When you're writing tests, you often need to check that values meet certain conditions. The 27 | | "expect()" function gives you access to a set of "expectations" methods that you can use 28 | | to assert different things. Of course, you may extend the Expectation API at any time. 29 | | 30 | */ 31 | 32 | expect()->extend('toBeOne', function () { 33 | return $this->toBe(1); 34 | }); 35 | 36 | /* 37 | |-------------------------------------------------------------------------- 38 | | Functions 39 | |-------------------------------------------------------------------------- 40 | | 41 | | While Pest is very powerful out-of-the-box, you may have some testing code specific to your 42 | | project that you don't want to repeat in every file. Here you can also expose helpers as 43 | | global functions to help you to reduce the number of lines of code in your test files. 44 | | 45 | */ 46 | 47 | function something() 48 | { 49 | // .. 50 | } 51 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | toBeTrue(); 7 | }); 8 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import laravel from 'laravel-vite-plugin'; 3 | 4 | export default defineConfig({ 5 | plugins: [ 6 | laravel({ 7 | input: [ 8 | 'resources/css/app.css', 9 | 'resources/js/app.js', 10 | 'resources/css/filament/admin/theme.css' 11 | ], 12 | refresh: true, 13 | }), 14 | ], 15 | }); 16 | --------------------------------------------------------------------------------