generated from boboko/starter
Initial commit
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
.git
|
||||
.env
|
||||
node_modules
|
||||
vendor
|
||||
public/build
|
||||
public/hot
|
||||
storage/app/public/*
|
||||
storage/framework/cache/*
|
||||
storage/framework/sessions/*
|
||||
storage/framework/views/*
|
||||
storage/logs/*
|
||||
bootstrap/cache/*
|
||||
*.md
|
||||
.github
|
||||
tests
|
||||
@@ -0,0 +1,18 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_size = 2
|
||||
|
||||
[{compose,docker-compose}.{yml,yaml}]
|
||||
indent_size = 4
|
||||
@@ -0,0 +1,3 @@
|
||||
DEPLOY_SSH_HOST=deploy@your-vps-host
|
||||
DEPLOY_PATH=/home/deploy/your-domain
|
||||
DEPLOY_BRANCH=master
|
||||
@@ -0,0 +1,87 @@
|
||||
# Unique per VPS deployment: namespaces containers/volumes/networks and the built image tag,
|
||||
# so multiple sites from this same starter can coexist on one host without collisions.
|
||||
COMPOSE_PROJECT_NAME=boboko-starter
|
||||
|
||||
APP_NAME=Laravel
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://localhost
|
||||
|
||||
APP_LOCALE=en
|
||||
APP_FALLBACK_LOCALE=en
|
||||
APP_FAKER_LOCALE=en_US
|
||||
|
||||
APP_MAINTENANCE_DRIVER=file
|
||||
# APP_MAINTENANCE_STORE=database
|
||||
|
||||
# PHP_CLI_SERVER_WORKERS=4
|
||||
|
||||
BCRYPT_ROUNDS=12
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
LOG_STACK=single
|
||||
LOG_DEPRECATIONS_CHANNEL=null
|
||||
LOG_LEVEL=debug
|
||||
|
||||
DB_CONNECTION=pgsql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=5432
|
||||
DB_DATABASE=boboko
|
||||
DB_USERNAME=root
|
||||
DB_PASSWORD=
|
||||
|
||||
SESSION_DRIVER=database
|
||||
SESSION_LIFETIME=120
|
||||
SESSION_ENCRYPT=false
|
||||
SESSION_PATH=/
|
||||
SESSION_DOMAIN=null
|
||||
|
||||
BROADCAST_CONNECTION=log
|
||||
FILESYSTEM_DISK=local
|
||||
QUEUE_CONNECTION=database
|
||||
|
||||
CACHE_STORE=database
|
||||
# CACHE_PREFIX=
|
||||
|
||||
MEMCACHED_HOST=127.0.0.1
|
||||
|
||||
REDIS_CLIENT=phpredis
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_MAILER=log
|
||||
MAIL_SCHEME=null
|
||||
MAIL_HOST=127.0.0.1
|
||||
MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_FROM_ADDRESS="hello@example.com"
|
||||
MAIL_FROM_NAME="${APP_NAME}"
|
||||
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_DEFAULT_REGION=us-east-1
|
||||
AWS_BUCKET=
|
||||
AWS_USE_PATH_STYLE_ENDPOINT=false
|
||||
|
||||
VITE_APP_NAME="${APP_NAME}"
|
||||
|
||||
OTEL_SERVICE_NAME=
|
||||
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
|
||||
OTEL_PROPAGATORS=baggage,tracecontext
|
||||
OTEL_PHP_AUTOLOAD_ENABLED=true
|
||||
OTEL_EXPORTER_OTLP_ENDPOINT=
|
||||
|
||||
STOIC_SECRET=
|
||||
STOIC_SSO_SECRET=
|
||||
STOIC_HOST=http://localhost:2727
|
||||
|
||||
# Host-side ports (change per app if multiple apps share this VPS, or per dev checkout)
|
||||
APP_PORT=8090
|
||||
STOIC_PORT=2727
|
||||
VALKEY_PORT=6339
|
||||
POSTGRES_HOST_PORT=5436
|
||||
MAILPIT_PORT=8025
|
||||
VITE_PORT=5173
|
||||
@@ -0,0 +1,11 @@
|
||||
* text=auto eol=lf
|
||||
|
||||
*.blade.php diff=html
|
||||
*.css diff=css
|
||||
*.html diff=html
|
||||
*.md diff=markdown
|
||||
*.php diff=php
|
||||
|
||||
/.github export-ignore
|
||||
CHANGELOG.md export-ignore
|
||||
.styleci.yml export-ignore
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
*.log
|
||||
.DS_Store
|
||||
.env
|
||||
.env.backup
|
||||
.env.production
|
||||
.env.envoy
|
||||
.phpactor.json
|
||||
.phpunit.result.cache
|
||||
/.cursor/
|
||||
/.idea
|
||||
/.nova
|
||||
/.phpunit.cache
|
||||
/.vscode
|
||||
/.zed
|
||||
/auth.json
|
||||
/node_modules
|
||||
/public/build
|
||||
/public/hot
|
||||
/public/sitemap.xml
|
||||
/public/logos/core
|
||||
/public/storage
|
||||
/storage/*.key
|
||||
/storage/pail
|
||||
/vendor
|
||||
_ide_helper.php
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
Thumbs.db
|
||||
.exports
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
# ── Stage 1: Composer deps ───────────────────────────────────────────────────
|
||||
FROM composer:2 AS composer-build
|
||||
WORKDIR /app
|
||||
COPY composer.json composer.lock ./
|
||||
RUN composer install \
|
||||
--no-dev \
|
||||
--no-interaction \
|
||||
--no-scripts \
|
||||
--prefer-dist \
|
||||
--optimize-autoloader \
|
||||
--ignore-platform-reqs
|
||||
|
||||
# ── Stage 2a: Vite dev (node_modules only, no build) ─────────────────────────
|
||||
FROM node:22-alpine AS vite-dev
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --ignore-scripts
|
||||
|
||||
# ── Stage 2b: Node / Vite build ──────────────────────────────────────────────
|
||||
FROM node:22-alpine AS node-build
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --ignore-scripts
|
||||
COPY . .
|
||||
COPY --from=composer-build /app/vendor ./vendor
|
||||
RUN npm run build
|
||||
|
||||
# ── Stage 3: PHP base (Ubuntu + ondrej/php — pre-compiled, no source builds) ─
|
||||
FROM ubuntu:24.04 AS php-base
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV TZ=UTC
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends software-properties-common ca-certificates gnupg curl \
|
||||
&& add-apt-repository ppa:ondrej/php \
|
||||
&& curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
|
||||
| gpg --dearmor -o /usr/share/keyrings/pgdg.gpg \
|
||||
&& echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] https://apt.postgresql.org/pub/repos/apt noble-pgdg main" \
|
||||
> /etc/apt/sources.list.d/pgdg.list \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
php8.5-fpm \
|
||||
php8.5-cli \
|
||||
php8.5-pgsql \
|
||||
php8.5-intl \
|
||||
php8.5-zip \
|
||||
php8.5-gd \
|
||||
php8.5-bcmath \
|
||||
php8.5-imagick \
|
||||
php8.5-exif \
|
||||
php8.5-mbstring \
|
||||
php8.5-xml \
|
||||
php8.5-curl \
|
||||
php8.5-redis \
|
||||
postgresql-client-18 \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& mkdir -p /run/php \
|
||||
&& sed -i 's|listen = /run/php/php8.5-fpm.sock|listen = 9000|' /etc/php/8.5/fpm/pool.d/www.conf \
|
||||
&& echo "clear_env = no" >> /etc/php/8.5/fpm/pool.d/www.conf
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends php8.5-dev php-pear autoconf gcc make \
|
||||
&& pecl install opentelemetry \
|
||||
&& echo "extension=opentelemetry.so" > /etc/php/8.5/mods-available/opentelemetry.ini \
|
||||
&& phpenmod opentelemetry \
|
||||
&& apt-get purge -y --auto-remove php8.5-dev php-pear autoconf gcc make \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# ── Stage 4: Production ───────────────────────────────────────────────────────
|
||||
FROM php-base AS production
|
||||
|
||||
COPY docker/php/php.ini /etc/php/8.5/fpm/conf.d/99-app.ini
|
||||
COPY docker/php/php.ini /etc/php/8.5/cli/conf.d/99-app.ini
|
||||
COPY docker/php/fpm-pool.conf /etc/php/8.5/fpm/pool.d/zz-app.conf
|
||||
|
||||
WORKDIR /var/www/html
|
||||
|
||||
COPY --from=composer-build /app/vendor ./vendor
|
||||
COPY --from=node-build /app/public/build ./public/build
|
||||
COPY . .
|
||||
|
||||
RUN chown -R www-data:www-data storage bootstrap/cache \
|
||||
&& chmod -R 775 storage bootstrap/cache
|
||||
|
||||
# Package discovery and asset publishing are fully determined by composer.lock + code,
|
||||
# so they belong in the image, not in every container's entrypoint. Only asset-type
|
||||
# tags are force-republished here — config tags (core-config, lunar) are a deliberate
|
||||
# one-time `vendor:publish` step you run and commit by hand, since re-running them would
|
||||
# silently overwrite any local edits to config/core.php or config/lunar/*.php.
|
||||
RUN php artisan package:discover --ansi \
|
||||
&& php artisan vendor:publish --tag=core-assets --force --ansi \
|
||||
&& php artisan vendor:publish --tag=public --force --ansi \
|
||||
&& php artisan filament:assets --ansi
|
||||
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
EXPOSE 9000
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["php-fpm8.5", "-F"]
|
||||
|
||||
# ── Stage 5: Nginx (public assets baked in from production) ──────────────────
|
||||
FROM nginx:alpine AS nginx
|
||||
|
||||
COPY docker/nginx/prod.conf /etc/nginx/conf.d/default.conf
|
||||
COPY --from=production /var/www/html/public /var/www/html/public
|
||||
|
||||
# ── Stage 6: Development ──────────────────────────────────────────────────────
|
||||
FROM php-base AS development
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends git unzip curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
||||
|
||||
COPY docker/php/php.dev.ini /etc/php/8.5/fpm/conf.d/99-app.ini
|
||||
COPY docker/php/php.dev.ini /etc/php/8.5/cli/conf.d/99-app.ini
|
||||
|
||||
WORKDIR /var/www/html
|
||||
|
||||
COPY composer.json composer.lock ./
|
||||
RUN composer install \
|
||||
--no-interaction \
|
||||
--no-scripts \
|
||||
--prefer-dist \
|
||||
--ignore-platform-reqs
|
||||
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
EXPOSE 9000
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["php-fpm8.5", "-F"]
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
@setup
|
||||
if (file_exists(__DIR__.'/.env.envoy')) {
|
||||
foreach (parse_ini_file(__DIR__.'/.env.envoy') as $key => $value) {
|
||||
putenv("$key=$value");
|
||||
}
|
||||
}
|
||||
|
||||
$path = getenv('DEPLOY_PATH') ?: '/home/CHANGE_ME/CHANGE_ME_DOMAIN';
|
||||
$branch = getenv('DEPLOY_BRANCH') ?: 'master';
|
||||
$compose = "docker compose";
|
||||
@endsetup
|
||||
|
||||
@servers(['web' => getenv('DEPLOY_SSH_HOST') ?: 'CHANGE_ME_SSH_HOST', 'local' => '127.0.0.1'])
|
||||
|
||||
|
||||
{{-- DEPLOY --}}
|
||||
|
||||
@macro('deploy')
|
||||
pull
|
||||
docker_build
|
||||
docker_up
|
||||
migrate
|
||||
artisan_optimize
|
||||
restart_workers
|
||||
stoic_generate_thumbs
|
||||
done
|
||||
@endmacro
|
||||
|
||||
@task('pull', ['on' => 'web'])
|
||||
echo ">>> Pulling latest code..."
|
||||
cd {{ $path }}
|
||||
git reset --hard
|
||||
git pull origin {{ $branch }}
|
||||
@endtask
|
||||
|
||||
@task('docker_build', ['on' => 'web'])
|
||||
echo ">>> Building images..."
|
||||
cd {{ $path }}
|
||||
{{ $compose }} build
|
||||
@endtask
|
||||
|
||||
@task('docker_up', ['on' => 'web'])
|
||||
echo ">>> Recreating containers..."
|
||||
cd {{ $path }}
|
||||
{{ $compose }} up -d --remove-orphans
|
||||
@endtask
|
||||
|
||||
@task('migrate', ['on' => 'web'])
|
||||
echo ">>> Running migrations..."
|
||||
cd {{ $path }}
|
||||
{{ $compose }} exec -T app php artisan migrate --force < /dev/null
|
||||
@endtask
|
||||
|
||||
@task('artisan_optimize', ['on' => 'web'])
|
||||
echo ">>> Optimizing..."
|
||||
cd {{ $path }}
|
||||
{{ $compose }} exec -T app php artisan config:cache < /dev/null
|
||||
{{ $compose }} exec -T app php artisan route:cache < /dev/null
|
||||
{{-- {{ $compose }} exec -T app php artisan view:cache --}}
|
||||
{{ $compose }} exec -T app php artisan event:cache < /dev/null
|
||||
@endtask
|
||||
|
||||
@task('restart_workers', ['on' => 'web'])
|
||||
echo ">>> Restarting queue workers..."
|
||||
cd {{ $path }}
|
||||
{{ $compose }} restart queue
|
||||
@endtask
|
||||
|
||||
@task('password_protect', ['on' => 'web'])
|
||||
echo ">>> Maintenance mode on..."
|
||||
cd {{ $path }}
|
||||
{{ $compose }} exec -T app php artisan down --secret="bobobo" < /dev/null
|
||||
@endtask
|
||||
|
||||
@task('done', ['on' => 'web'])
|
||||
echo ""
|
||||
echo "✅ Deployment complete!"
|
||||
echo ""
|
||||
@endtask
|
||||
|
||||
|
||||
{{-- DOWNLOAD EXPORT --}}
|
||||
|
||||
@macro('download')
|
||||
export
|
||||
download_export
|
||||
@endmacro
|
||||
|
||||
@task('export', ['on' => 'web'])
|
||||
echo ">>> Dumping database and files..."
|
||||
cd {{ $path }}
|
||||
rm ./storage/app/private/exports/export*
|
||||
{{ $compose }} exec -T app php artisan boboko:export:cleanup < /dev/null
|
||||
{{ $compose }} exec -T app php artisan boboko:export < /dev/null
|
||||
echo ">>> Copying exports to host..."
|
||||
mkdir -p {{ $path }}/storage/app/private/exports/
|
||||
|
||||
{{ $compose }} cp app:/var/www/html/storage/app/private/exports/. {{ $path }}/storage/app/private/exports/
|
||||
@endtask
|
||||
|
||||
@task('download_export', ['on' => 'local'])
|
||||
echo ">>> Downloading exports..."
|
||||
mkdir -p ./storage/app/private/exports
|
||||
|
||||
scp -r chico:{{ $path }}/storage/app/private/exports/* ./storage/app/private/exports/
|
||||
@endtask
|
||||
|
||||
|
||||
{{-- STOIC THUMBS --}}
|
||||
|
||||
@macro('stoic_thumbs')
|
||||
stoic_generate_thumbs
|
||||
@endmacro
|
||||
|
||||
@task('stoic_generate_thumbs', ['on' => 'web'])
|
||||
echo ">>> Generating Stoic thumbnails..."
|
||||
cd {{ $path }}
|
||||
{{ $compose }} exec -T stoic /app/entrypoint.sh run generate_thumbs
|
||||
@endtask
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
abstract class Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Modules\Core\Customer\Models\Customer as CoreCustomer;
|
||||
|
||||
class Customer extends CoreCustomer
|
||||
{
|
||||
//
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Modules\Core\Auth\Models\Staff as CoreStaff;
|
||||
|
||||
class Staff extends CoreStaff
|
||||
{
|
||||
public function getMorphClass(): string
|
||||
{
|
||||
return 'staff';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use Database\Factories\UserFactory;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Lunar\Base\LunarUser as LunarUserInterface;
|
||||
use Lunar\Base\Traits\LunarUser;
|
||||
use Modules\Core\Auth\Events\UserCreated;
|
||||
|
||||
class User extends Authenticatable implements LunarUserInterface
|
||||
{
|
||||
use LunarUser;
|
||||
|
||||
/** @use HasFactory<UserFactory> */
|
||||
use HasFactory, Notifiable;
|
||||
|
||||
protected $dispatchesEvents = [
|
||||
'created' => UserCreated::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
* @var list<string>
|
||||
*/
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'email',
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that should be hidden for serialization.
|
||||
*
|
||||
* @var list<string>
|
||||
*/
|
||||
protected $hidden = [
|
||||
'remember_token',
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the attributes that should be cast.
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'email_verified_at' => 'datetime',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Models\Customer;
|
||||
use App\Models\Staff;
|
||||
use Illuminate\Database\Eloquent\Relations\Relation;
|
||||
use Illuminate\Support\Facades\URL;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Lunar\Facades\ModelManifest;
|
||||
use Lunar\Facades\Telemetry;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
public function boot(): void
|
||||
{
|
||||
Telemetry::optOut();
|
||||
|
||||
if ($this->app->environment('production')) {
|
||||
URL::forceScheme('https');
|
||||
}
|
||||
|
||||
$this->app->booted(function () {
|
||||
ModelManifest::replace(
|
||||
\Lunar\Models\Contracts\Customer::class,
|
||||
Customer::class,
|
||||
);
|
||||
|
||||
$this->app['config']->set(
|
||||
'auth.providers.staff.model',
|
||||
Staff::class,
|
||||
);
|
||||
|
||||
Relation::morphMap([
|
||||
'staff' => \Lunar\Admin\Models\Staff::class,
|
||||
]);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Lunar\Admin\Support\Facades\LunarPanel;
|
||||
use Modules\Core\Auth\Filament\Pages\Login;
|
||||
use Modules\Core\CorePlugin;
|
||||
|
||||
class PanelServiceProvider extends ServiceProvider
|
||||
{
|
||||
public function register(): void
|
||||
{
|
||||
if (! $this->isAdminRequest()) {
|
||||
return;
|
||||
}
|
||||
|
||||
LunarPanel::panel(function (\Filament\Panel $panel) {
|
||||
return $panel
|
||||
->login(Login::class)
|
||||
->plugin(new CorePlugin());
|
||||
});
|
||||
|
||||
LunarPanel::disableTwoFactorAuth();
|
||||
LunarPanel::register();
|
||||
}
|
||||
|
||||
private function isAdminRequest(): bool
|
||||
{
|
||||
if ($this->app->runningInConsole()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$path = request()->path();
|
||||
|
||||
return str_starts_with($path, 'boboko')
|
||||
|| str_starts_with($path, 'livewire');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
use Illuminate\Foundation\Application;
|
||||
use Symfony\Component\Console\Input\ArgvInput;
|
||||
|
||||
define('LARAVEL_START', microtime(true));
|
||||
|
||||
// Register the Composer autoloader...
|
||||
require __DIR__.'/vendor/autoload.php';
|
||||
|
||||
// Bootstrap Laravel and handle the command...
|
||||
/** @var Application $app */
|
||||
$app = require_once __DIR__.'/bootstrap/app.php';
|
||||
|
||||
$status = $app->handleCommand(new ArgvInput);
|
||||
|
||||
exit($status);
|
||||
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env bash
|
||||
docker compose -f docker-compose.dev.yml "$@"
|
||||
Executable
+2
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env bash
|
||||
docker compose -f docker-compose.dev.yml -f docker-compose.core-dev.yml "$@"
|
||||
@@ -0,0 +1 @@
|
||||
php8.5-imagick php8.5-zip
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Foundation\Configuration\Exceptions;
|
||||
use Illuminate\Foundation\Configuration\Middleware;
|
||||
|
||||
return Application::configure(basePath: dirname(__DIR__))
|
||||
->withRouting(
|
||||
web: __DIR__.'/../routes/web.php',
|
||||
commands: __DIR__.'/../routes/console.php',
|
||||
health: '/up',
|
||||
)
|
||||
->withMiddleware(function (Middleware $middleware): void {
|
||||
//
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions): void {
|
||||
//
|
||||
})->create();
|
||||
Executable
+2
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
use App\Providers\AppServiceProvider;
|
||||
use App\Providers\PanelServiceProvider;
|
||||
|
||||
return [
|
||||
AppServiceProvider::class,
|
||||
PanelServiceProvider::class,
|
||||
];
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"$schema": "https://getcomposer.org/schema.json",
|
||||
"name": "laravel/laravel",
|
||||
"type": "project",
|
||||
"description": "The skeleton application for the Laravel framework.",
|
||||
"keywords": [
|
||||
"laravel",
|
||||
"framework"
|
||||
],
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"artesaos/seotools": "^1.4",
|
||||
"boboko/core": "^0.0.2",
|
||||
"open-telemetry/exporter-otlp": "^1.4",
|
||||
"open-telemetry/opentelemetry-auto-laravel": "^1.7",
|
||||
"open-telemetry/sdk": "^1.14",
|
||||
"php-http/guzzle7-adapter": "^1.1",
|
||||
"spatie/laravel-sitemap": "^8.1",
|
||||
"spatie/laravel-webhook-server": "^3.10",
|
||||
"tbachert/spi": "^1.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Tests\\": "tests/"
|
||||
}
|
||||
},
|
||||
"_repositories": [
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../boboko-core",
|
||||
"options": {
|
||||
"symlink": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://code.radical-elements.com/boboko/core.git"
|
||||
}
|
||||
],
|
||||
"scripts": {
|
||||
"setup": [
|
||||
"composer install",
|
||||
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
|
||||
"@php artisan key:generate",
|
||||
"@php artisan migrate --force",
|
||||
"npm install --ignore-scripts",
|
||||
"npm run build"
|
||||
],
|
||||
"dev": [
|
||||
"Composer\\Config::disableProcessTimeout",
|
||||
"npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1 --timeout=0\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others"
|
||||
],
|
||||
"test": [
|
||||
"@php artisan config:clear --ansi",
|
||||
"@php artisan test"
|
||||
],
|
||||
"post-autoload-dump": [
|
||||
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
||||
"@php artisan package:discover --ansi",
|
||||
"@php artisan vendor:publish --tag=core-assets --force"
|
||||
],
|
||||
"post-update-cmd": [
|
||||
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
|
||||
],
|
||||
"post-root-package-install": [
|
||||
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
||||
],
|
||||
"post-create-project-cmd": [
|
||||
"@php artisan key:generate --ansi",
|
||||
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
|
||||
"@php artisan migrate --graceful --ansi"
|
||||
],
|
||||
"pre-package-uninstall": [
|
||||
"Illuminate\\Foundation\\ComposerScripts::prePackageUninstall"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"dont-discover": []
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"pestphp/pest-plugin": true,
|
||||
"php-http/discovery": true,
|
||||
"tbachert/spi": true
|
||||
}
|
||||
},
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true
|
||||
}
|
||||
Generated
+12707
File diff suppressed because it is too large
Load Diff
+126
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value is the name of your application, which will be used when the
|
||||
| framework needs to place the application's name in a notification or
|
||||
| other UI elements where an application name needs to be displayed.
|
||||
|
|
||||
*/
|
||||
|
||||
'name' => env('APP_NAME', 'Laravel'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Environment
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines the "environment" your application is currently
|
||||
| running in. This may determine how you prefer to configure various
|
||||
| services the application utilizes. Set this in your ".env" file.
|
||||
|
|
||||
*/
|
||||
|
||||
'env' => env('APP_ENV', 'production'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Debug Mode
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When your application is in debug mode, detailed error messages with
|
||||
| stack traces will be shown on every error that occurs within your
|
||||
| application. If disabled, a simple generic error page is shown.
|
||||
|
|
||||
*/
|
||||
|
||||
'debug' => (bool) env('APP_DEBUG', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This URL is used by the console to properly generate URLs when using
|
||||
| the Artisan command line tool. You should set this to the root of
|
||||
| the application so that it's available within Artisan commands.
|
||||
|
|
||||
*/
|
||||
|
||||
'url' => env('APP_URL', 'http://localhost'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Timezone
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default timezone for your application, which
|
||||
| will be used by the PHP date and date-time functions. The timezone
|
||||
| is set to "UTC" by default as it is suitable for most use cases.
|
||||
|
|
||||
*/
|
||||
|
||||
'timezone' => 'UTC',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Locale Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The application locale determines the default locale that will be used
|
||||
| by Laravel's translation / localization methods. This option can be
|
||||
| set to any locale for which you plan to have translation strings.
|
||||
|
|
||||
*/
|
||||
|
||||
'locale' => env('APP_LOCALE', 'en'),
|
||||
|
||||
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
|
||||
|
||||
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This key is utilized by Laravel's encryption services and should be set
|
||||
| to a random, 32 character string to ensure that all encrypted values
|
||||
| are secure. You should do this prior to deploying the application.
|
||||
|
|
||||
*/
|
||||
|
||||
'cipher' => 'AES-256-CBC',
|
||||
|
||||
'key' => env('APP_KEY'),
|
||||
|
||||
'previous_keys' => [
|
||||
...array_filter(
|
||||
explode(',', (string) env('APP_PREVIOUS_KEYS', ''))
|
||||
),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Maintenance Mode Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options determine the driver used to determine and
|
||||
| manage Laravel's "maintenance mode" status. The "cache" driver will
|
||||
| allow maintenance mode to be controlled across multiple machines.
|
||||
|
|
||||
| Supported drivers: "file", "cache"
|
||||
|
|
||||
*/
|
||||
|
||||
'maintenance' => [
|
||||
'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
|
||||
'store' => env('APP_MAINTENANCE_STORE', 'database'),
|
||||
],
|
||||
|
||||
];
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
use App\Models\User;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Defaults
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default authentication "guard" and password
|
||||
| reset "broker" for your application. You may change these values
|
||||
| as required, but they're a perfect start for most applications.
|
||||
|
|
||||
*/
|
||||
|
||||
'defaults' => [
|
||||
'guard' => env('AUTH_GUARD', 'web'),
|
||||
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Guards
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Next, you may define every authentication guard for your application.
|
||||
| Of course, a great default configuration has been defined for you
|
||||
| which utilizes session storage plus the Eloquent user provider.
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| Supported: "session"
|
||||
|
|
||||
*/
|
||||
|
||||
'guards' => [
|
||||
'web' => [
|
||||
'driver' => 'session',
|
||||
'provider' => 'users',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| User Providers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| If you have multiple user tables or models you may configure multiple
|
||||
| providers to represent the model / table. These providers may then
|
||||
| be assigned to any extra authentication guards you have defined.
|
||||
|
|
||||
| Supported: "database", "eloquent"
|
||||
|
|
||||
*/
|
||||
|
||||
'providers' => [
|
||||
'users' => [
|
||||
'driver' => 'eloquent',
|
||||
'model' => env('AUTH_MODEL', User::class),
|
||||
],
|
||||
|
||||
// 'users' => [
|
||||
// 'driver' => 'database',
|
||||
// 'table' => 'users',
|
||||
// ],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Resetting Passwords
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options specify the behavior of Laravel's password
|
||||
| reset functionality, including the table utilized for token storage
|
||||
| and the user provider that is invoked to actually retrieve users.
|
||||
|
|
||||
| The expiry time is the number of minutes that each reset token will be
|
||||
| considered valid. This security feature keeps tokens short-lived so
|
||||
| they have less time to be guessed. You may change this as needed.
|
||||
|
|
||||
| The throttle setting is the number of seconds a user must wait before
|
||||
| generating more password reset tokens. This prevents the user from
|
||||
| quickly generating a very large amount of password reset tokens.
|
||||
|
|
||||
*/
|
||||
|
||||
'passwords' => [
|
||||
'users' => [
|
||||
'provider' => 'users',
|
||||
'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
|
||||
'expire' => 60,
|
||||
'throttle' => 60,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Confirmation Timeout
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define the number of seconds before a password confirmation
|
||||
| window expires and users are asked to re-enter their password via the
|
||||
| confirmation screen. By default, the timeout lasts for three hours.
|
||||
|
|
||||
*/
|
||||
|
||||
'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
|
||||
|
||||
];
|
||||
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Cache Store
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default cache store that will be used by the
|
||||
| framework. This connection is utilized if another isn't explicitly
|
||||
| specified when running a cache operation inside the application.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('CACHE_STORE', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Stores
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define all of the cache "stores" for your application as
|
||||
| well as their drivers. You may even define multiple stores for the
|
||||
| same cache driver to group types of items stored in your caches.
|
||||
|
|
||||
| Supported drivers: "array", "database", "file", "memcached",
|
||||
| "redis", "dynamodb", "octane",
|
||||
| "failover", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'stores' => [
|
||||
|
||||
'array' => [
|
||||
'driver' => 'array',
|
||||
'serialize' => false,
|
||||
],
|
||||
|
||||
'database' => [
|
||||
'driver' => 'database',
|
||||
'connection' => env('DB_CACHE_CONNECTION'),
|
||||
'table' => env('DB_CACHE_TABLE', 'cache'),
|
||||
'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'),
|
||||
'lock_table' => env('DB_CACHE_LOCK_TABLE'),
|
||||
],
|
||||
|
||||
'file' => [
|
||||
'driver' => 'file',
|
||||
'path' => storage_path('framework/cache/data'),
|
||||
'lock_path' => storage_path('framework/cache/data'),
|
||||
],
|
||||
|
||||
'memcached' => [
|
||||
'driver' => 'memcached',
|
||||
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
|
||||
'sasl' => [
|
||||
env('MEMCACHED_USERNAME'),
|
||||
env('MEMCACHED_PASSWORD'),
|
||||
],
|
||||
'options' => [
|
||||
// Memcached::OPT_CONNECT_TIMEOUT => 2000,
|
||||
],
|
||||
'servers' => [
|
||||
[
|
||||
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
|
||||
'port' => env('MEMCACHED_PORT', 11211),
|
||||
'weight' => 100,
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'redis' => [
|
||||
'driver' => 'redis',
|
||||
'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
|
||||
'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
|
||||
],
|
||||
|
||||
'dynamodb' => [
|
||||
'driver' => 'dynamodb',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
|
||||
'endpoint' => env('DYNAMODB_ENDPOINT'),
|
||||
],
|
||||
|
||||
'octane' => [
|
||||
'driver' => 'octane',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'driver' => 'failover',
|
||||
'stores' => [
|
||||
'database',
|
||||
'array',
|
||||
],
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Key Prefix
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When utilizing the APC, database, memcached, Redis, and DynamoDB cache
|
||||
| stores, there might be other applications using the same cache. For
|
||||
| that reason, you may prefix every cache key to avoid collisions.
|
||||
|
|
||||
*/
|
||||
|
||||
'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'),
|
||||
|
||||
];
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Auto-create Customer for User
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When enabled, creating a User automatically creates and attaches a bare
|
||||
| Customer record (storefront passwordless-signup convention). Shops that
|
||||
| drive the relationship the other way around (creating a Customer first,
|
||||
| then a User for portal login) should set this to false.
|
||||
|
|
||||
*/
|
||||
|
||||
'auto_create_customer_for_user' => true,
|
||||
|
||||
];
|
||||
@@ -0,0 +1,184 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Pdo\Mysql;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Database Connection Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify which of the database connections below you wish
|
||||
| to use as your default connection for database operations. This is
|
||||
| the connection which will be utilized unless another connection
|
||||
| is explicitly specified when you execute a query / statement.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('DB_CONNECTION', 'sqlite'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Database Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Below are all of the database connections defined for your application.
|
||||
| An example configuration is provided for each database system which
|
||||
| is supported by Laravel. You're free to add / remove connections.
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => [
|
||||
|
||||
'sqlite' => [
|
||||
'driver' => 'sqlite',
|
||||
'url' => env('DB_URL'),
|
||||
'database' => env('DB_DATABASE', database_path('database.sqlite')),
|
||||
'prefix' => '',
|
||||
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
|
||||
'busy_timeout' => null,
|
||||
'journal_mode' => null,
|
||||
'synchronous' => null,
|
||||
'transaction_mode' => 'DEFERRED',
|
||||
],
|
||||
|
||||
'mysql' => [
|
||||
'driver' => 'mysql',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '3306'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'unix_socket' => env('DB_SOCKET', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8mb4'),
|
||||
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
'options' => extension_loaded('pdo_mysql') ? array_filter([
|
||||
(PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
|
||||
]) : [],
|
||||
],
|
||||
|
||||
'mariadb' => [
|
||||
'driver' => 'mariadb',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '3306'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'unix_socket' => env('DB_SOCKET', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8mb4'),
|
||||
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
'options' => extension_loaded('pdo_mysql') ? array_filter([
|
||||
(PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
|
||||
]) : [],
|
||||
],
|
||||
|
||||
'pgsql' => [
|
||||
'driver' => 'pgsql',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '5432'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'search_path' => 'public',
|
||||
'sslmode' => env('DB_SSLMODE', 'prefer'),
|
||||
],
|
||||
|
||||
'sqlsrv' => [
|
||||
'driver' => 'sqlsrv',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', 'localhost'),
|
||||
'port' => env('DB_PORT', '1433'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
// 'encrypt' => env('DB_ENCRYPT', 'yes'),
|
||||
// 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Migration Repository Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This table keeps track of all the migrations that have already run for
|
||||
| your application. Using this information, we can determine which of
|
||||
| the migrations on disk haven't actually been run on the database.
|
||||
|
|
||||
*/
|
||||
|
||||
'migrations' => [
|
||||
'table' => 'migrations',
|
||||
'update_date_on_publish' => true,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Redis Databases
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Redis is an open source, fast, and advanced key-value store that also
|
||||
| provides a richer body of commands than a typical key-value system
|
||||
| such as Memcached. You may define your connection settings here.
|
||||
|
|
||||
*/
|
||||
|
||||
'redis' => [
|
||||
|
||||
'client' => env('REDIS_CLIENT', 'phpredis'),
|
||||
|
||||
'options' => [
|
||||
'cluster' => env('REDIS_CLUSTER', 'redis'),
|
||||
'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'),
|
||||
'persistent' => env('REDIS_PERSISTENT', false),
|
||||
],
|
||||
|
||||
'default' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'username' => env('REDIS_USERNAME'),
|
||||
'password' => env('REDIS_PASSWORD'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_DB', '0'),
|
||||
'max_retries' => env('REDIS_MAX_RETRIES', 3),
|
||||
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
|
||||
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
|
||||
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
|
||||
],
|
||||
|
||||
'cache' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'username' => env('REDIS_USERNAME'),
|
||||
'password' => env('REDIS_PASSWORD'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_CACHE_DB', '1'),
|
||||
'max_retries' => env('REDIS_MAX_RETRIES', 3),
|
||||
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
|
||||
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
|
||||
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Filesystem Disk
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default filesystem disk that should be used
|
||||
| by the framework. The "local" disk, as well as a variety of cloud
|
||||
| based disks are available to your application for file storage.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('FILESYSTEM_DISK', 'local'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filesystem Disks
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Below you may configure as many filesystem disks as necessary, and you
|
||||
| may even configure multiple disks for the same driver. Examples for
|
||||
| most supported storage drivers are configured here for reference.
|
||||
|
|
||||
| Supported drivers: "local", "ftp", "sftp", "s3"
|
||||
|
|
||||
*/
|
||||
|
||||
'disks' => [
|
||||
|
||||
'local' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/private'),
|
||||
'serve' => true,
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
'public' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/public'),
|
||||
'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage',
|
||||
'visibility' => 'public',
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
's3' => [
|
||||
'driver' => 's3',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION'),
|
||||
'bucket' => env('AWS_BUCKET'),
|
||||
'url' => env('AWS_URL'),
|
||||
'endpoint' => env('AWS_ENDPOINT'),
|
||||
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Symbolic Links
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the symbolic links that will be created when the
|
||||
| `storage:link` Artisan command is executed. The array keys should be
|
||||
| the locations of the links and the values should be their targets.
|
||||
|
|
||||
*/
|
||||
|
||||
'links' => [
|
||||
public_path('storage') => storage_path('app/public'),
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
use Monolog\Handler\NullHandler;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Handler\SyslogUdpHandler;
|
||||
use Monolog\Processor\PsrLogMessageProcessor;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default log channel that is utilized to write
|
||||
| messages to your logs. The value provided here should match one of
|
||||
| the channels present in the list of "channels" configured below.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('LOG_CHANNEL', 'stack'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Deprecations Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the log channel that should be used to log warnings
|
||||
| regarding deprecated PHP and library features. This allows you to get
|
||||
| your application ready for upcoming major versions of dependencies.
|
||||
|
|
||||
*/
|
||||
|
||||
'deprecations' => [
|
||||
'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
|
||||
'trace' => env('LOG_DEPRECATIONS_TRACE', false),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Log Channels
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the log channels for your application. Laravel
|
||||
| utilizes the Monolog PHP logging library, which includes a variety
|
||||
| of powerful log handlers and formatters that you're free to use.
|
||||
|
|
||||
| Available drivers: "single", "daily", "slack", "syslog",
|
||||
| "errorlog", "monolog", "custom", "stack"
|
||||
|
|
||||
*/
|
||||
|
||||
'channels' => [
|
||||
|
||||
'stack' => [
|
||||
'driver' => 'stack',
|
||||
'channels' => explode(',', (string) env('LOG_STACK', 'single')),
|
||||
'ignore_exceptions' => false,
|
||||
],
|
||||
|
||||
'single' => [
|
||||
'driver' => 'single',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'daily' => [
|
||||
'driver' => 'daily',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'days' => env('LOG_DAILY_DAYS', 14),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'driver' => 'slack',
|
||||
'url' => env('LOG_SLACK_WEBHOOK_URL'),
|
||||
'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')),
|
||||
'emoji' => env('LOG_SLACK_EMOJI', ':boom:'),
|
||||
'level' => env('LOG_LEVEL', 'critical'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'papertrail' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
|
||||
'handler_with' => [
|
||||
'host' => env('PAPERTRAIL_URL'),
|
||||
'port' => env('PAPERTRAIL_PORT'),
|
||||
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
|
||||
],
|
||||
'processors' => [PsrLogMessageProcessor::class],
|
||||
],
|
||||
|
||||
'stderr' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'handler' => StreamHandler::class,
|
||||
'handler_with' => [
|
||||
'stream' => 'php://stderr',
|
||||
],
|
||||
'formatter' => env('LOG_STDERR_FORMATTER'),
|
||||
'processors' => [PsrLogMessageProcessor::class],
|
||||
],
|
||||
|
||||
'syslog' => [
|
||||
'driver' => 'syslog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'errorlog' => [
|
||||
'driver' => 'errorlog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'null' => [
|
||||
'driver' => 'monolog',
|
||||
'handler' => NullHandler::class,
|
||||
],
|
||||
|
||||
'emergency' => [
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
|
||||
use Lunar\Actions\Carts\GenerateFingerprint;
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Fingerprint Generator
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Specify which class should be used when generating a cart fingerprint.
|
||||
|
|
||||
*/
|
||||
'fingerprint_generator' => GenerateFingerprint::class,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication policy
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When a user logs in, by default, Lunar will merge the current (guest) cart
|
||||
| with the users current cart, if they have one.
|
||||
| Available options: 'merge', 'override'
|
||||
|
|
||||
*/
|
||||
'auth_policy' => 'merge',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cart Pipelines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Define which pipelines should be run when performing cart calculations.
|
||||
| The default ones provided should suit most needs, however you are
|
||||
| free to add your own as you see fit.
|
||||
|
|
||||
| Each pipeline class will be run from top to bottom.
|
||||
|
|
||||
*/
|
||||
'pipelines' => [
|
||||
/*
|
||||
* Run these pipelines when the cart is calculating.
|
||||
*/
|
||||
'cart' => [
|
||||
Lunar\Pipelines\Cart\CalculateLines::class,
|
||||
Lunar\Pipelines\Cart\ApplyShipping::class,
|
||||
Lunar\Pipelines\Cart\ApplyDiscounts::class,
|
||||
Lunar\Pipelines\Cart\CalculateTax::class,
|
||||
Lunar\Pipelines\Cart\Calculate::class,
|
||||
],
|
||||
|
||||
/*
|
||||
* Run these pipelines when the cart lines are being calculated.
|
||||
*/
|
||||
'cart_lines' => [
|
||||
Lunar\Pipelines\CartLine\GetUnitPrice::class,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cart Actions
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you can decide what action should be run during a Carts lifecycle.
|
||||
| The default actions should be fine for most cases.
|
||||
|
|
||||
*/
|
||||
'actions' => [
|
||||
'add_to_cart' => Lunar\Actions\Carts\AddOrUpdatePurchasable::class,
|
||||
'get_existing_cart_line' => Lunar\Actions\Carts\GetExistingCartLine::class,
|
||||
'update_cart_line' => Lunar\Actions\Carts\UpdateCartLine::class,
|
||||
'remove_from_cart' => Lunar\Actions\Carts\RemovePurchasable::class,
|
||||
'add_address' => Lunar\Actions\Carts\AddAddress::class,
|
||||
'set_shipping_option' => Lunar\Actions\Carts\SetShippingOption::class,
|
||||
'order_create' => Lunar\Actions\Carts\CreateOrder::class,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cart Action Validators
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You may wish to provide additional validation when actions executed on
|
||||
| the cart model. The defaults provided should be enough for most cases.
|
||||
|
|
||||
*/
|
||||
'validators' => [
|
||||
|
||||
'add_to_cart' => [
|
||||
Lunar\Validation\CartLine\CartLineQuantity::class,
|
||||
Lunar\Validation\CartLine\CartLineStock::class,
|
||||
],
|
||||
|
||||
'update_cart_line' => [
|
||||
Lunar\Validation\CartLine\CartLineQuantity::class,
|
||||
Lunar\Validation\CartLine\CartLineStock::class,
|
||||
],
|
||||
|
||||
'remove_from_cart' => [],
|
||||
|
||||
'set_shipping_option' => [
|
||||
Lunar\Validation\Cart\ShippingOptionValidator::class,
|
||||
],
|
||||
|
||||
'order_create' => [
|
||||
Lunar\Validation\Cart\ValidateCartForOrderCreation::class,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default eager loading
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When loading up a cart and doing calculations, there's a few relationships
|
||||
| that are used when it's running. Here you can define which relationships
|
||||
| should be eager loaded when these calculations take place.
|
||||
|
|
||||
*/
|
||||
'eager_load' => [
|
||||
'currency',
|
||||
'lines.purchasable.taxClass',
|
||||
'lines.purchasable.values',
|
||||
'lines.purchasable.product.thumbnail',
|
||||
'lines.purchasable.prices.currency',
|
||||
'lines.purchasable.prices.priceable',
|
||||
'lines.purchasable.product',
|
||||
'lines.cart.currency',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Prune carts
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Should the cart models be pruned to prevent data build up and
|
||||
| some settings controlling how pruning should be determined
|
||||
|
|
||||
*/
|
||||
'prune_tables' => [
|
||||
|
||||
'enabled' => false,
|
||||
|
||||
'pipelines' => [
|
||||
Lunar\Pipelines\CartPrune\PruneAfter::class,
|
||||
Lunar\Pipelines\CartPrune\WithoutOrders::class,
|
||||
Lunar\Pipelines\CartPrune\WhereNotMerged::class,
|
||||
],
|
||||
|
||||
'prune_interval' => 90, // days
|
||||
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Key
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Specify the session key used when fetching the cart.
|
||||
|
|
||||
*/
|
||||
'session_key' => 'lunar_cart',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Auto create a cart when none exists for user.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Determines whether you want to automatically create a cart for a user if
|
||||
| they do not currently have one in the session. By default, this is false
|
||||
| to minimise the amount of carts added to the database.
|
||||
|
|
||||
*/
|
||||
'auto_create' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Allow Carts to have multiple orders associated.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Determines whether the same cart instance will be returned if there is already
|
||||
| a completed order associated to the cart which is retrieved in the session.
|
||||
| When set to false, if a cart has a completed order, then a new instance
|
||||
| of a cart will be returned, even if auto_create is set to false
|
||||
|
|
||||
*/
|
||||
'allow_multiple_orders_per_cart' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Delete cart on logout
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Determines whether the cart sholud be soft deleted when the user logs out.
|
||||
|
|
||||
*/
|
||||
'delete_on_forget' => true,
|
||||
];
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'connection' => null,
|
||||
|
||||
'table_prefix' => 'lunar_',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Morph Prefix
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If you wish to prefix Lunar's morph mapping in the database, you can
|
||||
| set that here e.g. `lunar_product` instead of `product`
|
||||
|
|
||||
*/
|
||||
'morph_prefix' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Users Table ID
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Lunar adds a relationship to your 'users' table and by default assumes
|
||||
| a 'bigint'. You can change this to either an 'int' or 'uuid'.
|
||||
|
|
||||
*/
|
||||
'users_id_type' => 'bigint',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Disable migrations
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Prevent Lunar`s default package migrations from running for the core.
|
||||
| Set to 'true' to disable.
|
||||
|
|
||||
*/
|
||||
'disable_migrations' => false,
|
||||
|
||||
];
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use Lunar\Base\Validation\CouponValidator;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Coupon Validator
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you can specify the class which validates coupons. This is useful if you
|
||||
| want to have custom logic for what determines whether a coupon can be used.
|
||||
|
|
||||
*/
|
||||
'coupon_validator' => CouponValidator::class,
|
||||
|
||||
];
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Lunar\Base\StandardMediaDefinitions;
|
||||
|
||||
return [
|
||||
|
||||
'definitions' => [
|
||||
'asset' => StandardMediaDefinitions::class,
|
||||
'brand' => StandardMediaDefinitions::class,
|
||||
'collection' => StandardMediaDefinitions::class,
|
||||
'product' => StandardMediaDefinitions::class,
|
||||
'product-option' => StandardMediaDefinitions::class,
|
||||
'product-option-value' => StandardMediaDefinitions::class,
|
||||
],
|
||||
|
||||
'collection' => 'images',
|
||||
|
||||
'fallback' => [
|
||||
'url' => env('FALLBACK_IMAGE_URL', null),
|
||||
'path' => env('FALLBACK_IMAGE_PATH', null),
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
use Lunar\Base\OrderReferenceGenerator;
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Order Reference Format
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Specify the format for the order reference generator to use.
|
||||
|
|
||||
*/
|
||||
'reference_format' => [
|
||||
/**
|
||||
* Optional prefix for the order reference
|
||||
*/
|
||||
'prefix' => null,
|
||||
|
||||
/**
|
||||
* STR_PAD_LEFT: 00001965
|
||||
* STR_PAD_RIGHT: 19650000
|
||||
* STR_PAD_BOTH: 00196500
|
||||
*/
|
||||
'padding_direction' => STR_PAD_LEFT,
|
||||
|
||||
/**
|
||||
* 00001965
|
||||
* AAAA1965
|
||||
*/
|
||||
'padding_character' => '0',
|
||||
|
||||
/**
|
||||
* If the length specified below is smaller than the length
|
||||
* of the Order ID, then no padding will take place.
|
||||
*/
|
||||
'length' => 8,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Order Reference Generator
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you can specify how you want your order references to be generated
|
||||
| when you create an order from a cart.
|
||||
|
|
||||
*/
|
||||
'reference_generator' => OrderReferenceGenerator::class,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Draft Status
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When a draft order is created from a cart, we need an initial status for
|
||||
| the order that's created. Define that here, it can be anything that would
|
||||
| make sense for the store you're building.
|
||||
|
|
||||
*/
|
||||
'draft_status' => 'awaiting-payment',
|
||||
|
||||
'statuses' => [
|
||||
|
||||
'awaiting-payment' => [
|
||||
'label' => 'Awaiting Payment',
|
||||
'color' => '#848a8c',
|
||||
'mailers' => [],
|
||||
'notifications' => [],
|
||||
'favourite' => true,
|
||||
],
|
||||
|
||||
'payment-offline' => [
|
||||
'label' => 'Payment Offline',
|
||||
'color' => '#0A81D7',
|
||||
'mailers' => [],
|
||||
'notifications' => [],
|
||||
'favourite' => true,
|
||||
],
|
||||
|
||||
'payment-received' => [
|
||||
'label' => 'Payment Received',
|
||||
'color' => '#6a67ce',
|
||||
'mailers' => [],
|
||||
'notifications' => [],
|
||||
'favourite' => true,
|
||||
],
|
||||
|
||||
'dispatched' => [
|
||||
'label' => 'Dispatched',
|
||||
'mailers' => [],
|
||||
'notifications' => [],
|
||||
'favourite' => true,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Order Pipelines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Define which pipelines should be run throughout an order's lifecycle.
|
||||
| The default ones provided should suit most needs, however you are
|
||||
| free to add your own as you see fit.
|
||||
|
|
||||
| Each pipeline class will be run from top to bottom.
|
||||
|
|
||||
*/
|
||||
'pipelines' => [
|
||||
'creation' => [
|
||||
Lunar\Pipelines\Order\Creation\FillOrderFromCart::class,
|
||||
Lunar\Pipelines\Order\Creation\CreateOrderLines::class,
|
||||
Lunar\Pipelines\Order\Creation\CreateOrderAddresses::class,
|
||||
Lunar\Pipelines\Order\Creation\CreateShippingLine::class,
|
||||
Lunar\Pipelines\Order\Creation\CleanUpOrderLines::class,
|
||||
Lunar\Pipelines\Order\Creation\MapDiscountBreakdown::class,
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Enable Variants
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When `true` this will show the Variants manager when editing a product. If your
|
||||
| storefront doesn't support variants, set this to false.
|
||||
|
|
||||
*/
|
||||
'enable_variants' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| PDF Streaming
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When handling PDF's in the panel, you can decide whether to stream the PDF in
|
||||
| a new tab or download the PDF to your hard drive.
|
||||
|
|
||||
| Available options are 'download' or 'stream'
|
||||
|
|
||||
*/
|
||||
'pdf_rendering' => 'download',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Enable Scout when searching on supported models.
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Some models in the core have Scout implemented as a search driver, if you
|
||||
| want to use Scout when possible on tables in the panel, enable it here.
|
||||
|
|
||||
*/
|
||||
'scout_enabled' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Navigation counts
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The admin panel will show a count of orders in the left navigation.
|
||||
| This is based upon specific order statuses. You can define the statuses
|
||||
| to include in the count below.
|
||||
|
|
||||
*/
|
||||
'order_count_statuses' => ['payment-received'],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'default' => env('PAYMENTS_TYPE', 'cash-in-hand'),
|
||||
|
||||
'types' => [
|
||||
'cash-in-hand' => [
|
||||
'driver' => 'offline',
|
||||
'authorized' => 'payment-offline',
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
use Lunar\Pricing\DefaultPriceFormatter;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pricing Stored Inclusive of Tax
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Specify whether the prices entered into the system include tax or not.
|
||||
|
|
||||
*/
|
||||
'stored_inclusive_of_tax' => env('LUNAR_STORE_INCLUSIVE_OF_TAX', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Price formatter
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Specify which class to use when formatting price data types
|
||||
|
|
||||
*/
|
||||
'formatter' => DefaultPriceFormatter::class,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pricing Pipelines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Define which pipelines should be run when retrieving purchasable price.
|
||||
|
|
||||
| Each pipeline class will be run from top to bottom.
|
||||
|
|
||||
*/
|
||||
'pipelines' => [
|
||||
// App\Pipelines\Pricing\Example::class,
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'association_types_enum' => \Lunar\Base\Enums\ProductAssociation::class,
|
||||
];
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Models for indexing
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The model listed here will be used to create/populate the indexes.
|
||||
| You can provide your own model here to run them all on the same
|
||||
| search engine.
|
||||
|
|
||||
*/
|
||||
'models' => [
|
||||
/*
|
||||
* These models are required by the system, do not change them.
|
||||
*/
|
||||
Lunar\Models\Brand::class,
|
||||
Lunar\Models\Collection::class,
|
||||
Lunar\Models\Customer::class,
|
||||
Lunar\Models\Order::class,
|
||||
Lunar\Models\Product::class,
|
||||
Lunar\Models\ProductOption::class,
|
||||
|
||||
/*
|
||||
* Below you can add your own models for indexing...
|
||||
*/
|
||||
// App\Models\Example::class,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Search engine mapping
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You can define what search driver each searchable model should use.
|
||||
| If the model isn't defined here, it will use the SCOUT_DRIVER env variable.
|
||||
|
|
||||
*/
|
||||
'engine_map' => [
|
||||
// Lunar\Models\Product::class => 'algolia',
|
||||
// Lunar\Models\Order::class => 'meilisearch',
|
||||
// Lunar\Models\Collection::class => 'meilisearch',
|
||||
],
|
||||
|
||||
'indexers' => [
|
||||
Lunar\Models\Brand::class => Lunar\Search\BrandIndexer::class,
|
||||
Lunar\Models\Collection::class => Lunar\Search\CollectionIndexer::class,
|
||||
Lunar\Models\Customer::class => Lunar\Search\CustomerIndexer::class,
|
||||
Lunar\Models\Order::class => Lunar\Search\OrderIndexer::class,
|
||||
Lunar\Models\Product::class => Lunar\Search\ProductIndexer::class,
|
||||
Lunar\Models\ProductOption::class => Lunar\Search\ProductOptionIndexer::class,
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Measurements
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You can use any measurements available at
|
||||
| https://github.com/cartalyst/converter/edit/master/src/config/config.php
|
||||
|
|
||||
*/
|
||||
'measurements' => [
|
||||
|
||||
'length' => [
|
||||
|
||||
'm' => [
|
||||
'format' => '1,0.000 m',
|
||||
'unit' => 1.00,
|
||||
],
|
||||
|
||||
'mm' => [
|
||||
'format' => '1,0.000 mm',
|
||||
'unit' => 1000,
|
||||
],
|
||||
|
||||
'cm' => [
|
||||
'format' => '1!0 cm',
|
||||
'unit' => 100,
|
||||
],
|
||||
|
||||
'ft' => [
|
||||
'format' => '1,0.00 ft.',
|
||||
'unit' => 3.28084,
|
||||
],
|
||||
|
||||
'in' => [
|
||||
'format' => '1,0.00 in.',
|
||||
'unit' => 39.3701,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'area' => [
|
||||
|
||||
'sqm' => [
|
||||
'format' => '1,00.00 sq m',
|
||||
'unit' => 1,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'weight' => [
|
||||
|
||||
'kg' => [
|
||||
'format' => '1,0.00 kg',
|
||||
'unit' => 1.00,
|
||||
],
|
||||
|
||||
'g' => [
|
||||
'format' => '1,0.00 g',
|
||||
'unit' => 1000.00,
|
||||
],
|
||||
|
||||
'lbs' => [
|
||||
'format' => '1,0.00 lbs',
|
||||
'unit' => 2.20462,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
'volume' => [
|
||||
|
||||
'l' => [
|
||||
'format' => '1,00.00l',
|
||||
'unit' => 1,
|
||||
],
|
||||
|
||||
'ml' => [
|
||||
'format' => '1,00.000ml',
|
||||
'unit' => 1000,
|
||||
],
|
||||
|
||||
'gal' => [
|
||||
'format' => '1,00.000gal',
|
||||
'unit' => 0.264172,
|
||||
],
|
||||
|
||||
'floz' => [
|
||||
'format' => '1,00.000Fl oz.',
|
||||
'unit' => 33.814,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Tax Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you can specify which tax driver should be used. By default system is used
|
||||
| and should work for you in most cases.
|
||||
|
|
||||
*/
|
||||
'driver' => 'system',
|
||||
|
||||
];
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
use Lunar\Generators\UrlGenerator;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
| Set whether URLs should be required across the system. Setting this as true
|
||||
| will affect how validation works when creating/editing products in the hub.
|
||||
|
|
||||
| If you have a generator specified below, this setting will have no effect
|
||||
| on validation rules across the system.
|
||||
*/
|
||||
'required' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| URL Generator
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you can specify a class to automatically generate URLs for models which
|
||||
| implement the `HasUrls` trait. If left null no generation will happen.
|
||||
| You are free to use your own generator, or you can use the one that
|
||||
| ships with Lunar, which by default will use the name attribute.
|
||||
|
|
||||
*/
|
||||
'generator' => UrlGenerator::class,
|
||||
|
||||
];
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Mailer
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default mailer that is used to send all email
|
||||
| messages unless another mailer is explicitly specified when sending
|
||||
| the message. All additional mailers can be configured within the
|
||||
| "mailers" array. Examples of each type of mailer are provided.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('MAIL_MAILER', 'log'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Mailer Configurations
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure all of the mailers used by your application plus
|
||||
| their respective settings. Several examples have been configured for
|
||||
| you and you are free to add your own as your application requires.
|
||||
|
|
||||
| Laravel supports a variety of mail "transport" drivers that can be used
|
||||
| when delivering an email. You may specify which one you're using for
|
||||
| your mailers below. You may also add additional mailers if needed.
|
||||
|
|
||||
| Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
|
||||
| "postmark", "resend", "log", "array",
|
||||
| "failover", "roundrobin"
|
||||
|
|
||||
*/
|
||||
|
||||
'mailers' => [
|
||||
|
||||
'smtp' => [
|
||||
'transport' => 'smtp',
|
||||
'scheme' => env('MAIL_SCHEME'),
|
||||
'url' => env('MAIL_URL'),
|
||||
'host' => env('MAIL_HOST', '127.0.0.1'),
|
||||
'port' => env('MAIL_PORT', 2525),
|
||||
'username' => env('MAIL_USERNAME'),
|
||||
'password' => env('MAIL_PASSWORD'),
|
||||
'timeout' => null,
|
||||
'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
|
||||
],
|
||||
|
||||
'ses' => [
|
||||
'transport' => 'ses',
|
||||
],
|
||||
|
||||
'postmark' => [
|
||||
'transport' => 'postmark',
|
||||
// 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
|
||||
// 'client' => [
|
||||
// 'timeout' => 5,
|
||||
// ],
|
||||
],
|
||||
|
||||
'resend' => [
|
||||
'transport' => 'resend',
|
||||
],
|
||||
|
||||
'sendmail' => [
|
||||
'transport' => 'sendmail',
|
||||
'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
|
||||
],
|
||||
|
||||
'log' => [
|
||||
'transport' => 'log',
|
||||
'channel' => env('MAIL_LOG_CHANNEL'),
|
||||
],
|
||||
|
||||
'array' => [
|
||||
'transport' => 'array',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'transport' => 'failover',
|
||||
'mailers' => [
|
||||
'smtp',
|
||||
'log',
|
||||
],
|
||||
'retry_after' => 60,
|
||||
],
|
||||
|
||||
'roundrobin' => [
|
||||
'transport' => 'roundrobin',
|
||||
'mailers' => [
|
||||
'ses',
|
||||
'postmark',
|
||||
],
|
||||
'retry_after' => 60,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Global "From" Address
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You may wish for all emails sent by your application to be sent from
|
||||
| the same address. Here you may specify a name and address that is
|
||||
| used globally for all emails that are sent by your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'from' => [
|
||||
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
|
||||
'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Laravel')),
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Queue Connection Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Laravel's queue supports a variety of backends via a single, unified
|
||||
| API, giving you convenient access to each backend using identical
|
||||
| syntax for each. The default queue connection is defined below.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('QUEUE_CONNECTION', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Queue Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the connection options for every queue backend
|
||||
| used by your application. An example configuration is provided for
|
||||
| each backend supported by Laravel. You're also free to add more.
|
||||
|
|
||||
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis",
|
||||
| "deferred", "background", "failover", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => [
|
||||
|
||||
'sync' => [
|
||||
'driver' => 'sync',
|
||||
],
|
||||
|
||||
'database' => [
|
||||
'driver' => 'database',
|
||||
'connection' => env('DB_QUEUE_CONNECTION'),
|
||||
'table' => env('DB_QUEUE_TABLE', 'jobs'),
|
||||
'queue' => env('DB_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'beanstalkd' => [
|
||||
'driver' => 'beanstalkd',
|
||||
'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
|
||||
'queue' => env('BEANSTALKD_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90),
|
||||
'block_for' => 0,
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'sqs' => [
|
||||
'driver' => 'sqs',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
|
||||
'queue' => env('SQS_QUEUE', 'default'),
|
||||
'suffix' => env('SQS_SUFFIX'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'redis' => [
|
||||
'driver' => 'redis',
|
||||
'connection' => env('REDIS_QUEUE_CONNECTION', 'default'),
|
||||
'queue' => env('REDIS_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90),
|
||||
'block_for' => null,
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'deferred' => [
|
||||
'driver' => 'deferred',
|
||||
],
|
||||
|
||||
'background' => [
|
||||
'driver' => 'background',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'driver' => 'failover',
|
||||
'connections' => [
|
||||
'database',
|
||||
'deferred',
|
||||
],
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Job Batching
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following options configure the database and table that store job
|
||||
| batching information. These options can be updated to any database
|
||||
| connection and table which has been defined by your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'batching' => [
|
||||
'database' => env('DB_CONNECTION', 'sqlite'),
|
||||
'table' => 'job_batches',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Failed Queue Jobs
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These options configure the behavior of failed queue job logging so you
|
||||
| can control how and where failed jobs are stored. Laravel ships with
|
||||
| support for storing failed jobs in a simple file or in a database.
|
||||
|
|
||||
| Supported drivers: "database-uuids", "dynamodb", "file", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => [
|
||||
'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
|
||||
'database' => env('DB_CONNECTION', 'sqlite'),
|
||||
'table' => 'failed_jobs',
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Third Party Services
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This file is for storing the credentials for third party services such
|
||||
| as Mailgun, Postmark, AWS and more. This file provides the de facto
|
||||
| location for this type of information, allowing packages to have
|
||||
| a conventional file to locate the various service credentials.
|
||||
|
|
||||
*/
|
||||
|
||||
'postmark' => [
|
||||
'key' => env('POSTMARK_API_KEY'),
|
||||
],
|
||||
|
||||
'resend' => [
|
||||
'key' => env('RESEND_API_KEY'),
|
||||
],
|
||||
|
||||
'ses' => [
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'notifications' => [
|
||||
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
|
||||
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,217 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Session Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option determines the default session driver that is utilized for
|
||||
| incoming requests. Laravel supports a variety of storage options to
|
||||
| persist session data. Database storage is a great default choice.
|
||||
|
|
||||
| Supported: "file", "cookie", "database", "memcached",
|
||||
| "redis", "dynamodb", "array"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => env('SESSION_DRIVER', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Lifetime
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the number of minutes that you wish the session
|
||||
| to be allowed to remain idle before it expires. If you want them
|
||||
| to expire immediately when the browser is closed then you may
|
||||
| indicate that via the expire_on_close configuration option.
|
||||
|
|
||||
*/
|
||||
|
||||
'lifetime' => (int) env('SESSION_LIFETIME', 120),
|
||||
|
||||
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Encryption
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option allows you to easily specify that all of your session data
|
||||
| should be encrypted before it's stored. All encryption is performed
|
||||
| automatically by Laravel and you may use the session like normal.
|
||||
|
|
||||
*/
|
||||
|
||||
'encrypt' => env('SESSION_ENCRYPT', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session File Location
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When utilizing the "file" session driver, the session files are placed
|
||||
| on disk. The default storage location is defined here; however, you
|
||||
| are free to provide another location where they should be stored.
|
||||
|
|
||||
*/
|
||||
|
||||
'files' => storage_path('framework/sessions'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Connection
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" or "redis" session drivers, you may specify a
|
||||
| connection that should be used to manage these sessions. This should
|
||||
| correspond to a connection in your database configuration options.
|
||||
|
|
||||
*/
|
||||
|
||||
'connection' => env('SESSION_CONNECTION'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" session driver, you may specify the table to
|
||||
| be used to store sessions. Of course, a sensible default is defined
|
||||
| for you; however, you're welcome to change this to another table.
|
||||
|
|
||||
*/
|
||||
|
||||
'table' => env('SESSION_TABLE', 'sessions'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cache Store
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using one of the framework's cache driven session backends, you may
|
||||
| define the cache store which should be used to store the session data
|
||||
| between requests. This must match one of your defined cache stores.
|
||||
|
|
||||
| Affects: "dynamodb", "memcached", "redis"
|
||||
|
|
||||
*/
|
||||
|
||||
'store' => env('SESSION_STORE'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Sweeping Lottery
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Some session drivers must manually sweep their storage location to get
|
||||
| rid of old sessions from storage. Here are the chances that it will
|
||||
| happen on a given request. By default, the odds are 2 out of 100.
|
||||
|
|
||||
*/
|
||||
|
||||
'lottery' => [2, 100],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the name of the session cookie that is created by
|
||||
| the framework. Typically, you should not need to change this value
|
||||
| since doing so does not grant a meaningful security improvement.
|
||||
|
|
||||
*/
|
||||
|
||||
'cookie' => env(
|
||||
'SESSION_COOKIE',
|
||||
Str::slug((string) env('APP_NAME', 'laravel')).'-session'
|
||||
),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The session cookie path determines the path for which the cookie will
|
||||
| be regarded as available. Typically, this will be the root path of
|
||||
| your application, but you're free to change this when necessary.
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => env('SESSION_PATH', '/'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines the domain and subdomains the session cookie is
|
||||
| available to. By default, the cookie will be available to the root
|
||||
| domain without subdomains. Typically, this shouldn't be changed.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => env('SESSION_DOMAIN'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTPS Only Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By setting this option to true, session cookies will only be sent back
|
||||
| to the server if the browser has a HTTPS connection. This will keep
|
||||
| the cookie from being sent to you when it can't be done securely.
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => env('SESSION_SECURE_COOKIE'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTP Access Only
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Setting this value to true will prevent JavaScript from accessing the
|
||||
| value of the cookie and the cookie will only be accessible through
|
||||
| the HTTP protocol. It's unlikely you should disable this option.
|
||||
|
|
||||
*/
|
||||
|
||||
'http_only' => env('SESSION_HTTP_ONLY', true),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Same-Site Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option determines how your cookies behave when cross-site requests
|
||||
| take place, and can be used to mitigate CSRF attacks. By default, we
|
||||
| will set this value to "lax" to permit secure cross-site requests.
|
||||
|
|
||||
| See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
|
||||
|
|
||||
| Supported: "lax", "strict", "none", null
|
||||
|
|
||||
*/
|
||||
|
||||
'same_site' => env('SESSION_SAME_SITE', 'lax'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Partitioned Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Setting this value to true will tie the cookie to the top-level site for
|
||||
| a cross-site context. Partitioned cookies are accepted by the browser
|
||||
| when flagged "secure" and the Same-Site attribute is set to "none".
|
||||
|
|
||||
*/
|
||||
|
||||
'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
|
||||
|
||||
];
|
||||
@@ -0,0 +1 @@
|
||||
*.sqlite*
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('users', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('name');
|
||||
$table->string('email')->unique();
|
||||
$table->timestamp('email_verified_at')->nullable();
|
||||
$table->string('password');
|
||||
$table->rememberToken();
|
||||
$table->timestamps();
|
||||
});
|
||||
|
||||
Schema::create('password_reset_tokens', function (Blueprint $table) {
|
||||
$table->string('email')->primary();
|
||||
$table->string('token');
|
||||
$table->timestamp('created_at')->nullable();
|
||||
});
|
||||
|
||||
Schema::create('sessions', function (Blueprint $table) {
|
||||
$table->string('id')->primary();
|
||||
$table->foreignId('user_id')->nullable()->index();
|
||||
$table->string('ip_address', 45)->nullable();
|
||||
$table->text('user_agent')->nullable();
|
||||
$table->longText('payload');
|
||||
$table->integer('last_activity')->index();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('users');
|
||||
Schema::dropIfExists('password_reset_tokens');
|
||||
Schema::dropIfExists('sessions');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('cache', function (Blueprint $table) {
|
||||
$table->string('key')->primary();
|
||||
$table->mediumText('value');
|
||||
$table->integer('expiration')->index();
|
||||
});
|
||||
|
||||
Schema::create('cache_locks', function (Blueprint $table) {
|
||||
$table->string('key')->primary();
|
||||
$table->string('owner');
|
||||
$table->integer('expiration')->index();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('cache');
|
||||
Schema::dropIfExists('cache_locks');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('jobs', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('queue')->index();
|
||||
$table->longText('payload');
|
||||
$table->unsignedTinyInteger('attempts');
|
||||
$table->unsignedInteger('reserved_at')->nullable();
|
||||
$table->unsignedInteger('available_at');
|
||||
$table->unsignedInteger('created_at');
|
||||
});
|
||||
|
||||
Schema::create('job_batches', function (Blueprint $table) {
|
||||
$table->string('id')->primary();
|
||||
$table->string('name');
|
||||
$table->integer('total_jobs');
|
||||
$table->integer('pending_jobs');
|
||||
$table->integer('failed_jobs');
|
||||
$table->longText('failed_job_ids');
|
||||
$table->mediumText('options')->nullable();
|
||||
$table->integer('cancelled_at')->nullable();
|
||||
$table->integer('created_at');
|
||||
$table->integer('finished_at')->nullable();
|
||||
});
|
||||
|
||||
Schema::create('failed_jobs', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uuid')->unique();
|
||||
$table->text('connection');
|
||||
$table->text('queue');
|
||||
$table->longText('payload');
|
||||
$table->longText('exception');
|
||||
$table->timestamp('failed_at')->useCurrent();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('jobs');
|
||||
Schema::dropIfExists('job_batches');
|
||||
Schema::dropIfExists('failed_jobs');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DatabaseSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Seed the application's database.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
services:
|
||||
app:
|
||||
volumes:
|
||||
- ../boboko-core:/var/www/boboko-core
|
||||
|
||||
queue:
|
||||
volumes:
|
||||
- ../boboko-core:/var/www/boboko-core
|
||||
|
||||
scheduler:
|
||||
volumes:
|
||||
- ../boboko-core:/var/www/boboko-core
|
||||
@@ -0,0 +1,146 @@
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
target: development
|
||||
image: boboko-app
|
||||
env_file: .env
|
||||
environment:
|
||||
APP_ENV: local
|
||||
APP_DEBUG: "true"
|
||||
DB_HOST: postgres
|
||||
DB_PORT: 5432
|
||||
REDIS_HOST: valkey
|
||||
REDIS_PORT: 6379
|
||||
OTEL_TRACES_EXPORTER: none
|
||||
OTEL_METRICS_EXPORTER: none
|
||||
OTEL_LOGS_EXPORTER: none
|
||||
volumes:
|
||||
- .:/var/www/html:rw
|
||||
- vendor:/var/www/html/vendor
|
||||
- node_modules:/var/www/html/node_modules
|
||||
healthcheck:
|
||||
test: ["CMD", "php-fpm8.5", "-t"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
start_period: 60s
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
valkey:
|
||||
condition: service_started
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "${APP_PORT:-8080}:80"
|
||||
volumes:
|
||||
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
- ./public:/var/www/html/public:ro
|
||||
- ./storage/app/public:/var/www/html/storage/app/public:ro
|
||||
depends_on:
|
||||
app:
|
||||
condition: service_healthy
|
||||
|
||||
queue:
|
||||
image: boboko-app
|
||||
command: php artisan queue:work --tries=3 --max-jobs=500 --memory=256
|
||||
env_file: .env
|
||||
environment:
|
||||
APP_ENV: local
|
||||
DB_HOST: postgres
|
||||
DB_PORT: 5432
|
||||
REDIS_HOST: valkey
|
||||
REDIS_PORT: 6379
|
||||
OTEL_TRACES_EXPORTER: none
|
||||
OTEL_METRICS_EXPORTER: none
|
||||
OTEL_LOGS_EXPORTER: none
|
||||
volumes:
|
||||
- .:/var/www/html
|
||||
- vendor:/var/www/html/vendor
|
||||
depends_on:
|
||||
app:
|
||||
condition: service_healthy
|
||||
|
||||
scheduler:
|
||||
profiles: [full]
|
||||
image: boboko-app
|
||||
command: php artisan schedule:work
|
||||
env_file: .env
|
||||
environment:
|
||||
APP_ENV: local
|
||||
DB_HOST: postgres
|
||||
DB_PORT: 5432
|
||||
volumes:
|
||||
- .:/var/www/html
|
||||
- vendor:/var/www/html/vendor
|
||||
depends_on:
|
||||
app:
|
||||
condition: service_healthy
|
||||
|
||||
postgres:
|
||||
image: postgres:18-alpine
|
||||
ports:
|
||||
- "${POSTGRES_HOST_PORT:-5436}:5432"
|
||||
environment:
|
||||
POSTGRES_DB: ${DB_DATABASE:-boboko}
|
||||
POSTGRES_USER: ${DB_USERNAME:-laravel}
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required}
|
||||
volumes:
|
||||
- pgdata:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD-SHELL",
|
||||
"pg_isready -U ${DB_USERNAME:-laravel} -d ${DB_DATABASE:-boboko}",
|
||||
]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
mailpit:
|
||||
image: axllent/mailpit
|
||||
ports:
|
||||
- "${MAILPIT_PORT:-8025}:8025"
|
||||
|
||||
valkey:
|
||||
image: valkey/valkey:7.2.13
|
||||
ports:
|
||||
- "${VALKEY_PORT:-6339}:6379"
|
||||
|
||||
stoic:
|
||||
image: ghcr.io/lexx27/stoic:latest
|
||||
user: root
|
||||
ports:
|
||||
- "${STOIC_PORT:-2727}:2727"
|
||||
environment:
|
||||
STOIC_CONFIG_DIR: /config/
|
||||
STOIC_SECRET: ${STOIC_SECRET:?STOIC_SECRET is required}
|
||||
STOIC_SSO_SECRET: ${STOIC_SSO_SECRET:?STOIC_SSO_SECRET is required}
|
||||
volumes:
|
||||
- ./resources/stoic/stoic_config.yml:/config/stoic_config.yml:ro
|
||||
- ./resources/stoic/stoic_schemas.yml:/config/stoic_schemas.yml:ro
|
||||
- ./resources/stoic/content:/content
|
||||
- ./resources/stoic/media:/media
|
||||
- ./storage/app/public/stoic:/storage/app/public/stoic
|
||||
- .:/repository
|
||||
|
||||
vite:
|
||||
build:
|
||||
context: .
|
||||
target: vite-dev
|
||||
working_dir: /app
|
||||
command: npm run dev
|
||||
ports:
|
||||
- "${VITE_PORT:-5173}:5173"
|
||||
environment:
|
||||
- NODE_ENV=development
|
||||
volumes:
|
||||
- .:/app
|
||||
- /app/node_modules
|
||||
|
||||
volumes:
|
||||
vendor:
|
||||
node_modules:
|
||||
pgdata:
|
||||
@@ -0,0 +1,147 @@
|
||||
name: ${COMPOSE_PROJECT_NAME:-boboko-starter}
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
target: production
|
||||
image: ${COMPOSE_PROJECT_NAME:-boboko-starter}-app
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
environment:
|
||||
DB_HOST: postgres
|
||||
REDIS_HOST: valkey
|
||||
REDIS_PORT: 6379
|
||||
OTEL_TRACES_EXPORTER: otlp
|
||||
OTEL_METRICS_EXPORTER: otlp
|
||||
OTEL_LOGS_EXPORTER: otlp
|
||||
OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
|
||||
volumes:
|
||||
- storage:/var/www/html/storage/app:rw
|
||||
- logs:/var/www/html/storage/logs
|
||||
- framework:/var/www/html/storage/framework
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
valkey:
|
||||
condition: service_started
|
||||
healthcheck:
|
||||
test: ["CMD", "php-fpm8.5", "-t"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
start_period: 60s
|
||||
|
||||
nginx:
|
||||
build:
|
||||
context: .
|
||||
target: nginx
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:${APP_PORT:-8090}:80"
|
||||
volumes:
|
||||
- storage:/var/www/html/storage/app:ro
|
||||
depends_on:
|
||||
app:
|
||||
condition: service_healthy
|
||||
|
||||
queue:
|
||||
image: ${COMPOSE_PROJECT_NAME:-boboko-starter}-app
|
||||
command: php artisan queue:work --tries=3 --max-jobs=500 --memory=256
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
environment:
|
||||
DB_HOST: postgres
|
||||
REDIS_HOST: valkey
|
||||
REDIS_PORT: 6379
|
||||
OTEL_TRACES_EXPORTER: otlp
|
||||
OTEL_METRICS_EXPORTER: none
|
||||
OTEL_LOGS_EXPORTER: none
|
||||
OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
|
||||
volumes:
|
||||
- storage:/var/www/html/storage/app
|
||||
- logs:/var/www/html/storage/logs
|
||||
- framework:/var/www/html/storage/framework
|
||||
depends_on:
|
||||
app:
|
||||
condition: service_healthy
|
||||
|
||||
scheduler:
|
||||
image: ${COMPOSE_PROJECT_NAME:-boboko-starter}-app
|
||||
command: php artisan schedule:work
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
environment:
|
||||
DB_HOST: postgres
|
||||
REDIS_HOST: valkey
|
||||
REDIS_PORT: 6379
|
||||
OTEL_TRACES_EXPORTER: otlp
|
||||
OTEL_METRICS_EXPORTER: none
|
||||
OTEL_LOGS_EXPORTER: none
|
||||
OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
|
||||
volumes:
|
||||
- storage:/var/www/html/storage/app
|
||||
- logs:/var/www/html/storage/logs
|
||||
- framework:/var/www/html/storage/framework
|
||||
depends_on:
|
||||
app:
|
||||
condition: service_healthy
|
||||
|
||||
postgres:
|
||||
image: postgres:18-alpine
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
POSTGRES_DB: ${DB_DATABASE:-boboko}
|
||||
POSTGRES_USER: ${DB_USERNAME:-laravel}
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required}
|
||||
|
||||
volumes:
|
||||
- pgdata:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD-SHELL",
|
||||
"pg_isready -U ${DB_USERNAME:-laravel} -d ${DB_DATABASE:-boboko}",
|
||||
]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
valkey:
|
||||
image: valkey/valkey:7.2.13
|
||||
restart: unless-stopped
|
||||
command: valkey-server --appendonly yes
|
||||
volumes:
|
||||
- valkeydata:/data
|
||||
|
||||
otel-collector:
|
||||
image: otel/opentelemetry-collector-contrib:latest
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SIGNOZ_ENDPOINT: ${OTEL_EXPORTER_OTLP_ENDPOINT}
|
||||
volumes:
|
||||
- ./docker/otel/collector.yml:/etc/otelcol-contrib/config.yaml:ro
|
||||
|
||||
stoic:
|
||||
image: ghcr.io/lexx27/stoic:latest
|
||||
ports:
|
||||
- "127.0.0.1:${STOIC_PORT:-2727}:2727"
|
||||
environment:
|
||||
STOIC_CONFIG_DIR: /config/
|
||||
STOIC_SECRET: ${STOIC_SECRET:?STOIC_SECRET is required}
|
||||
STOIC_SSO_SECRET: ${STOIC_SSO_SECRET:?STOIC_SSO_SECRET is required}
|
||||
volumes:
|
||||
- ./docker/stoic/stoic_config.yml:/config/stoic_config.yml:ro
|
||||
- ./resources/stoic/stoic_schemas.yml:/config/stoic_schemas.yml:ro
|
||||
- ./resources/stoic/content:/content
|
||||
- ./resources/stoic/media:/media
|
||||
- storage:/var/www/html/storage/app
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
pgdata:
|
||||
storage:
|
||||
logs:
|
||||
framework:
|
||||
valkeydata:
|
||||
@@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# In development, install Composer deps if vendor is not present
|
||||
if [ "$APP_ENV" != "production" ] && [ ! -f vendor/autoload.php ]; then
|
||||
echo "[entrypoint] Installing Composer dependencies..."
|
||||
git config --global --add safe.directory /var/www/html 2>/dev/null || true
|
||||
composer install --no-interaction --prefer-dist
|
||||
fi
|
||||
|
||||
# In development, the app dir is bind-mounted from a fresh checkout, so package
|
||||
# assets (which the Dockerfile publishes at build time in production) need to be
|
||||
# generated here instead. Cheap and idempotent, safe to repeat on every boot.
|
||||
if [ "$APP_ENV" != "production" ]; then
|
||||
php artisan vendor:publish --tag=core-assets --force --ansi --quiet
|
||||
php artisan vendor:publish --tag=public --force --ansi --quiet
|
||||
php artisan filament:assets --ansi --quiet
|
||||
fi
|
||||
|
||||
# Everything below runs on every boot of app/queue/scheduler, possibly concurrently,
|
||||
# so it must be idempotent and safe to run from multiple containers at once.
|
||||
# Migrations, package publishing, and config/route/view caching are deploy-time
|
||||
# concerns handled once via Envoy, not here.
|
||||
|
||||
mkdir -p storage/app/public storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache
|
||||
chown -R www-data:www-data storage bootstrap/cache
|
||||
chmod -R 775 storage bootstrap/cache
|
||||
|
||||
php artisan storage:link --quiet 2>/dev/null || true
|
||||
|
||||
exec "$@"
|
||||
@@ -0,0 +1,48 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
root /var/www/html/public;
|
||||
index index.php;
|
||||
|
||||
client_max_body_size 100M;
|
||||
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
|
||||
charset utf-8;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
resolver 127.0.0.11 valid=5s;
|
||||
set $upstream app:9000;
|
||||
fastcgi_pass $upstream;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||
fastcgi_read_timeout 300;
|
||||
fastcgi_buffers 16 16k;
|
||||
fastcgi_buffer_size 32k;
|
||||
}
|
||||
|
||||
location /stoic/ {
|
||||
proxy_pass http://stoic:2727/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cookie_path / /stoic/;
|
||||
}
|
||||
|
||||
location ~ /\.(?!well-known).* {
|
||||
deny all;
|
||||
}
|
||||
|
||||
location = /favicon.ico { access_log off; log_not_found off; }
|
||||
location = /robots.txt { access_log off; log_not_found off; }
|
||||
|
||||
error_page 404 /index.php;
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
fastcgi_cache_path /tmp/fcgi_cache levels=1:2 keys_zone=app_cache:10m max_size=256m inactive=10m use_temp_path=off;
|
||||
|
||||
upstream php_fpm {
|
||||
server app:9000;
|
||||
keepalive 16;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
root /var/www/html/public;
|
||||
index index.php;
|
||||
|
||||
client_max_body_size 100M;
|
||||
charset utf-8;
|
||||
|
||||
open_file_cache max=5000 inactive=30s;
|
||||
open_file_cache_valid 60s;
|
||||
open_file_cache_min_uses 2;
|
||||
open_file_cache_errors on;
|
||||
|
||||
# --- FastCGI cache bypass rules ---
|
||||
set $skip_cache 0;
|
||||
|
||||
if ($request_method = POST) { set $skip_cache 1; }
|
||||
if ($request_uri ~* "^/(boboko|up)") { set $skip_cache 1; }
|
||||
if ($query_string) { set $skip_cache 1; }
|
||||
|
||||
# Vite build assets — content-hashed filenames, safe to cache forever
|
||||
location /build/ {
|
||||
add_header Cache-Control "public, max-age=31536000, immutable";
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
location /static/ {
|
||||
add_header Cache-Control "public, max-age=31536000, immutable";
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
location /packages/ {
|
||||
add_header Cache-Control "public, max-age=31536000, immutable";
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
# User media — served directly from the storage volume (no symlink needed)
|
||||
location /storage/ {
|
||||
alias /var/www/html/storage/app/public/;
|
||||
add_header Cache-Control "public, max-age=31536000, immutable";
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
location / {
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass php_fpm;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||
fastcgi_read_timeout 300;
|
||||
fastcgi_buffers 16 16k;
|
||||
fastcgi_buffer_size 32k;
|
||||
fastcgi_keep_conn on;
|
||||
|
||||
fastcgi_cache app_cache;
|
||||
fastcgi_cache_key "$scheme$request_method$host$request_uri";
|
||||
fastcgi_cache_valid 200 10m;
|
||||
fastcgi_cache_bypass $skip_cache;
|
||||
fastcgi_no_cache $skip_cache;
|
||||
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
|
||||
add_header X-Cache-Status $upstream_cache_status;
|
||||
}
|
||||
|
||||
location /stoic/ {
|
||||
proxy_pass http://stoic:2727/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cookie_path / /stoic/;
|
||||
}
|
||||
|
||||
location ~ /\.(?!well-known).* {
|
||||
deny all;
|
||||
}
|
||||
|
||||
location = /sitemap.xml {
|
||||
root /var/www/html/storage/app;
|
||||
try_files /sitemap.xml =404;
|
||||
add_header Cache-Control "public, max-age=3600";
|
||||
add_header Content-Type "application/xml; charset=utf-8";
|
||||
}
|
||||
|
||||
location = /favicon.ico { access_log off; log_not_found off; }
|
||||
location = /robots.txt { access_log off; log_not_found off; }
|
||||
|
||||
error_page 404 /index.php;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
receivers:
|
||||
otlp:
|
||||
protocols:
|
||||
http:
|
||||
endpoint: 0.0.0.0:4318
|
||||
|
||||
processors:
|
||||
batch:
|
||||
timeout: 5s
|
||||
send_batch_size: 512
|
||||
|
||||
exporters:
|
||||
otlphttp:
|
||||
endpoint: ${env:SIGNOZ_ENDPOINT}
|
||||
compression: gzip
|
||||
|
||||
service:
|
||||
pipelines:
|
||||
traces:
|
||||
receivers: [otlp]
|
||||
processors: [batch]
|
||||
exporters: [otlphttp]
|
||||
metrics:
|
||||
receivers: [otlp]
|
||||
processors: [batch]
|
||||
exporters: [otlphttp]
|
||||
logs:
|
||||
receivers: [otlp]
|
||||
processors: [batch]
|
||||
exporters: [otlphttp]
|
||||
@@ -0,0 +1,7 @@
|
||||
[www]
|
||||
; Static workers: no spawn latency under load.
|
||||
; Rule of thumb: (available container RAM in MB) / ~60 = max_children
|
||||
; At 512MB container: 8, at 1GB: 16. Start conservative.
|
||||
pm = static
|
||||
pm.max_children = 8
|
||||
pm.max_requests = 500
|
||||
@@ -0,0 +1,10 @@
|
||||
upload_max_filesize = 100M
|
||||
post_max_size = 100M
|
||||
memory_limit = 256M
|
||||
max_execution_time = 60
|
||||
|
||||
[opcache]
|
||||
opcache.enable = 1
|
||||
opcache.memory_consumption = 128
|
||||
opcache.validate_timestamps = 1
|
||||
opcache.revalidate_freq = 0
|
||||
@@ -0,0 +1,14 @@
|
||||
upload_max_filesize = 100M
|
||||
post_max_size = 100M
|
||||
memory_limit = 256M
|
||||
max_execution_time = 60
|
||||
|
||||
[opcache]
|
||||
opcache.enable = 1
|
||||
opcache.memory_consumption = 256
|
||||
opcache.interned_strings_buffer = 16
|
||||
opcache.max_accelerated_files = 20000
|
||||
opcache.revalidate_freq = 0
|
||||
opcache.validate_timestamps = 0
|
||||
opcache.jit = 1255
|
||||
opcache.jit_buffer_size = 64M
|
||||
@@ -0,0 +1,21 @@
|
||||
base_path: /stoic
|
||||
|
||||
auth:
|
||||
mode: session
|
||||
validate_url: http://app:9000/validate
|
||||
cookie: laravel_session
|
||||
|
||||
content_path: /content
|
||||
media_path: /media
|
||||
thumbs_path: /var/www/html/storage/app/public/stoic/
|
||||
repository_path: /app
|
||||
presets:
|
||||
- code: large
|
||||
mode: resize
|
||||
width: 1200
|
||||
- code: medium
|
||||
mode: resize
|
||||
width: 800
|
||||
- code: small
|
||||
mode: resize
|
||||
width: 420
|
||||
Generated
+1979
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"$schema": "https://www.schemastore.org/package.json",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "vite build",
|
||||
"dev": "vite"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/vite": "^4.0.0",
|
||||
"concurrently": "^9.0.1",
|
||||
"laravel-vite-plugin": "^3.0.0",
|
||||
"tailwindcss": "^4.0.0",
|
||||
"vite": "^8.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hotwired/stimulus": "^3.2.2",
|
||||
"@hotwired/turbo": "^8.0.23",
|
||||
"@phosphor-icons/web": "^2.1.2",
|
||||
"axios": "^1.15.2",
|
||||
"flatpickr": "^4.6.13"
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="Unit">
|
||||
<directory>tests/Unit</directory>
|
||||
</testsuite>
|
||||
<testsuite name="Feature">
|
||||
<directory>tests/Feature</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<source>
|
||||
<include>
|
||||
<directory>app</directory>
|
||||
</include>
|
||||
</source>
|
||||
<php>
|
||||
<env name="APP_ENV" value="testing"/>
|
||||
<env name="APP_MAINTENANCE_DRIVER" value="file"/>
|
||||
<env name="BCRYPT_ROUNDS" value="4"/>
|
||||
<env name="BROADCAST_CONNECTION" value="null"/>
|
||||
<env name="CACHE_STORE" value="array"/>
|
||||
<env name="DB_CONNECTION" value="sqlite"/>
|
||||
<env name="DB_DATABASE" value=":memory:"/>
|
||||
<env name="DB_URL" value=""/>
|
||||
<env name="MAIL_MAILER" value="array"/>
|
||||
<env name="QUEUE_CONNECTION" value="sync"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="PULSE_ENABLED" value="false"/>
|
||||
<env name="TELESCOPE_ENABLED" value="false"/>
|
||||
<env name="NIGHTWATCH_ENABLED" value="false"/>
|
||||
</php>
|
||||
</phpunit>
|
||||
@@ -0,0 +1,25 @@
|
||||
<IfModule mod_rewrite.c>
|
||||
<IfModule mod_negotiation.c>
|
||||
Options -MultiViews -Indexes
|
||||
</IfModule>
|
||||
|
||||
RewriteEngine On
|
||||
|
||||
# Handle Authorization Header
|
||||
RewriteCond %{HTTP:Authorization} .
|
||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
||||
|
||||
# Handle X-XSRF-Token Header
|
||||
RewriteCond %{HTTP:x-xsrf-token} .
|
||||
RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}]
|
||||
|
||||
# Redirect Trailing Slashes If Not A Folder...
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_URI} (.+)/$
|
||||
RewriteRule ^ %1 [L,R=301]
|
||||
|
||||
# Send Requests To Front Controller...
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^ index.php [L]
|
||||
</IfModule>
|
||||
@@ -0,0 +1 @@
|
||||
.badgeable-column-badge .truncate{overflow: visible !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.border-custom-300{--tw-border-opacity:1;border-color:rgba(var(--c-300),var(--tw-border-opacity))}.bg-custom-100{--tw-bg-opacity:1;background-color:rgba(var(--c-100),var(--tw-bg-opacity))}.text-custom-600{--tw-text-opacity:1;color:rgba(var(--c-600),var(--tw-text-opacity))}.text-custom-900{--tw-text-opacity:1;color:rgba(var(--c-900),var(--tw-text-opacity))}:is(.dark .dark\:border-custom-300){--tw-border-opacity:1;border-color:rgba(var(--c-300),var(--tw-border-opacity))}:is(.dark .dark\:bg-custom-100){--tw-bg-opacity:1;background-color:rgba(var(--c-100),var(--tw-bg-opacity))}:is(.dark .dark\:text-custom-900){--tw-text-opacity:1;color:rgba(var(--c-900),var(--tw-text-opacity))}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.fi-pagination-items,.fi-pagination-overview,.fi-pagination-records-per-page-select:not(.fi-compact){display:none}@supports (container-type:inline-size){.fi-pagination{container-type:inline-size}@container (min-width: 28rem){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@container (min-width: 56rem){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}@supports not (container-type:inline-size){@media(min-width:640px){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@media(min-width:768px){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.tippy-box[data-theme~=light]{color:#26323d;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;background-color:#fff}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.fi-sortable-ghost{opacity:.3}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
define('LARAVEL_START', microtime(true));
|
||||
|
||||
// Determine if the application is in maintenance mode...
|
||||
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
|
||||
require $maintenance;
|
||||
}
|
||||
|
||||
// Register the Composer autoloader...
|
||||
require __DIR__.'/../vendor/autoload.php';
|
||||
|
||||
// Bootstrap Laravel and handle the request...
|
||||
/** @var Application $app */
|
||||
$app = require_once __DIR__.'/../bootstrap/app.php';
|
||||
|
||||
$app->handleRequest(Request::capture());
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +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};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +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};
|
||||
@@ -0,0 +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};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
function d(){return{checkboxClickController:null,collapsedGroups:[],isLoading:!1,selectedRecords:[],shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,init:function(){this.livewireId=this.$root.closest("[wire\\:id]").attributes["wire:id"].value,this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.selectedRecords=[...new Set(this.selectedRecords)],this.shouldCheckUniqueSelection=!1}),this.$nextTick(()=>this.watchForCheckboxClicks()),Livewire.hook("element.init",({component:e})=>{e.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction:function(e,t=null){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableAction(e,t)},mountBulkAction:function(e){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableBulkAction(e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){this.isLoading=!0;let t=await this.$wire.getGroupedSelectableTableRecordKeys(e);this.areRecordsSelected(this.getRecordsInGroupOnPage(e))?this.deselectRecords(t):this.selectRecords(t),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let t=[];for(let s of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])s.dataset.group===e&&t.push(s.value);return t},getRecordsOnPage:function(){let e=[];for(let t of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])e.push(t.value);return e},selectRecords:function(e){for(let t of e)this.isRecordSelected(t)||this.selectedRecords.push(t)},deselectRecords:function(e){for(let t of e){let s=this.selectedRecords.indexOf(t);s!==-1&&this.selectedRecords.splice(s,1)}},selectAllRecords:async function(){this.isLoading=!0,this.selectedRecords=await this.$wire.getAllSelectableTableRecordKeys(),this.isLoading=!1},deselectAllRecords:function(){this.selectedRecords=[]},isRecordSelected:function(e){return this.selectedRecords.includes(e)},areRecordsSelected:function(e){return e.every(t=>this.isRecordSelected(t))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]},watchForCheckboxClicks:function(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:e}=this.checkboxClickController;this.$root?.addEventListener("click",t=>t.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(t,t.target),{signal:e})},handleCheckboxClick:function(e,t){if(!this.lastChecked){this.lastChecked=t;return}if(e.shiftKey){let s=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!s.includes(this.lastChecked)){this.lastChecked=t;return}let l=s.indexOf(this.lastChecked),r=s.indexOf(t),o=[l,r].sort((c,n)=>c-n),i=[];for(let c=o[0];c<=o[1];c++)s[c].checked=t.checked,i.push(s[c].value);t.checked?this.selectRecords(i):this.deselectRecords(i)}this.lastChecked=t}}}export{d as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,221 @@
|
||||
/**
|
||||
* Stoic CMS — in-place editor script
|
||||
*
|
||||
* Vendor this file into your website's asset pipeline.
|
||||
*
|
||||
* Configuration (set before this script runs):
|
||||
* window.STOIC_HOST = "https://your-cms-domain.com"; // default: same origin
|
||||
*
|
||||
* Usage on your HTML elements:
|
||||
* data-stoic="schema/slug" open editor for this entry
|
||||
* data-stoic="schema/slug#field" open editor and focus a specific field
|
||||
* data-stoic="singleton#field" open editor for a singleton schema
|
||||
*
|
||||
* SSO: if STOIC_SSO_SECRET is configured on the server, the admin link
|
||||
* will generate a signed token so the user lands directly in the CMS.
|
||||
* Set window.STOIC_SSO_TOKEN before loading this script:
|
||||
* window.STOIC_SSO_TOKEN = "<?= $ssoToken ?>";
|
||||
*/
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
const HOST = (window.STOIC_HOST || "").replace(/\/$/, "");
|
||||
|
||||
// ── State ────────────────────────────────────────────────────────────────
|
||||
|
||||
let editMode = false;
|
||||
let activePane = null;
|
||||
let messageListener = null;
|
||||
|
||||
// ── Toolbar ──────────────────────────────────────────────────────────────
|
||||
|
||||
const bar = document.createElement("div");
|
||||
bar.className = "stoic-bar";
|
||||
|
||||
const btn = document.createElement("button");
|
||||
btn.className = "stoic-edit-toggle";
|
||||
btn.setAttribute("aria-label", "Toggle edit mode");
|
||||
btn.innerHTML =
|
||||
'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg> Edit';
|
||||
|
||||
btn.addEventListener("click", function () {
|
||||
editMode ? exitEditMode() : enterEditMode();
|
||||
});
|
||||
|
||||
const adminLink = document.createElement("a");
|
||||
adminLink.className = "stoic-admin-link";
|
||||
adminLink.target = "_blank";
|
||||
adminLink.rel = "noopener noreferrer";
|
||||
adminLink.setAttribute("aria-label", "Open CMS admin");
|
||||
adminLink.innerHTML =
|
||||
'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>';
|
||||
|
||||
// If a pre-generated SSO token is provided, use the SSO endpoint directly.
|
||||
// Otherwise link to the standard login page.
|
||||
if (window.STOIC_SSO_TOKEN) {
|
||||
adminLink.href = HOST + "/cms/sso?" + window.STOIC_SSO_TOKEN;
|
||||
} else {
|
||||
adminLink.href = HOST;
|
||||
}
|
||||
|
||||
bar.appendChild(btn);
|
||||
bar.appendChild(adminLink);
|
||||
|
||||
// ── Edit mode ────────────────────────────────────────────────────────────
|
||||
|
||||
function enterEditMode() {
|
||||
editMode = true;
|
||||
btn.classList.add("active");
|
||||
document.querySelectorAll("[data-stoic]").forEach(function (el) {
|
||||
el.classList.add("stoic-target");
|
||||
el.addEventListener("click", onTargetClick, true);
|
||||
});
|
||||
}
|
||||
|
||||
function exitEditMode() {
|
||||
editMode = false;
|
||||
btn.classList.remove("active");
|
||||
document.querySelectorAll("[data-stoic]").forEach(function (el) {
|
||||
el.classList.remove("stoic-target", "stoic-target--active");
|
||||
el.removeEventListener("click", onTargetClick, true);
|
||||
});
|
||||
closePane();
|
||||
}
|
||||
|
||||
function onTargetClick(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
document
|
||||
.querySelectorAll(".stoic-target--active")
|
||||
.forEach(function (el) {
|
||||
el.classList.remove("stoic-target--active");
|
||||
});
|
||||
this.classList.add("stoic-target--active");
|
||||
|
||||
const attr = this.getAttribute("data-stoic");
|
||||
const hashIdx = attr.indexOf("#");
|
||||
const path = hashIdx === -1 ? attr : attr.slice(0, hashIdx);
|
||||
const field = hashIdx === -1 ? "" : attr.slice(hashIdx + 1);
|
||||
openPane(path, field);
|
||||
}
|
||||
|
||||
// ── Side pane ────────────────────────────────────────────────────────────
|
||||
|
||||
function openPane(path, field) {
|
||||
closePane();
|
||||
|
||||
const overlay = document.createElement("div");
|
||||
overlay.className = "stoic-overlay";
|
||||
overlay.addEventListener("click", closePane);
|
||||
|
||||
const pane = document.createElement("div");
|
||||
pane.className = "stoic-pane";
|
||||
|
||||
const closeBtn = document.createElement("button");
|
||||
closeBtn.className = "stoic-pane-close";
|
||||
closeBtn.setAttribute("aria-label", "Close");
|
||||
closeBtn.innerHTML =
|
||||
'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>';
|
||||
closeBtn.addEventListener("click", closePane);
|
||||
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.className = "stoic-pane-iframe";
|
||||
let src = HOST + "/cms/embed/" + path;
|
||||
if (field) src += "?focus=" + encodeURIComponent(field);
|
||||
iframe.src = src;
|
||||
|
||||
pane.appendChild(closeBtn);
|
||||
pane.appendChild(iframe);
|
||||
|
||||
document.body.appendChild(overlay);
|
||||
document.body.appendChild(pane);
|
||||
activePane = { pane: pane, overlay: overlay };
|
||||
|
||||
messageListener = function (e) {
|
||||
if (e.data && e.data.type === "stoic:saved") {
|
||||
onSaved();
|
||||
}
|
||||
};
|
||||
window.addEventListener("message", messageListener);
|
||||
|
||||
requestAnimationFrame(function () {
|
||||
pane.classList.add("open");
|
||||
overlay.classList.add("open");
|
||||
});
|
||||
}
|
||||
|
||||
function closePane() {
|
||||
if (!activePane) return;
|
||||
var pane = activePane.pane;
|
||||
var overlay = activePane.overlay;
|
||||
|
||||
pane.classList.remove("open");
|
||||
overlay.classList.remove("open");
|
||||
|
||||
setTimeout(function () {
|
||||
pane.remove();
|
||||
overlay.remove();
|
||||
}, 220);
|
||||
|
||||
if (messageListener) {
|
||||
window.removeEventListener("message", messageListener);
|
||||
messageListener = null;
|
||||
}
|
||||
|
||||
document
|
||||
.querySelectorAll(".stoic-target--active")
|
||||
.forEach(function (el) {
|
||||
el.classList.remove("stoic-target--active");
|
||||
});
|
||||
|
||||
activePane = null;
|
||||
}
|
||||
|
||||
function onSaved() {
|
||||
var activeEl = document.querySelector(".stoic-target--active");
|
||||
if (activeEl) {
|
||||
activeEl.dispatchEvent(
|
||||
new CustomEvent("stoic:saved", {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
}),
|
||||
);
|
||||
}
|
||||
closePane();
|
||||
}
|
||||
|
||||
// ── Styles ───────────────────────────────────────────────────────────────
|
||||
|
||||
var style = document.createElement("style");
|
||||
style.textContent = [
|
||||
".stoic-bar{position:fixed;bottom:1.25rem;right:1.25rem;z-index:2147483646;display:inline-flex;align-items:center;gap:0.375rem;background:#1a1a2e;border-radius:9999px;padding:0.25rem 0.25rem 0.25rem 0.5rem;box-shadow:0 2px 12px rgba(0,0,0,.35);}",
|
||||
".stoic-edit-toggle{display:inline-flex;align-items:center;gap:0.4rem;padding:0.35rem 0.75rem;border:none;border-radius:9999px;background:transparent;color:#fff;font-size:0.8rem;font-weight:600;font-family:system-ui,sans-serif;cursor:pointer;transition:background .15s;}",
|
||||
".stoic-edit-toggle:hover{background:rgba(255,255,255,.1);}",
|
||||
".stoic-edit-toggle.active{background:#4f46e5;}",
|
||||
".stoic-admin-link{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border-radius:50%;color:rgba(255,255,255,.6);text-decoration:none;transition:color .15s,background .15s;}",
|
||||
".stoic-admin-link:hover{color:#fff;background:rgba(255,255,255,.1);}",
|
||||
".stoic-target{outline:2px dashed rgba(79,70,229,.5)!important;outline-offset:2px!important;cursor:pointer!important;transition:outline-color .15s;}",
|
||||
".stoic-target:hover{outline-color:rgba(79,70,229,.9)!important;}",
|
||||
".stoic-target--active{outline:2px solid #4f46e5!important;outline-offset:2px!important;}",
|
||||
".stoic-overlay{position:fixed;inset:0;z-index:2147483644;background:rgba(0,0,0,.25);opacity:0;transition:opacity .2s;}",
|
||||
".stoic-overlay.open{opacity:1;}",
|
||||
".stoic-pane{position:fixed;top:0;right:0;bottom:0;z-index:2147483645;width:min(480px,100vw);background:#fff;box-shadow:-4px 0 24px rgba(0,0,0,.18);transform:translateX(100%);transition:transform .22s cubic-bezier(.4,0,.2,1);display:flex;flex-direction:column;}",
|
||||
".stoic-pane.open{transform:translateX(0);}",
|
||||
".stoic-pane-close{position:absolute;top:.75rem;right:.75rem;z-index:1;width:1.75rem;height:1.75rem;border:none;border-radius:50%;background:rgba(0,0,0,.07);color:#555;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;}",
|
||||
".stoic-pane-close:hover{background:rgba(0,0,0,.14);}",
|
||||
".stoic-pane-iframe{flex:1;width:100%;border:none;}",
|
||||
].join("");
|
||||
|
||||
// ── Init ─────────────────────────────────────────────────────────────────
|
||||
|
||||
document.head.appendChild(style);
|
||||
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
document.body.appendChild(bar);
|
||||
});
|
||||
} else {
|
||||
document.body.appendChild(bar);
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow:
|
||||
@@ -0,0 +1,28 @@
|
||||
<svg width="787" height="171" viewBox="0 0 787 171" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M256.804 130.502C260.106 130.502 262.619 131.29 264.42 132.816C266.21 134.333 267.107 136.423 267.107 139.149C267.107 140.704 266.776 142.017 266.134 143.108C265.487 144.207 264.584 145.061 263.439 145.673C262.921 145.947 262.359 146.155 261.753 146.301C260.985 146.154 260.175 146.088 259.327 146.102L258.835 146.109V147.538L259.326 147.546C260.188 147.56 261.003 147.488 261.768 147.324C262.511 147.483 263.2 147.724 263.835 148.048C265.108 148.697 266.108 149.656 266.84 150.937C267.567 152.21 267.942 153.747 267.942 155.555C267.942 157.494 267.515 159.155 266.677 160.583C265.838 161.998 264.647 163.1 263.091 163.864C261.53 164.631 259.675 165.036 257.499 165.036H246.848V130.502H256.804ZM250.95 161.004H251.45V161.49H257.04C259.007 161.49 260.641 160.964 261.854 159.858C263.077 158.744 263.672 157.195 263.672 155.305C263.672 153.417 263.08 151.78 261.871 150.571C260.66 149.361 259.021 148.771 257.04 148.771H250.95V161.004ZM250.937 145.392H256.748C258.592 145.392 260.103 144.891 261.232 143.839L261.235 143.837C262.352 142.783 262.894 141.377 262.894 139.678C262.893 137.98 262.353 136.573 261.246 135.544C260.14 134.502 258.627 134.021 256.79 134.021H250.937V145.392Z" fill="white" stroke="white"/>
|
||||
<path d="M280.096 130.502V155.597C280.096 157.456 280.562 159.002 281.551 160.146V160.147C282.565 161.336 284.09 161.88 285.991 161.88C287.897 161.88 289.376 161.333 290.401 160.15C291.403 158.995 291.886 157.463 291.886 155.597V130.502H296.142V155.597C296.142 158.707 295.242 161.113 293.506 162.862C291.778 164.603 289.298 165.505 285.99 165.508C282.683 165.505 280.203 164.602 278.476 162.862C276.739 161.113 275.84 158.707 275.84 155.597V130.502H280.096Z" fill="white" stroke="white"/>
|
||||
<path d="M324.532 130.502V134.173H317.371V161.352H324.532V165.022H305.871V161.352H313.032V134.173H305.871V130.502H324.532Z" fill="white" stroke="white"/>
|
||||
<path d="M339.869 130.502V161.198H355.387V165.009H335.613V130.502H339.869Z" fill="white" stroke="white"/>
|
||||
<path d="M372.979 130.502C375.251 130.502 377.2 130.935 378.84 131.781C380.48 132.628 381.745 133.827 382.656 135.357V135.358C383.563 136.895 384.02 138.709 384.02 140.846V154.623C384.02 156.717 383.563 158.547 382.654 160.114C381.743 161.686 380.479 162.898 378.84 163.744C377.199 164.591 375.264 165.022 372.979 165.022H363.551V130.502H372.979ZM367.807 161.254H372.979C375.022 161.254 376.687 160.682 377.928 159.487C379.174 158.287 379.764 156.643 379.764 154.623V140.846C379.764 138.865 379.172 137.236 377.928 136.037C376.687 134.843 375.022 134.271 372.979 134.271H367.807V161.254Z" fill="white" stroke="white"/>
|
||||
<path d="M402.802 157.904C403.99 157.904 404.934 158.272 405.585 158.947C406.24 159.626 406.585 160.56 406.585 161.783C406.585 162.999 406.243 163.864 405.591 164.516C404.942 165.165 404.038 165.509 402.802 165.509C401.611 165.509 400.704 165.166 400.038 164.512C399.373 163.859 399.02 162.968 399.02 161.783C399.02 160.591 399.376 159.629 400.044 158.95C400.714 158.268 401.621 157.904 402.802 157.904Z" fill="white" stroke="white"/>
|
||||
<path d="M461.202 130.502C464.504 130.502 467.017 131.29 468.818 132.816C470.609 134.335 471.52 136.425 471.521 139.149C471.521 140.704 471.188 142.017 470.546 143.108C469.9 144.207 468.996 145.061 467.852 145.673C467.333 145.947 466.771 146.155 466.165 146.301C465.398 146.154 464.587 146.088 463.739 146.102L463.247 146.109V147.538L463.738 147.546C464.6 147.56 465.415 147.488 466.18 147.324C466.92 147.483 467.605 147.724 468.231 148.047L468.233 148.048C469.507 148.697 470.507 149.656 471.238 150.937C471.966 152.21 472.341 153.747 472.341 155.555C472.341 157.494 471.913 159.156 471.074 160.584C470.236 162.011 469.047 163.099 467.489 163.864C465.929 164.631 464.074 165.036 461.897 165.036H451.246V130.502H461.202ZM455.349 161.004H455.849V161.49H461.438C463.405 161.49 465.039 160.964 466.253 159.858C467.475 158.744 468.07 157.195 468.07 155.305C468.07 153.417 467.478 151.78 466.27 150.571C465.059 149.361 463.419 148.771 461.438 148.771H455.349V161.004ZM455.335 145.392H461.146C462.991 145.392 464.501 144.891 465.631 143.839L465.634 143.837C466.75 142.783 467.292 141.377 467.292 139.678C467.292 137.98 466.751 136.573 465.645 135.544C464.539 134.502 463.026 134.021 461.188 134.021H455.335V145.392Z" fill="white" stroke="white"/>
|
||||
<path d="M490.402 130.029C492.403 130.029 494.143 130.386 495.601 131.07L495.889 131.212C497.415 132.002 498.565 133.114 499.378 134.582C500.192 136.052 500.608 137.801 500.608 139.831V155.652C500.608 157.696 500.192 159.445 499.377 160.931C498.562 162.416 497.41 163.553 495.89 164.326L495.886 164.329C494.375 165.117 492.539 165.51 490.402 165.51C488.254 165.51 486.43 165.104 484.915 164.327L484.914 164.326L484.633 164.177C483.25 163.409 482.191 162.323 481.427 160.931C480.612 159.446 480.195 157.682 480.195 155.652V139.887C480.195 137.813 480.612 136.051 481.426 134.582C482.24 133.111 483.391 131.986 484.914 131.212C486.444 130.434 488.269 130.029 490.402 130.029ZM490.402 133.687C488.53 133.687 487.062 134.201 486.011 135.298C484.946 136.394 484.451 137.941 484.451 139.873V155.638C484.451 157.544 484.948 159.089 486.009 160.196C487.072 161.306 488.551 161.838 490.402 161.838C492.274 161.838 493.788 161.309 494.828 160.191C495.856 159.085 496.353 157.544 496.353 155.638V139.873C496.353 137.945 495.873 136.398 494.823 135.301C493.77 134.201 492.273 133.687 490.402 133.687Z" fill="white" stroke="white"/>
|
||||
<path d="M519.602 130.029C521.602 130.029 523.342 130.386 524.8 131.07L525.088 131.212C526.614 132.002 527.764 133.114 528.577 134.582C529.391 136.052 529.808 137.801 529.808 139.831V155.652C529.808 157.696 529.391 159.445 528.576 160.931C527.761 162.416 526.61 163.553 525.089 164.326L525.086 164.328C523.559 165.117 521.737 165.51 519.602 165.51C517.453 165.51 515.629 165.104 514.114 164.327L514.113 164.326L513.832 164.177C512.45 163.409 511.39 162.323 510.626 160.931C509.811 159.446 509.395 157.682 509.395 155.652V139.887C509.395 137.813 509.812 136.051 510.625 134.582C511.439 133.111 512.59 131.986 514.113 131.212H514.114C515.629 130.435 517.467 130.029 519.602 130.029ZM519.602 133.687C517.727 133.687 516.261 134.203 515.196 135.298C514.13 136.396 513.65 137.945 513.65 139.873V155.638C513.65 157.544 514.147 159.086 515.191 160.193C516.243 161.308 517.754 161.838 519.602 161.838C521.474 161.838 522.988 161.309 524.027 160.191C525.056 159.085 525.552 157.544 525.552 155.638V139.873C525.552 137.945 525.072 136.398 524.022 135.301C522.969 134.201 521.472 133.687 519.602 133.687Z" fill="white" stroke="white"/>
|
||||
<path d="M548.993 129.946C552.14 129.946 554.626 130.794 556.475 132.446C558.207 133.993 559.153 136.039 559.282 138.636H555.022C554.923 137.188 554.386 135.993 553.389 135.094C552.282 134.097 550.757 133.631 548.896 133.631C547.037 133.631 545.617 134.069 544.528 134.986C543.422 135.918 542.89 137.239 542.89 138.844C542.89 140.274 543.279 141.539 544.092 142.596C544.902 143.665 546.041 144.399 547.486 144.813V144.814L552.006 146.176L552.019 146.18C554.531 146.865 556.419 148.077 557.731 149.796C559.049 151.522 559.715 153.581 559.715 156.013C559.715 157.905 559.263 159.563 558.386 160.977C557.507 162.393 556.259 163.5 554.653 164.296C553.055 165.089 551.146 165.482 548.938 165.482H548.438V165.501C546.305 165.449 544.486 165.061 542.959 164.359C541.317 163.604 540.072 162.526 539.181 161.137C538.372 159.877 537.935 158.376 537.866 156.625H542.075C542.184 158.154 542.804 159.399 543.95 160.335C545.208 161.363 546.905 161.838 548.979 161.838C550.935 161.838 552.551 161.36 553.738 160.358C554.936 159.347 555.528 157.947 555.528 156.236C555.528 154.805 555.138 153.542 554.328 152.472C553.526 151.394 552.364 150.673 550.915 150.289H550.914L546.45 148.986L546.448 148.985C543.929 148.257 542.025 147.043 540.698 145.335C539.368 143.623 538.69 141.592 538.689 139.192C538.689 137.322 539.103 135.718 539.938 134.333L539.939 134.333C540.764 132.959 541.942 131.883 543.475 131.117C545.006 130.351 546.845 129.946 548.993 129.946Z" fill="white" stroke="white"/>
|
||||
<path d="M589.61 130.46V134.327H580.114V165.023H575.872V134.327H566.375V130.46H589.61Z" fill="white" stroke="white"/>
|
||||
<path d="M607.2 157.904C608.388 157.904 609.332 158.272 609.983 158.947C610.638 159.626 610.983 160.56 610.983 161.783C610.983 162.999 610.642 163.864 609.989 164.516C609.34 165.165 608.437 165.509 607.2 165.509C606.009 165.509 605.103 165.166 604.437 164.512C603.771 163.859 603.418 162.968 603.418 161.783C603.418 160.591 603.775 159.629 604.442 158.95C605.112 158.268 606.019 157.904 607.2 157.904Z" fill="white" stroke="white"/>
|
||||
<path d="M659.844 130.502V145.294H665.384L665.521 145.014L672.627 130.502H677.255L669.239 146.812L669.133 147.028L669.236 147.246L677.658 165.022H672.868L665.412 149.307L665.276 149.021H659.83V165.022H655.588V130.502H659.844Z" fill="white" stroke="white"/>
|
||||
<path d="M705.145 130.502V134.173H689.432V145.252H703.448V148.882H689.432V161.365H705.145V165.036H685.273V130.502H705.145Z" fill="white" stroke="white"/>
|
||||
<path d="M734.344 130.502V134.173H718.631V145.252H732.647V148.882H718.631V161.365H734.344V165.036H714.473V130.502H734.344Z" fill="white" stroke="white"/>
|
||||
<path d="M754.312 130.502C756.558 130.502 758.478 130.921 760.089 131.753C761.704 132.587 762.952 133.759 763.819 135.282L763.82 135.285C764.701 136.809 765.144 138.597 765.144 140.707C765.144 142.811 764.69 144.558 763.808 146.1C762.91 147.644 761.672 148.829 760.073 149.661C758.477 150.492 756.558 150.912 754.312 150.912H747.443V165.022H743.188V130.502H754.312ZM747.443 147.185H754.312C756.24 147.185 757.822 146.607 759.018 145.412C760.213 144.217 760.791 142.62 760.791 140.707C760.791 138.798 760.215 137.157 759.015 135.972C757.82 134.792 756.225 134.215 754.312 134.215H747.443V147.185Z" fill="white" stroke="white"/>
|
||||
<path d="M782.396 157.904C783.583 157.904 784.527 158.272 785.179 158.947C785.834 159.626 786.179 160.56 786.179 161.783C786.179 162.999 785.837 163.864 785.185 164.516C784.535 165.165 783.632 165.509 782.396 165.509C781.204 165.509 780.298 165.166 779.632 164.512C778.967 163.859 778.613 162.968 778.613 161.783C778.613 160.591 778.97 159.629 779.638 158.95C780.308 158.268 781.214 157.904 782.396 157.904Z" fill="white" stroke="white"/>
|
||||
<path d="M39.0701 95.7183H40.4327C50.3606 95.7183 59.1205 99.8195 66.6985 108.022C72.3438 115.07 75.1664 122.3 75.1664 129.71V132.24C75.1664 141.096 71.579 149.215 64.4043 156.597C57.1043 163.229 49.3595 166.551 41.1558 166.551H38.6251C30.5048 166.551 22.8434 163.437 15.6269 157.223C8.09064 149.688 4.30859 141.263 4.30859 131.948V130.335C4.30859 120.729 8.24359 112.165 16.1136 104.63C23.1215 98.6934 30.769 95.7321 39.0423 95.7321L39.0701 95.7183Z" fill="#EC008C" stroke="#EC008C" stroke-width="6" stroke-miterlimit="10"/>
|
||||
<path d="M172.679 95.7183H174.042C183.97 95.7183 192.73 99.8195 200.308 108.022C205.953 115.07 208.776 122.3 208.776 129.71V132.24C208.776 141.096 205.188 149.215 198.014 156.597C190.714 163.229 182.969 166.551 174.765 166.551H172.234C164.114 166.551 156.453 163.437 149.236 157.223C141.7 149.688 137.918 141.263 137.918 131.948V130.335C137.918 120.729 141.853 112.165 149.723 104.63C156.731 98.6934 164.378 95.7321 172.652 95.7321L172.679 95.7183Z" fill="#FFDD00" stroke="#FFDD00" stroke-width="6" stroke-miterlimit="10"/>
|
||||
<path d="M105.992 4.67139H107.355C117.282 4.67139 126.042 8.77259 133.62 16.975C139.266 24.0236 142.088 31.2528 142.088 38.6628V41.1931C142.088 50.049 138.501 58.168 131.326 65.5502C124.026 72.1816 116.281 75.5043 108.078 75.5043H105.547C97.4267 75.5043 89.7653 72.3902 82.5488 66.1758C75.0125 58.6407 71.2305 50.2158 71.2305 40.9012V39.2885C71.2305 29.6819 75.1655 21.118 83.0355 13.5829C90.0434 7.64651 97.6909 4.68528 105.964 4.68528L105.992 4.67139Z" fill="#00AEEF" stroke="#00AEEF" stroke-width="6" stroke-miterlimit="10"/>
|
||||
<path d="M246.822 4.67112H301.147C309.823 4.67112 316.956 9.06427 322.532 17.8367C324.507 21.7294 325.494 25.4136 325.494 28.8614C325.494 34.7838 324.312 39.3716 321.948 42.6248C328.553 48.4499 331.862 54.8867 331.862 61.9352C331.862 74.2111 326.286 82.7055 315.135 87.3906C311.478 88.6696 307.39 89.3091 302.857 89.3091H246.836L246.391 88.8643V5.10209L246.836 4.65723L246.822 4.67112ZM260.212 19.1018V38.5653H300.911C306.973 38.5653 310.338 35.0341 310.977 27.9855C310.977 24.3292 308.781 21.5487 304.387 19.6301L300.911 19.1158H260.212V19.1018ZM260.212 53.2879V74.4474H306.681C312.549 74.4474 315.788 70.5965 316.372 62.9084C316.372 58.9601 314.245 55.9294 310.004 53.8024L306.667 53.2879H260.198H260.212Z" fill="white" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M382.823 4.6709H384.45C396.338 4.6709 406.822 9.57848 415.902 19.3936C422.66 27.8324 426.038 36.4797 426.038 45.3633V48.3941C426.038 59.0016 421.742 68.7194 413.163 77.5475C404.431 85.4858 395.156 89.4619 385.34 89.4619H382.309C372.589 89.4619 363.412 85.736 354.777 78.2843C345.753 69.2616 341.234 59.1685 341.234 48.0187V46.1002C341.234 34.6029 345.948 24.3429 355.375 15.3202C363.76 8.21602 372.909 4.6709 382.837 4.6709H382.823ZM359.143 47.1428C359.143 55.8319 363.037 63.0055 370.837 68.6777C375.328 71.3887 379.986 72.7511 384.825 72.7511C393.502 72.7511 400.663 68.8585 406.28 61.0592C409.047 56.6243 410.424 51.9809 410.424 47.1428C410.424 38.4121 406.53 31.2385 398.73 25.608C394.197 22.897 389.553 21.5345 384.811 21.5345C376.121 21.5345 368.946 25.4272 363.273 33.2265C360.506 37.717 359.13 42.3465 359.13 47.1428H359.143Z" fill="white" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M438.025 4.67112H492.35C501.027 4.67112 508.16 9.06427 513.735 17.8367C515.71 21.7294 516.697 25.4136 516.697 28.8614C516.697 34.7838 515.515 39.3716 513.151 42.6248C519.756 48.4499 523.065 54.8867 523.065 61.9352C523.065 74.2111 517.49 82.7055 506.338 87.3906C502.681 88.6696 498.593 89.3091 494.06 89.3091H438.039L437.594 88.8643V5.10209L438.039 4.65723L438.025 4.67112ZM451.415 19.1018V38.5653H492.114C498.19 38.5653 501.541 35.0341 502.181 27.9855C502.181 24.3292 499.984 21.5487 495.59 19.6301L492.114 19.1158H451.415V19.1018ZM451.415 53.2879V74.4474H497.884C503.752 74.4474 506.992 70.5965 507.576 62.9084C507.576 58.9601 505.448 55.9294 501.207 53.8024L497.884 53.2879H451.415Z" fill="white" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M574.026 4.6709H575.653C587.541 4.6709 598.025 9.57848 607.105 19.3936C613.863 27.8324 617.242 36.4797 617.242 45.3633V48.3941C617.242 59.0016 612.945 68.7194 604.366 77.5475C595.634 85.4858 586.36 89.4619 576.543 89.4619H573.512C563.792 89.4619 554.615 85.736 545.981 78.2843C536.956 69.2616 532.438 59.1685 532.438 48.0187V46.1002C532.438 34.6029 537.151 24.3429 546.578 15.3202C554.963 8.21602 564.112 4.6709 574.04 4.6709H574.026ZM550.347 47.1428C550.347 55.8319 554.24 63.0055 562.04 68.6777C566.532 71.3887 571.19 72.7511 576.028 72.7511C584.705 72.7511 591.866 68.8585 597.483 61.0592C600.25 56.6243 601.627 51.9809 601.627 47.1428C601.627 38.4121 597.733 31.2385 589.933 25.608C585.4 22.897 580.756 21.5345 576.014 21.5345C567.324 21.5345 560.149 25.4272 554.476 33.2265C551.709 37.717 550.333 42.3465 550.333 47.1428H550.347Z" fill="white" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M629.364 4.67112C636.72 4.67112 641.864 7.97991 644.826 14.5836C645.215 15.8209 645.424 17.0443 645.424 18.2816V36.4104L681.757 4.89357L683.161 4.67112C686.373 5.60258 687.972 8.20234 687.972 12.4426C687.972 16.3909 685.705 19.8665 681.159 22.8694L654.072 46.8372L698.025 85.4582C698.025 86.8345 695.8 87.7799 691.365 88.2665L687.958 88.4194C682.341 88.4194 678.461 86.9596 676.334 84.054L645.396 57.0416V75.7682C645.396 81.2875 642.115 85.4582 635.552 88.2665C633.521 88.9616 631.338 89.3091 628.961 89.3091L628.738 89.1562V5.03258C628.738 4.78233 628.933 4.65723 629.336 4.65723L629.364 4.67112Z" fill="white" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M740.811 4.6709H742.438C754.327 4.6709 764.811 9.57848 773.89 19.3936C780.648 27.8324 784.027 36.4797 784.027 45.3633V48.3941C784.027 59.0016 779.73 68.7194 771.151 77.5475C762.419 85.4858 753.145 89.4619 743.328 89.4619H740.297C730.577 89.4619 721.4 85.736 712.766 78.2843C703.742 69.2616 699.223 59.1685 699.223 48.0187V46.1002C699.223 34.6029 703.936 24.3429 713.364 15.3202C721.748 8.21602 730.897 4.6709 740.825 4.6709H740.811ZM717.132 47.1428C717.132 55.8319 721.025 63.0055 728.826 68.6777C733.317 71.3887 737.975 72.7511 742.814 72.7511C751.49 72.7511 758.651 68.8585 764.268 61.0592C767.035 56.6243 768.412 51.9809 768.412 47.1428C768.412 38.4121 764.519 31.2385 756.718 25.608C752.185 22.897 747.541 21.5345 742.8 21.5345C734.109 21.5345 726.934 25.4272 721.261 33.2265C718.494 37.717 717.118 42.3465 717.118 47.1428H717.132Z" fill="white" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,28 @@
|
||||
<svg width="787" height="171" viewBox="0 0 787 171" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M246.348 165.523V130.002H256.804C260.183 130.002 262.825 130.808 264.743 132.435C266.662 134.061 267.608 136.3 267.608 139.15C267.608 140.776 267.26 142.18 266.565 143.362C265.87 144.544 264.896 145.461 263.673 146.115C262.435 146.768 260.989 147.074 259.335 147.046V146.601C261.114 146.574 262.699 146.907 264.062 147.602C265.425 148.298 266.495 149.326 267.274 150.689C268.053 152.051 268.442 153.678 268.442 155.555C268.442 157.57 267.997 159.322 267.107 160.838C266.217 162.339 264.952 163.507 263.311 164.313C261.67 165.12 259.738 165.537 257.499 165.537H246.348V165.523ZM251.451 144.891H256.748C258.5 144.891 259.877 144.419 260.892 143.473C261.893 142.528 262.394 141.263 262.394 139.678C262.394 138.093 261.893 136.828 260.906 135.91C259.919 134.979 258.542 134.52 256.79 134.52H251.437V144.891H251.451ZM251.451 160.99H257.04C258.917 160.99 260.419 160.49 261.518 159.489C262.616 158.488 263.172 157.084 263.172 155.304C263.172 153.525 262.616 152.023 261.518 150.925C260.419 149.827 258.917 149.271 257.04 149.271H251.451V161.004V160.99Z" fill="black"/>
|
||||
<path d="M286.005 166.009C282.598 166.009 279.97 165.078 278.121 163.215C276.271 161.352 275.34 158.808 275.34 155.596V130.002H280.596V155.596C280.596 157.376 281.041 158.794 281.931 159.823C282.821 160.865 284.183 161.38 285.991 161.38C287.798 161.38 289.119 160.865 290.023 159.823C290.927 158.78 291.386 157.376 291.386 155.596V130.002H296.642V155.596C296.642 158.808 295.71 161.352 293.861 163.215C292.011 165.078 289.384 166.009 285.977 166.009H286.005Z" fill="black"/>
|
||||
<path d="M305.371 165.523V160.851H312.532V134.673H305.371V130.002H325.032V134.673H317.871V160.851H325.032V165.523H305.371Z" fill="black"/>
|
||||
<path d="M335.113 165.523V130.002H340.369V160.699H355.887V165.509H335.113V165.523Z" fill="black"/>
|
||||
<path d="M363.051 165.523V130.002H372.979C375.315 130.002 377.345 130.447 379.069 131.337C380.793 132.226 382.128 133.491 383.087 135.104C384.047 136.731 384.519 138.635 384.519 140.846V154.623C384.519 156.792 384.047 158.71 383.087 160.365C382.128 162.019 380.793 163.298 379.069 164.188C377.345 165.078 375.329 165.523 372.979 165.523H363.051ZM368.307 160.754H372.979C374.925 160.754 376.455 160.212 377.581 159.128C378.707 158.043 379.264 156.542 379.264 154.623V140.846C379.264 138.969 378.707 137.481 377.581 136.397C376.455 135.313 374.925 134.77 372.979 134.77H368.307V160.754Z" fill="black"/>
|
||||
<path d="M402.802 166.009C401.509 166.009 400.466 165.634 399.688 164.869C398.909 164.105 398.52 163.076 398.52 161.783C398.52 160.49 398.909 159.392 399.688 158.599C400.466 157.807 401.509 157.404 402.802 157.404C404.095 157.404 405.18 157.807 405.945 158.599C406.709 159.392 407.085 160.462 407.085 161.783C407.085 163.104 406.709 164.105 405.945 164.869C405.18 165.634 404.137 166.009 402.802 166.009Z" fill="black"/>
|
||||
<path d="M450.746 165.523V130.002H461.202C464.581 130.002 467.223 130.808 469.142 132.435C471.061 134.061 472.02 136.3 472.02 139.15C472.02 140.776 471.672 142.18 470.977 143.362C470.282 144.544 469.309 145.461 468.085 146.115C466.848 146.768 465.402 147.074 463.747 147.046V146.601C465.527 146.574 467.112 146.907 468.461 147.602C469.823 148.298 470.894 149.326 471.672 150.689C472.451 152.051 472.84 153.678 472.84 155.555C472.84 157.57 472.396 159.322 471.506 160.838C470.616 162.353 469.35 163.507 467.71 164.313C466.069 165.12 464.136 165.537 461.898 165.537H450.76L450.746 165.523ZM455.849 144.891H461.147C462.899 144.891 464.275 144.419 465.29 143.473C466.291 142.528 466.792 141.263 466.792 139.678C466.792 138.093 466.291 136.828 465.304 135.91C464.317 134.979 462.94 134.52 461.188 134.52H455.835V144.891H455.849ZM455.849 160.99H461.439C463.316 160.99 464.818 160.49 465.916 159.489C467.014 158.488 467.571 157.084 467.571 155.304C467.571 153.525 467.014 152.023 465.916 150.925C464.818 149.827 463.316 149.271 461.439 149.271H455.849V161.004V160.99Z" fill="black"/>
|
||||
<path d="M490.402 166.009C488.191 166.009 486.286 165.592 484.687 164.772C483.074 163.952 481.851 162.742 480.988 161.171C480.126 159.6 479.695 157.751 479.695 155.652V139.887C479.695 137.746 480.126 135.897 480.988 134.34C481.851 132.782 483.074 131.587 484.687 130.767C486.3 129.946 488.205 129.529 490.402 129.529C492.599 129.529 494.518 129.946 496.117 130.767C497.73 131.601 498.953 132.782 499.815 134.34C500.677 135.897 501.108 137.732 501.108 139.831V155.652C501.108 157.765 500.677 159.6 499.815 161.171C498.953 162.742 497.73 163.952 496.117 164.772C494.518 165.606 492.599 166.009 490.402 166.009ZM490.402 161.338C492.182 161.338 493.544 160.838 494.462 159.851C495.38 158.863 495.852 157.459 495.852 155.638V139.873C495.852 138.024 495.394 136.62 494.462 135.646C493.53 134.673 492.182 134.187 490.402 134.187C488.622 134.187 487.301 134.673 486.37 135.646C485.424 136.62 484.951 138.024 484.951 139.873V155.638C484.951 157.459 485.424 158.863 486.37 159.851C487.315 160.838 488.65 161.338 490.402 161.338Z" fill="black"/>
|
||||
<path d="M519.601 166.009C517.39 166.009 515.485 165.592 513.886 164.772C512.273 163.952 511.05 162.742 510.188 161.171C509.326 159.6 508.895 157.751 508.895 155.652V139.887C508.895 137.746 509.326 135.897 510.188 134.34C511.05 132.782 512.273 131.587 513.886 130.767C515.485 129.946 517.404 129.529 519.601 129.529C521.798 129.529 523.717 129.946 525.316 130.767C526.929 131.601 528.152 132.782 529.014 134.34C529.877 135.897 530.308 137.732 530.308 139.831V155.652C530.308 157.765 529.877 159.6 529.014 161.171C528.152 162.742 526.929 163.952 525.316 164.772C523.703 165.606 521.798 166.009 519.601 166.009ZM519.601 161.338C521.381 161.338 522.743 160.838 523.661 159.851C524.579 158.863 525.052 157.459 525.052 155.638V139.873C525.052 138.024 524.593 136.62 523.661 135.646C522.73 134.673 521.381 134.187 519.601 134.187C517.821 134.187 516.5 134.673 515.555 135.646C514.609 136.62 514.15 138.024 514.15 139.873V155.638C514.15 157.459 514.623 158.863 515.555 159.851C516.486 160.838 517.849 161.338 519.601 161.338Z" fill="black"/>
|
||||
<path d="M548.938 166.009C546.533 166.009 544.475 165.606 542.75 164.814C541.026 164.021 539.705 162.881 538.76 161.408C537.814 159.934 537.355 158.168 537.355 156.125H542.556C542.556 157.751 543.126 159.016 544.266 159.948C545.406 160.879 546.977 161.338 548.98 161.338C550.857 161.338 552.345 160.879 553.415 159.976C554.486 159.072 555.028 157.821 555.028 156.236C555.028 154.901 554.667 153.747 553.93 152.774C553.207 151.801 552.15 151.134 550.787 150.772L546.31 149.465C543.71 148.715 541.708 147.449 540.303 145.642C538.899 143.835 538.19 141.694 538.19 139.191C538.19 137.245 538.621 135.549 539.511 134.075C540.387 132.616 541.638 131.476 543.251 130.669C544.864 129.863 546.783 129.446 548.994 129.446C552.233 129.446 554.847 130.322 556.808 132.073C558.769 133.825 559.77 136.175 559.797 139.136H554.542C554.542 137.579 554.041 136.355 553.054 135.466C552.067 134.576 550.676 134.131 548.896 134.131C547.117 134.131 545.823 134.548 544.85 135.368C543.877 136.188 543.39 137.356 543.39 138.844C543.39 140.178 543.752 141.332 544.489 142.292C545.225 143.265 546.268 143.946 547.631 144.335L552.15 145.698C554.75 146.407 556.739 147.672 558.129 149.493C559.519 151.314 560.215 153.483 560.215 156.013C560.215 157.988 559.742 159.739 558.81 161.241C557.879 162.742 556.558 163.91 554.875 164.744C553.193 165.578 551.204 165.981 548.938 165.981V166.009Z" fill="black"/>
|
||||
<path d="M575.372 165.523V134.826H565.875V129.96H590.111V134.826H580.614V165.523H575.358H575.372Z" fill="black"/>
|
||||
<path d="M607.201 166.009C605.907 166.009 604.865 165.634 604.086 164.869C603.307 164.105 602.918 163.076 602.918 161.783C602.918 160.49 603.307 159.392 604.086 158.599C604.865 157.807 605.907 157.404 607.201 157.404C608.494 157.404 609.578 157.807 610.343 158.599C611.108 159.392 611.483 160.462 611.483 161.783C611.483 163.104 611.108 164.105 610.343 164.869C609.578 165.634 608.535 166.009 607.201 166.009Z" fill="black"/>
|
||||
<path d="M655.088 165.523V130.002H660.344V144.794H665.072L672.316 130.002H678.059L669.688 147.032L678.448 165.523H672.552L664.96 149.521H660.33V165.523H655.074H655.088Z" fill="black"/>
|
||||
<path d="M684.773 165.523V130.002H705.644V134.673H689.932V144.752H703.948V149.382H689.932V160.865H705.644V165.537H684.773V165.523Z" fill="black"/>
|
||||
<path d="M713.973 165.523V130.002H734.843V134.673H719.131V144.752H733.147V149.382H719.131V160.865H734.843V165.537H713.973V165.523Z" fill="black"/>
|
||||
<path d="M742.688 165.523V130.002H754.312C756.62 130.002 758.622 130.433 760.319 131.309C762.015 132.185 763.336 133.422 764.254 135.035C765.185 136.647 765.644 138.524 765.644 140.707C765.644 142.889 765.171 144.725 764.24 146.351C763.294 147.978 761.987 149.229 760.305 150.105C758.622 150.981 756.62 151.412 754.312 151.412H747.943V165.523H742.688ZM747.943 146.685H754.312C756.133 146.685 757.579 146.143 758.664 145.058C759.748 143.974 760.291 142.514 760.291 140.707C760.291 138.899 759.748 137.398 758.664 136.328C757.579 135.257 756.119 134.715 754.312 134.715H747.943V146.685Z" fill="black"/>
|
||||
<path d="M782.396 166.009C781.103 166.009 780.06 165.634 779.281 164.869C778.503 164.105 778.113 163.076 778.113 161.783C778.113 160.49 778.503 159.392 779.281 158.599C780.06 157.807 781.103 157.404 782.396 157.404C783.689 157.404 784.774 157.807 785.538 158.599C786.303 159.392 786.679 160.462 786.679 161.783C786.679 163.104 786.303 164.105 785.538 164.869C784.774 165.634 783.731 166.009 782.396 166.009Z" fill="black"/>
|
||||
<path d="M39.0701 95.7183H40.4327C50.3606 95.7183 59.1205 99.8195 66.6985 108.022C72.3438 115.07 75.1664 122.3 75.1664 129.71V132.24C75.1664 141.096 71.579 149.215 64.4043 156.597C57.1043 163.229 49.3595 166.551 41.1558 166.551H38.6251C30.5048 166.551 22.8434 163.437 15.6269 157.223C8.09064 149.688 4.30859 141.263 4.30859 131.948V130.335C4.30859 120.729 8.24359 112.165 16.1136 104.63C23.1215 98.6934 30.769 95.7321 39.0423 95.7321L39.0701 95.7183Z" fill="#EC008C" stroke="#EC008C" stroke-width="6" stroke-miterlimit="10"/>
|
||||
<path d="M172.679 95.7183H174.042C183.97 95.7183 192.73 99.8195 200.308 108.022C205.953 115.07 208.776 122.3 208.776 129.71V132.24C208.776 141.096 205.188 149.215 198.014 156.597C190.714 163.229 182.969 166.551 174.765 166.551H172.234C164.114 166.551 156.453 163.437 149.236 157.223C141.7 149.688 137.918 141.263 137.918 131.948V130.335C137.918 120.729 141.853 112.165 149.723 104.63C156.731 98.6934 164.378 95.7321 172.652 95.7321L172.679 95.7183Z" fill="#FFDD00" stroke="#FFDD00" stroke-width="6" stroke-miterlimit="10"/>
|
||||
<path d="M105.992 4.67139H107.355C117.283 4.67139 126.042 8.77259 133.62 16.975C139.266 24.0236 142.088 31.2528 142.088 38.6628V41.1931C142.088 50.049 138.501 58.168 131.326 65.5502C124.026 72.1816 116.281 75.5043 108.078 75.5043H105.547C97.4267 75.5043 89.7653 72.3902 82.5488 66.1758C75.0125 58.6407 71.2305 50.2158 71.2305 40.9012V39.2885C71.2305 29.6819 75.1655 21.118 83.0355 13.5829C90.0434 7.64651 97.6909 4.68528 105.964 4.68528L105.992 4.67139Z" fill="#00AEEF" stroke="#00AEEF" stroke-width="6" stroke-miterlimit="10"/>
|
||||
<path d="M246.822 4.67112H301.147C309.823 4.67112 316.956 9.06427 322.532 17.8367C324.507 21.7294 325.494 25.4136 325.494 28.8614C325.494 34.7838 324.312 39.3716 321.948 42.6248C328.553 48.4499 331.862 54.8867 331.862 61.9352C331.862 74.2111 326.286 82.7055 315.135 87.3906C311.478 88.6696 307.39 89.3092 302.857 89.3092H246.836L246.391 88.8643V5.10209L246.836 4.65723L246.822 4.67112ZM260.212 19.1018V38.5653H300.911C306.973 38.5653 310.338 35.0341 310.977 27.9855C310.977 24.3292 308.781 21.5487 304.387 19.6301L300.911 19.1158H260.212V19.1018ZM260.212 53.2879V74.4474H306.681C312.549 74.4474 315.788 70.5965 316.372 62.9084C316.372 58.9601 314.245 55.9294 310.004 53.8024L306.667 53.2879H260.198H260.212Z" fill="black" stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M382.823 4.6709H384.45C396.338 4.6709 406.822 9.57847 415.902 19.3936C422.66 27.8324 426.038 36.4797 426.038 45.3633V48.3941C426.038 59.0016 421.742 68.7194 413.163 77.5475C404.431 85.4858 395.156 89.4619 385.34 89.4619H382.309C372.589 89.4619 363.412 85.736 354.777 78.2843C345.753 69.2616 341.234 59.1685 341.234 48.0187V46.1002C341.234 34.6028 345.948 24.3429 355.375 15.3202C363.76 8.21602 372.909 4.6709 382.837 4.6709H382.823ZM359.143 47.1428C359.143 55.8319 363.037 63.0055 370.837 68.6777C375.328 71.3887 379.986 72.7511 384.825 72.7511C393.502 72.7511 400.663 68.8585 406.28 61.0592C409.047 56.6243 410.424 51.9809 410.424 47.1428C410.424 38.4121 406.53 31.2385 398.73 25.608C394.197 22.897 389.553 21.5345 384.811 21.5345C376.121 21.5345 368.946 25.4272 363.273 33.2265C360.506 37.717 359.13 42.3465 359.13 47.1428H359.143Z" fill="black" stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M438.025 4.67112H492.35C501.027 4.67112 508.16 9.06427 513.735 17.8367C515.71 21.7294 516.697 25.4136 516.697 28.8614C516.697 34.7838 515.515 39.3716 513.151 42.6248C519.756 48.4499 523.065 54.8867 523.065 61.9352C523.065 74.2111 517.49 82.7055 506.338 87.3906C502.681 88.6696 498.593 89.3092 494.06 89.3092H438.039L437.594 88.8643V5.10209L438.039 4.65723L438.025 4.67112ZM451.415 19.1018V38.5653H492.114C498.19 38.5653 501.541 35.0341 502.181 27.9855C502.181 24.3292 499.984 21.5487 495.59 19.6301L492.114 19.1158H451.415V19.1018ZM451.415 53.2879V74.4474H497.884C503.752 74.4474 506.992 70.5965 507.576 62.9084C507.576 58.9601 505.448 55.9294 501.207 53.8024L497.884 53.2879H451.415Z" fill="black" stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M574.026 4.6709H575.653C587.541 4.6709 598.025 9.57847 607.105 19.3936C613.863 27.8324 617.242 36.4797 617.242 45.3633V48.3941C617.242 59.0016 612.945 68.7194 604.366 77.5475C595.634 85.4858 586.36 89.4619 576.543 89.4619H573.512C563.792 89.4619 554.615 85.736 545.981 78.2843C536.956 69.2616 532.438 59.1685 532.438 48.0187V46.1002C532.438 34.6028 537.151 24.3429 546.578 15.3202C554.963 8.21602 564.112 4.6709 574.04 4.6709H574.026ZM550.347 47.1428C550.347 55.8319 554.24 63.0055 562.04 68.6777C566.532 71.3887 571.19 72.7511 576.028 72.7511C584.705 72.7511 591.866 68.8585 597.483 61.0592C600.25 56.6243 601.627 51.9809 601.627 47.1428C601.627 38.4121 597.733 31.2385 589.933 25.608C585.4 22.897 580.756 21.5345 576.014 21.5345C567.324 21.5345 560.149 25.4272 554.476 33.2265C551.709 37.717 550.333 42.3465 550.333 47.1428H550.347Z" fill="black" stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M629.364 4.67112C636.72 4.67112 641.864 7.97991 644.826 14.5836C645.215 15.8209 645.424 17.0443 645.424 18.2816V36.4104L681.757 4.89357L683.161 4.67112C686.373 5.60258 687.972 8.20234 687.972 12.4426C687.972 16.3909 685.705 19.8665 681.159 22.8694L654.072 46.8372L698.025 85.4582C698.025 86.8345 695.8 87.7799 691.365 88.2665L687.958 88.4194C682.341 88.4194 678.461 86.9596 676.334 84.054L645.396 57.0416V75.7682C645.396 81.2875 642.115 85.4582 635.552 88.2665C633.521 88.9616 631.338 89.3092 628.961 89.3092L628.738 89.1562V5.03258C628.738 4.78233 628.933 4.65723 629.336 4.65723L629.364 4.67112Z" fill="black" stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M740.811 4.6709H742.438C754.327 4.6709 764.811 9.57847 773.89 19.3936C780.648 27.8324 784.027 36.4797 784.027 45.3633V48.3941C784.027 59.0016 779.73 68.7194 771.151 77.5475C762.419 85.4858 753.145 89.4619 743.328 89.4619H740.297C730.577 89.4619 721.4 85.736 712.766 78.2843C703.742 69.2616 699.223 59.1685 699.223 48.0187V46.1002C699.223 34.6028 703.936 24.3429 713.364 15.3202C721.748 8.21602 730.897 4.6709 740.825 4.6709H740.811ZM717.132 47.1428C717.132 55.8319 721.025 63.0055 728.826 68.6777C733.317 71.3887 737.975 72.7511 742.814 72.7511C751.49 72.7511 758.651 68.8585 764.268 61.0592C767.035 56.6243 768.412 51.9809 768.412 47.1428C768.412 38.4121 764.519 31.2385 756.718 25.608C752.185 22.897 747.541 21.5345 742.8 21.5345C734.109 21.5345 726.934 25.4272 721.261 33.2265C718.494 37.717 717.118 42.3465 717.118 47.1428H717.132Z" fill="black" stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
@@ -0,0 +1,5 @@
|
||||
<svg width="1005" height="295" viewBox="0 0 1005 295" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M71.2116 190.27C70.5288 189.148 69.8947 188.075 69.2607 186.954C66.9683 182.857 63.2127 180.32 58.5303 179.686C53.848 179.052 49.5558 180.515 46.2391 183.832L36.3867 193.684C29.6558 200.415 18.779 200.415 12.0482 193.684C5.31728 186.954 5.31728 176.028 12.0482 169.346L45.7513 135.643C50.8239 130.57 53.5552 124.669 54.1893 117.548C56.5305 90.3801 68.09 63.8956 88.868 43.1177C112.28 19.7059 143.008 8 173.736 8C204.464 8 235.143 19.7059 258.554 43.1177C281.966 66.5294 293.672 97.2574 293.672 127.937C293.672 158.616 281.966 189.344 258.554 212.755C237.776 233.533 211.243 245.093 184.125 247.434C177.004 248.068 171.053 250.799 166.029 255.872L138.764 283.137C132.033 289.868 121.157 289.868 114.426 283.137C107.695 276.406 107.695 265.529 114.426 258.798L117.791 255.433C121.108 252.116 122.571 247.824 121.937 243.142C121.303 238.459 118.767 234.753 114.67 232.411C113.548 231.777 112.426 231.143 111.353 230.46C105.549 226.9 98.2815 227.778 93.4528 232.606L54.3844 271.675C47.6536 278.406 36.7281 278.406 30.046 271.675C23.3151 264.944 23.3151 254.018 30.046 247.336L69.1144 208.268C73.943 203.439 74.8209 196.172 71.2604 190.368L71.2116 190.27ZM88.1851 127.888C88.1851 149.787 96.5256 171.687 113.255 188.368C129.936 205.049 151.836 213.438 173.736 213.438C195.635 213.438 217.535 205.098 234.216 188.368C250.946 171.687 259.286 149.787 259.286 127.888C259.286 105.988 250.946 84.0882 234.216 67.4074C217.535 50.7265 195.635 42.3373 173.736 42.3373C151.836 42.3373 129.936 50.6777 113.255 67.4074C96.5743 84.0882 88.1851 105.988 88.1851 127.888Z" fill="#4BC7F8"/>
|
||||
<path d="M173.736 104.232C168.468 104.232 163.688 102.086 160.225 98.6231C156.762 95.1601 154.665 90.429 154.665 85.1126C154.665 79.8449 156.811 75.065 160.274 71.602C163.737 68.139 168.517 65.9929 173.785 65.9929C182.125 65.9929 190.124 67.6513 197.44 70.6753C205 73.7969 211.829 78.3817 217.535 84.0883C223.242 89.7949 227.827 96.6233 230.948 104.183C233.972 111.5 235.631 119.499 235.631 127.839V128.229C235.143 133.692 233.241 138.618 229.826 142.179C226.607 145.544 222.169 147.544 216.462 147.495C211.975 147.495 208.024 146.032 204.903 143.593C201.635 141.057 199.294 137.448 198.172 133.302C197.586 131.156 197.489 129.107 197.343 127.059C197.245 125.595 197.147 124.132 196.855 122.766C196.367 120.523 195.587 118.426 194.514 116.475C193.441 114.524 192.075 112.719 190.465 111.109C188.271 108.914 185.686 107.159 182.808 105.988C180.028 104.817 176.955 104.183 173.736 104.183V104.232Z" fill="white"/>
|
||||
<path d="M398.098 227.436H459.652C466.968 227.436 471.065 223.339 471.065 216.023V207.341C471.065 200.025 466.968 195.928 459.652 195.928H406.634C396.342 195.928 394.635 191.343 394.635 185.539V77.7476C394.635 70.4314 390.538 66.3344 383.222 66.3344H371.077C363.761 66.3344 359.664 70.4314 359.664 77.7476V191.831C359.664 217.584 371.418 227.388 398.049 227.388L398.098 227.436ZM577.1 116.962V172.76C577.1 194.611 569.15 200.659 550.567 200.659C531.984 200.659 524.034 194.611 524.034 172.76V116.962C524.034 109.597 519.937 105.5 512.621 105.5H500.963C493.647 105.5 489.55 109.597 489.55 116.962V172.273C489.55 216.804 511.987 229.68 550.518 229.68C589.05 229.68 611.486 216.804 611.486 172.273V116.962C611.486 109.597 607.389 105.5 600.073 105.5H588.416C581.1 105.5 577.003 109.597 577.003 116.962H577.1ZM698.256 103.305C659.724 103.305 637.288 116.182 637.288 160.713V216.023C637.288 223.339 641.385 227.485 648.701 227.485H660.358C667.675 227.485 671.772 223.339 671.772 216.023V160.177C671.772 138.374 679.722 132.326 698.305 132.326C716.888 132.326 724.838 138.374 724.838 160.177V216.023C724.838 223.339 728.935 227.485 736.252 227.485H747.909C755.225 227.485 759.322 223.339 759.322 216.023V160.713C759.322 116.182 736.886 103.305 698.354 103.305H698.256ZM838.142 103.305C827.265 103.305 814.144 104.769 800.634 107.646C792.537 109.256 788.684 113.694 788.684 120.523V125.108C788.684 133.058 793.415 136.618 801.219 135.155C812.73 132.814 824.241 131.302 833.118 131.302C851.213 131.302 861.943 137.252 861.943 150.909V152.909H829.899C799.854 152.909 781.222 160.957 781.222 190.222C781.222 219.486 799.707 227.436 829.899 227.436H858.041C884.624 227.436 896.427 217.633 896.427 191.831V150.958C896.427 117.596 871.65 103.354 838.142 103.354V103.305ZM849.652 202.708H831.557C816.729 202.708 813.657 199.245 813.657 190.173C813.657 181.101 816.729 177.589 831.703 177.589H861.992V190.075C861.992 198.367 860.236 202.708 849.652 202.708ZM984.855 104.281C932.423 105.159 922.229 112.816 922.229 141.203V215.974C922.229 223.291 926.326 227.436 933.642 227.436H945.933C953.249 227.436 957.346 223.291 957.346 215.974V146.129C957.346 136.862 958.468 134.619 984.465 134.228C992.659 134.082 997 130.034 997 122.718V115.548C997 108.134 992.805 104.135 984.855 104.281V104.281Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user