generated from boboko/starter
contact page, legal pages and category page
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use Lunar\Models\Collection;
|
||||||
|
use Lunar\Models\Product;
|
||||||
|
|
||||||
|
class CategoryController extends Controller
|
||||||
|
{
|
||||||
|
public function show(string $locale, Collection $collection)
|
||||||
|
{
|
||||||
|
$products = $collection
|
||||||
|
->products()
|
||||||
|
->with(['variants.prices.currency', 'media'])
|
||||||
|
->paginate(12)
|
||||||
|
->withQueryString()
|
||||||
|
->through(fn (Product $product) => [
|
||||||
|
'name' => $product->translateAttribute('name'),
|
||||||
|
'price' => $product->variants->first()?->prices->first()?->price->decimal,
|
||||||
|
'image' => $product->media->first()?->getUrl(),
|
||||||
|
'href' => route('product.show', ['product' => $product]),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return view('category.show', [
|
||||||
|
'collection' => $collection,
|
||||||
|
'products' => $products,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
class ContactController extends Controller
|
||||||
|
{
|
||||||
|
public function index(string $locale)
|
||||||
|
{
|
||||||
|
return view('contact');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,19 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\StoicPage;
|
||||||
use Lunar\Models\Product;
|
use Lunar\Models\Product;
|
||||||
|
|
||||||
class HomeController extends Controller
|
class HomeController extends Controller
|
||||||
{
|
{
|
||||||
public function index()
|
public function index(string $locale)
|
||||||
{
|
{
|
||||||
|
$page = StoicPage::firstWhere('slug', 'home');
|
||||||
|
|
||||||
|
if (! $page) {
|
||||||
|
abort(404);
|
||||||
|
}
|
||||||
|
|
||||||
$products = Product::with(['variants.prices.currency', 'media'])
|
$products = Product::with(['variants.prices.currency', 'media'])
|
||||||
->inRandomOrder()
|
->inRandomOrder()
|
||||||
->limit(13)
|
->limit(13)
|
||||||
@@ -20,6 +27,7 @@ public function index()
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
return view('home', [
|
return view('home', [
|
||||||
|
'page' => $page,
|
||||||
'heroProducts' => $products->take(5)->values(),
|
'heroProducts' => $products->take(5)->values(),
|
||||||
'classicsProducts' => $products->slice(5)->values(),
|
'classicsProducts' => $products->slice(5)->values(),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\StoicPage;
|
||||||
|
|
||||||
|
class LegalPageController extends Controller
|
||||||
|
{
|
||||||
|
public function terms(string $locale)
|
||||||
|
{
|
||||||
|
return $this->show('terms-and-conditions');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function shippingReturns(string $locale)
|
||||||
|
{
|
||||||
|
return $this->show('shipping-returns');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function privacy(string $locale)
|
||||||
|
{
|
||||||
|
return $this->show('privacy-policy');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cookies(string $locale)
|
||||||
|
{
|
||||||
|
return $this->show('cookies-policy');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function show(string $slug)
|
||||||
|
{
|
||||||
|
$page = StoicPage::firstWhere('slug', $slug);
|
||||||
|
|
||||||
|
if (! $page) {
|
||||||
|
abort(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('legal', ['page' => $page]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use JacobJoergensen\LaravelPaper\Attributes\ContentPath;
|
||||||
|
use JacobJoergensen\LaravelPaper\Attributes\Driver;
|
||||||
|
use JacobJoergensen\LaravelPaper\Attributes\Timestamps;
|
||||||
|
use JacobJoergensen\LaravelPaper\Paper;
|
||||||
|
|
||||||
|
#[Driver("markdown")]
|
||||||
|
#[ContentPath("resources/stoic/content/pages")]
|
||||||
|
#[Timestamps]
|
||||||
|
class StoicPage extends Model
|
||||||
|
{
|
||||||
|
use Paper;
|
||||||
|
}
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Symfony\Component\Yaml\Yaml;
|
||||||
|
|
||||||
|
class Stoic
|
||||||
|
{
|
||||||
|
public static array $config = [];
|
||||||
|
public static array $presets = [];
|
||||||
|
public static string $thumbs_path;
|
||||||
|
|
||||||
|
private static function loadConfig(): void
|
||||||
|
{
|
||||||
|
if (!empty(static::$config)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$config = Yaml::parseFile(resource_path("stoic/stoic_config.yml"));
|
||||||
|
static::$config = $config;
|
||||||
|
static::$thumbs_path = $config["thumbs_path"];
|
||||||
|
static::$presets = $config["presets"];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function presets(): array
|
||||||
|
{
|
||||||
|
static::loadConfig();
|
||||||
|
return static::$presets;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the public URL for a stoic image at a given preset.
|
||||||
|
public static function image(string $filename, string $preset): string
|
||||||
|
{
|
||||||
|
static::loadConfig();
|
||||||
|
|
||||||
|
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
|
||||||
|
|
||||||
|
if ($ext === "svg") {
|
||||||
|
$rel = static::thumbsRelPath() . "images/" . $filename;
|
||||||
|
return Storage::disk("public")->url($rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
$webp = substr($filename, 0, -strlen($ext)) . "webp";
|
||||||
|
$rel = static::thumbsRelPath() . "presets/" . $preset . "/" . $webp;
|
||||||
|
|
||||||
|
return Storage::disk("public")->url($rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates the full srcset string for all configured presets.
|
||||||
|
public static function srcset(string $filename): string
|
||||||
|
{
|
||||||
|
static::loadConfig();
|
||||||
|
|
||||||
|
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
|
||||||
|
if ($ext === "svg") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return collect(static::$presets)
|
||||||
|
->map(
|
||||||
|
fn($p) => static::image($filename, $p["code"]) .
|
||||||
|
" " .
|
||||||
|
$p["width"] .
|
||||||
|
"w",
|
||||||
|
)
|
||||||
|
->implode(", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns [width, height] for a given preset from the sidecar JSON.
|
||||||
|
public static function dimensions(string $filename, string $preset): array
|
||||||
|
{
|
||||||
|
static::loadConfig();
|
||||||
|
|
||||||
|
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
|
||||||
|
if ($ext === "svg") {
|
||||||
|
return [null, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
$rel = static::thumbsRelPath() . "images/" . $filename . ".json";
|
||||||
|
$path = Storage::disk("public")->path($rel);
|
||||||
|
$meta = json_decode(@file_get_contents($path), true);
|
||||||
|
|
||||||
|
$p = $meta["presets"][$preset] ?? null;
|
||||||
|
if (!$p) {
|
||||||
|
return [null, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [(int) $p["w"], (int) $p["h"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path of the thumbs directory relative to the public storage disk root.
|
||||||
|
// Uses a fixed marker so it works regardless of the app's base path (local vs Docker).
|
||||||
|
private static function thumbsRelPath(): string
|
||||||
|
{
|
||||||
|
$marker = "/storage/app/public/";
|
||||||
|
$pos = strpos(static::$thumbs_path, $marker);
|
||||||
|
|
||||||
|
if ($pos !== false) {
|
||||||
|
return substr(static::$thumbs_path, $pos + strlen($marker));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ltrim(static::$thumbs_path, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function token(string $email): string
|
||||||
|
{
|
||||||
|
$ttl = 60;
|
||||||
|
$payload = base64_encode(
|
||||||
|
json_encode([
|
||||||
|
"email" => $email,
|
||||||
|
"exp" => time() + $ttl,
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
$sig = hash_hmac(
|
||||||
|
"sha256",
|
||||||
|
$payload,
|
||||||
|
config("services.stoic.sso_secret"),
|
||||||
|
);
|
||||||
|
|
||||||
|
$token = "t=" . urlencode($payload) . "&s=" . $sig;
|
||||||
|
|
||||||
|
return $token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function hasMany(
|
||||||
|
string $relation,
|
||||||
|
array $slugs,
|
||||||
|
string $prefix,
|
||||||
|
) {
|
||||||
|
$slugs = array_map(
|
||||||
|
fn($i) => str_replace($prefix . "/", "", $i),
|
||||||
|
$slugs,
|
||||||
|
);
|
||||||
|
|
||||||
|
$entries = $relation::whereIn("slug", $slugs)->get();
|
||||||
|
|
||||||
|
return collect(array_map(
|
||||||
|
fn($i) => $entries->firstWhere("slug", $i),
|
||||||
|
$slugs
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function hasOne(
|
||||||
|
string $relation,
|
||||||
|
string $slug,
|
||||||
|
string $prefix,
|
||||||
|
) {
|
||||||
|
$slug = str_replace($prefix . "/", "", $slug);
|
||||||
|
return $relation::firstWhere("slug", $slug);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"artesaos/seotools": "^1.4",
|
"artesaos/seotools": "^1.4",
|
||||||
"boboko/core": "0.*",
|
"boboko/core": "0.*",
|
||||||
|
"jacobjoergensen/laravel-paper": "^1.12",
|
||||||
"open-telemetry/exporter-otlp": "^1.4",
|
"open-telemetry/exporter-otlp": "^1.4",
|
||||||
"open-telemetry/opentelemetry-auto-laravel": "^1.7",
|
"open-telemetry/opentelemetry-auto-laravel": "^1.7",
|
||||||
"open-telemetry/sdk": "^1.14",
|
"open-telemetry/sdk": "^1.14",
|
||||||
|
|||||||
Generated
+245
-114
@@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "497fd57dba085798efccc5819904020f",
|
"content-hash": "a89bc3e4e93372ee52664163d56f783b",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "anourvalar/eloquent-serialize",
|
"name": "anourvalar/eloquent-serialize",
|
||||||
@@ -565,11 +565,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "boboko/core",
|
"name": "boboko/core",
|
||||||
"version": "0.4.0",
|
"version": "0.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://code.radical-elements.com/boboko/core.git",
|
"url": "https://code.radical-elements.com/boboko/core.git",
|
||||||
"reference": "f7da26b487f49d1b772ae89e9a66d943ad7b20c2"
|
"reference": "e31de1b4e3894c70a82a8d939b094bf305588eb5"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"laravel/framework": "^12.0",
|
"laravel/framework": "^12.0",
|
||||||
@@ -599,7 +599,8 @@
|
|||||||
"Modules\\Core\\Providers\\CoreServiceProvider",
|
"Modules\\Core\\Providers\\CoreServiceProvider",
|
||||||
"Modules\\Core\\Providers\\AuthServiceProvider",
|
"Modules\\Core\\Providers\\AuthServiceProvider",
|
||||||
"Modules\\Core\\Providers\\CustomerServiceProvider",
|
"Modules\\Core\\Providers\\CustomerServiceProvider",
|
||||||
"Modules\\Core\\Providers\\LocalizationServiceProvider"
|
"Modules\\Core\\Providers\\LocalizationServiceProvider",
|
||||||
|
"Modules\\Core\\Providers\\ReviewServiceProvider"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -609,7 +610,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Core module — authentication and shared panel behaviour",
|
"description": "Core module — authentication and shared panel behaviour",
|
||||||
"time": "2026-08-06T09:24:07+00:00"
|
"time": "2026-08-24T11:47:59+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "brick/math",
|
"name": "brick/math",
|
||||||
@@ -1896,7 +1897,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/actions",
|
"name": "filament/actions",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/actions.git",
|
"url": "https://github.com/filamentphp/actions.git",
|
||||||
@@ -1949,7 +1950,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/filament",
|
"name": "filament/filament",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/panels.git",
|
"url": "https://github.com/filamentphp/panels.git",
|
||||||
@@ -2014,7 +2015,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/forms",
|
"name": "filament/forms",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/forms.git",
|
"url": "https://github.com/filamentphp/forms.git",
|
||||||
@@ -2070,7 +2071,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/infolists",
|
"name": "filament/infolists",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/infolists.git",
|
"url": "https://github.com/filamentphp/infolists.git",
|
||||||
@@ -2121,7 +2122,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/notifications",
|
"name": "filament/notifications",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/notifications.git",
|
"url": "https://github.com/filamentphp/notifications.git",
|
||||||
@@ -2173,7 +2174,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/spatie-laravel-media-library-plugin",
|
"name": "filament/spatie-laravel-media-library-plugin",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git",
|
"url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git",
|
||||||
@@ -2211,16 +2212,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/support",
|
"name": "filament/support",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/support.git",
|
"url": "https://github.com/filamentphp/support.git",
|
||||||
"reference": "a9889ea4cdec47c365af47f344a8acd9917ed4c5"
|
"reference": "e2ce3ca8fd1007103e4a16ab564a76b6fee87968"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/filamentphp/support/zipball/a9889ea4cdec47c365af47f344a8acd9917ed4c5",
|
"url": "https://api.github.com/repos/filamentphp/support/zipball/e2ce3ca8fd1007103e4a16ab564a76b6fee87968",
|
||||||
"reference": "a9889ea4cdec47c365af47f344a8acd9917ed4c5",
|
"reference": "e2ce3ca8fd1007103e4a16ab564a76b6fee87968",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2266,11 +2267,11 @@
|
|||||||
"issues": "https://github.com/filamentphp/filament/issues",
|
"issues": "https://github.com/filamentphp/filament/issues",
|
||||||
"source": "https://github.com/filamentphp/filament"
|
"source": "https://github.com/filamentphp/filament"
|
||||||
},
|
},
|
||||||
"time": "2026-06-12T16:57:05+00:00"
|
"time": "2026-08-24T16:38:35+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/tables",
|
"name": "filament/tables",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/tables.git",
|
"url": "https://github.com/filamentphp/tables.git",
|
||||||
@@ -2322,7 +2323,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "filament/widgets",
|
"name": "filament/widgets",
|
||||||
"version": "v3.3.54",
|
"version": "v3.3.55",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/filamentphp/widgets.git",
|
"url": "https://github.com/filamentphp/widgets.git",
|
||||||
@@ -2481,24 +2482,24 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "graham-campbell/result-type",
|
"name": "graham-campbell/result-type",
|
||||||
"version": "v1.1.4",
|
"version": "v1.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/GrahamCampbell/Result-Type.git",
|
"url": "https://github.com/GrahamCampbell/Result-Type.git",
|
||||||
"reference": "e01f4a821471308ba86aa202fed6698b6b695e3b"
|
"reference": "adccca3324eece92ca35463648c12b9e6293c05b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b",
|
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/adccca3324eece92ca35463648c12b9e6293c05b",
|
||||||
"reference": "e01f4a821471308ba86aa202fed6698b6b695e3b",
|
"reference": "adccca3324eece92ca35463648c12b9e6293c05b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.2.5 || ^8.0",
|
"php": "^7.2.5 || ^8.0",
|
||||||
"phpoption/phpoption": "^1.9.5"
|
"phpoption/phpoption": "^1.10"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7"
|
"phpunit/phpunit": "^8.5.52 || ^9.6.34 || ^10.5.63 || ^11.5.55 || ^12.5.14"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -2527,7 +2528,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
|
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
|
||||||
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4"
|
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.2.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2539,26 +2540,26 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-12-27T19:43:20+00:00"
|
"time": "2026-08-24T09:06:52+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/guzzle",
|
"name": "guzzlehttp/guzzle",
|
||||||
"version": "7.15.3",
|
"version": "7.15.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/guzzle.git",
|
"url": "https://github.com/guzzle/guzzle.git",
|
||||||
"reference": "ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc"
|
"reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc",
|
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a",
|
||||||
"reference": "ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc",
|
"reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"guzzlehttp/promises": "^2.5.2",
|
"guzzlehttp/promises": "^2.5.3",
|
||||||
"guzzlehttp/psr7": "^2.13",
|
"guzzlehttp/psr7": "^2.13.1",
|
||||||
"php": "^7.2.5 || ^8.0",
|
"php": "^7.2.5 || ^8.0",
|
||||||
"psr/http-client": "^1.0",
|
"psr/http-client": "^1.0",
|
||||||
"symfony/deprecation-contracts": "^2.5 || ^3.0",
|
"symfony/deprecation-contracts": "^2.5 || ^3.0",
|
||||||
@@ -2651,7 +2652,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/guzzle/issues",
|
"issues": "https://github.com/guzzle/guzzle/issues",
|
||||||
"source": "https://github.com/guzzle/guzzle/tree/7.15.3"
|
"source": "https://github.com/guzzle/guzzle/tree/7.15.5"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2667,20 +2668,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-05T19:48:21+00:00"
|
"time": "2026-08-24T09:21:06+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/promises",
|
"name": "guzzlehttp/promises",
|
||||||
"version": "2.5.2",
|
"version": "2.5.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/promises.git",
|
"url": "https://github.com/guzzle/promises.git",
|
||||||
"reference": "2823687acff28b2dbe67b2508a6b300e2c3fa4ce"
|
"reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/promises/zipball/2823687acff28b2dbe67b2508a6b300e2c3fa4ce",
|
"url": "https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1",
|
||||||
"reference": "2823687acff28b2dbe67b2508a6b300e2c3fa4ce",
|
"reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2735,7 +2736,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/promises/issues",
|
"issues": "https://github.com/guzzle/promises/issues",
|
||||||
"source": "https://github.com/guzzle/promises/tree/2.5.2"
|
"source": "https://github.com/guzzle/promises/tree/2.5.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2751,20 +2752,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-05T19:30:54+00:00"
|
"time": "2026-08-24T09:11:28+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/psr7",
|
"name": "guzzlehttp/psr7",
|
||||||
"version": "2.13.0",
|
"version": "2.13.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/psr7.git",
|
"url": "https://github.com/guzzle/psr7.git",
|
||||||
"reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4"
|
"reference": "95e7828100de18b4e269fb1703be530082d5166d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/dad89620b7a6edb60c15858442eb2e408b45d8f4",
|
"url": "https://api.github.com/repos/guzzle/psr7/zipball/95e7828100de18b4e269fb1703be530082d5166d",
|
||||||
"reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4",
|
"reference": "95e7828100de18b4e269fb1703be530082d5166d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2854,7 +2855,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/psr7/issues",
|
"issues": "https://github.com/guzzle/psr7/issues",
|
||||||
"source": "https://github.com/guzzle/psr7/tree/2.13.0"
|
"source": "https://github.com/guzzle/psr7/tree/2.13.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2870,20 +2871,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-07-16T22:23:49+00:00"
|
"time": "2026-08-24T09:13:11+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/uri-template",
|
"name": "guzzlehttp/uri-template",
|
||||||
"version": "v1.0.10",
|
"version": "v1.0.11",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/uri-template.git",
|
"url": "https://github.com/guzzle/uri-template.git",
|
||||||
"reference": "f6c24c21f42b990e9a58912b332d0874df6ba839"
|
"reference": "d0058dccf4299d70c3d9da3378b8908b32780368"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/uri-template/zipball/f6c24c21f42b990e9a58912b332d0874df6ba839",
|
"url": "https://api.github.com/repos/guzzle/uri-template/zipball/d0058dccf4299d70c3d9da3378b8908b32780368",
|
||||||
"reference": "f6c24c21f42b990e9a58912b332d0874df6ba839",
|
"reference": "d0058dccf4299d70c3d9da3378b8908b32780368",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -2940,7 +2941,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/guzzle/uri-template/issues",
|
"issues": "https://github.com/guzzle/uri-template/issues",
|
||||||
"source": "https://github.com/guzzle/uri-template/tree/v1.0.10"
|
"source": "https://github.com/guzzle/uri-template/tree/v1.0.11"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2956,7 +2957,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-07-17T13:53:03+00:00"
|
"time": "2026-08-24T09:15:32+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "http-interop/http-factory-guzzle",
|
"name": "http-interop/http-factory-guzzle",
|
||||||
@@ -3016,6 +3017,74 @@
|
|||||||
},
|
},
|
||||||
"time": "2025-12-15T11:28:16+00:00"
|
"time": "2025-12-15T11:28:16+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "jacobjoergensen/laravel-paper",
|
||||||
|
"version": "1.15.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/JacobJoergensen/laravel-paper.git",
|
||||||
|
"reference": "024ced2ee5469ab511f957f9a505f5db5745d32b"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/JacobJoergensen/laravel-paper/zipball/024ced2ee5469ab511f957f9a505f5db5745d32b",
|
||||||
|
"reference": "024ced2ee5469ab511f957f9a505f5db5745d32b",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/database": "^12.0|^13.0",
|
||||||
|
"illuminate/filesystem": "^12.0|^13.0",
|
||||||
|
"illuminate/support": "^12.0|^13.0",
|
||||||
|
"php": "^8.4",
|
||||||
|
"spatie/yaml-front-matter": "^2.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"laravel/pint": "^1.29",
|
||||||
|
"orchestra/testbench": "^10.0|^11.0",
|
||||||
|
"pestphp/pest": "^4.0",
|
||||||
|
"pestphp/pest-plugin-laravel": "^4.1",
|
||||||
|
"pestphp/pest-plugin-type-coverage": "^4.0",
|
||||||
|
"phpstan/phpstan": "^2.1"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"JacobJoergensen\\LaravelPaper\\PaperServiceProvider"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"JacobJoergensen\\LaravelPaper\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "JacobJoergensen",
|
||||||
|
"email": "jj@minehubsstudios.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A flat-file Eloquent driver for modern Laravel.",
|
||||||
|
"keywords": [
|
||||||
|
"cms",
|
||||||
|
"content",
|
||||||
|
"eloquent",
|
||||||
|
"flat-file",
|
||||||
|
"frontmatter",
|
||||||
|
"laravel",
|
||||||
|
"markdown"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/JacobJoergensen/laravel-paper/issues",
|
||||||
|
"source": "https://github.com/JacobJoergensen/laravel-paper/tree/1.15.0"
|
||||||
|
},
|
||||||
|
"time": "2026-07-30T21:15:25+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "kalnoy/nestedset",
|
"name": "kalnoy/nestedset",
|
||||||
"version": "v6.0.6",
|
"version": "v6.0.6",
|
||||||
@@ -3144,16 +3213,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/framework",
|
"name": "laravel/framework",
|
||||||
"version": "v12.67.0",
|
"version": "v12.68.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/framework.git",
|
"url": "https://github.com/laravel/framework.git",
|
||||||
"reference": "fe2cdaba052cbb9f350761ccefc7ac221cbdf0b5"
|
"reference": "1343c22b92edd48e29ff273d8ce7c15cf75d974c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/framework/zipball/fe2cdaba052cbb9f350761ccefc7ac221cbdf0b5",
|
"url": "https://api.github.com/repos/laravel/framework/zipball/1343c22b92edd48e29ff273d8ce7c15cf75d974c",
|
||||||
"reference": "fe2cdaba052cbb9f350761ccefc7ac221cbdf0b5",
|
"reference": "1343c22b92edd48e29ff273d8ce7c15cf75d974c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -3362,20 +3431,20 @@
|
|||||||
"issues": "https://github.com/laravel/framework/issues",
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
"source": "https://github.com/laravel/framework"
|
"source": "https://github.com/laravel/framework"
|
||||||
},
|
},
|
||||||
"time": "2026-08-18T13:37:47+00:00"
|
"time": "2026-08-25T14:18:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/prompts",
|
"name": "laravel/prompts",
|
||||||
"version": "v0.3.23",
|
"version": "v0.3.24",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/prompts.git",
|
"url": "https://github.com/laravel/prompts.git",
|
||||||
"reference": "b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221"
|
"reference": "5d3cdef29e93ca3b62b1871359db3078cd99908b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/prompts/zipball/b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221",
|
"url": "https://api.github.com/repos/laravel/prompts/zipball/5d3cdef29e93ca3b62b1871359db3078cd99908b",
|
||||||
"reference": "b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221",
|
"reference": "5d3cdef29e93ca3b62b1871359db3078cd99908b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -3419,9 +3488,9 @@
|
|||||||
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/laravel/prompts/issues",
|
"issues": "https://github.com/laravel/prompts/issues",
|
||||||
"source": "https://github.com/laravel/prompts/tree/v0.3.23"
|
"source": "https://github.com/laravel/prompts/tree/v0.3.24"
|
||||||
},
|
},
|
||||||
"time": "2026-08-11T18:58:24+00:00"
|
"time": "2026-08-20T12:55:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/scout",
|
"name": "laravel/scout",
|
||||||
@@ -3505,16 +3574,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/serializable-closure",
|
"name": "laravel/serializable-closure",
|
||||||
"version": "v2.0.15",
|
"version": "v2.0.16",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/serializable-closure.git",
|
"url": "https://github.com/laravel/serializable-closure.git",
|
||||||
"reference": "dccd8bcb851bb03fcc005df650b708b57cc52661"
|
"reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661",
|
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed",
|
||||||
"reference": "dccd8bcb851bb03fcc005df650b708b57cc52661",
|
"reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -3562,7 +3631,7 @@
|
|||||||
"issues": "https://github.com/laravel/serializable-closure/issues",
|
"issues": "https://github.com/laravel/serializable-closure/issues",
|
||||||
"source": "https://github.com/laravel/serializable-closure"
|
"source": "https://github.com/laravel/serializable-closure"
|
||||||
},
|
},
|
||||||
"time": "2026-07-21T16:49:22+00:00"
|
"time": "2026-08-18T20:28:54+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/tinker",
|
"name": "laravel/tinker",
|
||||||
@@ -4360,16 +4429,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "livewire/livewire",
|
"name": "livewire/livewire",
|
||||||
"version": "v3.8.5",
|
"version": "v3.8.6",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/livewire/livewire.git",
|
"url": "https://github.com/livewire/livewire.git",
|
||||||
"reference": "038443795e69af79ba03064cbc19d76b60e2c638"
|
"reference": "be5729e9accfa9255a28d82f7759a3cc4be0f079"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/livewire/livewire/zipball/038443795e69af79ba03064cbc19d76b60e2c638",
|
"url": "https://api.github.com/repos/livewire/livewire/zipball/be5729e9accfa9255a28d82f7759a3cc4be0f079",
|
||||||
"reference": "038443795e69af79ba03064cbc19d76b60e2c638",
|
"reference": "be5729e9accfa9255a28d82f7759a3cc4be0f079",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -4424,7 +4493,7 @@
|
|||||||
"description": "A front-end framework for Laravel.",
|
"description": "A front-end framework for Laravel.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/livewire/livewire/issues",
|
"issues": "https://github.com/livewire/livewire/issues",
|
||||||
"source": "https://github.com/livewire/livewire/tree/v3.8.5"
|
"source": "https://github.com/livewire/livewire/tree/v3.8.6"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -4432,7 +4501,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-08-18T11:38:50+00:00"
|
"time": "2026-08-24T15:02:02+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "lukascivil/treewalker",
|
"name": "lukascivil/treewalker",
|
||||||
@@ -6986,16 +7055,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpoption/phpoption",
|
"name": "phpoption/phpoption",
|
||||||
"version": "1.9.5",
|
"version": "1.10.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/schmittjoh/php-option.git",
|
"url": "https://github.com/schmittjoh/php-option.git",
|
||||||
"reference": "75365b91986c2405cf5e1e012c5595cd487a98be"
|
"reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be",
|
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/67b192b6a42ec03944b972d6e633ddec78ad2c6d",
|
||||||
"reference": "75365b91986c2405cf5e1e012c5595cd487a98be",
|
"reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -7003,7 +7072,7 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"bamarni/composer-bin-plugin": "^1.8.2",
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
"phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34"
|
"phpunit/phpunit": "^8.5.54 || ^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.33"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -7045,7 +7114,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/schmittjoh/php-option/issues",
|
"issues": "https://github.com/schmittjoh/php-option/issues",
|
||||||
"source": "https://github.com/schmittjoh/php-option/tree/1.9.5"
|
"source": "https://github.com/schmittjoh/php-option/tree/1.10.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -7057,7 +7126,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2025-12-27T19:41:33+00:00"
|
"time": "2026-08-24T00:54:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpdoc-parser",
|
"name": "phpstan/phpdoc-parser",
|
||||||
@@ -8398,16 +8467,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/invade",
|
"name": "spatie/invade",
|
||||||
"version": "2.1.0",
|
"version": "2.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/spatie/invade.git",
|
"url": "https://github.com/spatie/invade.git",
|
||||||
"reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63"
|
"reference": "f929c7b6e75fceeefa7b41a491e91274bafb17af"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63",
|
"url": "https://api.github.com/repos/spatie/invade/zipball/f929c7b6e75fceeefa7b41a491e91274bafb17af",
|
||||||
"reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63",
|
"reference": "f929c7b6e75fceeefa7b41a491e91274bafb17af",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -8445,7 +8514,7 @@
|
|||||||
"spatie"
|
"spatie"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/spatie/invade/tree/2.1.0"
|
"source": "https://github.com/spatie/invade/tree/2.1.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -8453,7 +8522,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-05-17T09:06:10+00:00"
|
"time": "2026-08-24T12:39:05+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "spatie/laravel-activitylog",
|
"name": "spatie/laravel-activitylog",
|
||||||
@@ -9459,6 +9528,68 @@
|
|||||||
],
|
],
|
||||||
"time": "2026-06-22T07:55:44+00:00"
|
"time": "2026-06-22T07:55:44+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "spatie/yaml-front-matter",
|
||||||
|
"version": "2.1.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/spatie/yaml-front-matter.git",
|
||||||
|
"reference": "3066996d0e4ed74bcc22c261084a9df727bf7e36"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/spatie/yaml-front-matter/zipball/3066996d0e4ed74bcc22c261084a9df727bf7e36",
|
||||||
|
"reference": "3066996d0e4ed74bcc22c261084a9df727bf7e36",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^8.0",
|
||||||
|
"symfony/yaml": "^6.0|^7.0|^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^9.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Spatie\\YamlFrontMatter\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian De Deyne",
|
||||||
|
"email": "sebastian@spatie.be",
|
||||||
|
"homepage": "https://spatie.be",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A to the point yaml front matter parser",
|
||||||
|
"homepage": "https://github.com/sebastiandedeyne/yaml-front-matter",
|
||||||
|
"keywords": [
|
||||||
|
"front matter",
|
||||||
|
"jekyll",
|
||||||
|
"spatie",
|
||||||
|
"yaml"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/spatie/yaml-front-matter/tree/2.1.1"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://spatie.be/open-source/support-us",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/spatie",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2025-11-24T16:17:28+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "spomky-labs/cbor-php",
|
"name": "spomky-labs/cbor-php",
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
@@ -11026,16 +11157,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-idn",
|
"name": "symfony/polyfill-intl-idn",
|
||||||
"version": "v1.38.1",
|
"version": "v1.42.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
||||||
"reference": "dc21118016c039a66235cf93d96b435ffb282412"
|
"reference": "51b5ff5ba85452b31ec6f55490b08148612339d9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/51b5ff5ba85452b31ec6f55490b08148612339d9",
|
||||||
"reference": "dc21118016c039a66235cf93d96b435ffb282412",
|
"reference": "51b5ff5ba85452b31ec6f55490b08148612339d9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11089,7 +11220,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1"
|
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.42.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -11109,20 +11240,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-05-25T15:22:23+00:00"
|
"time": "2026-08-24T10:51:20+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-normalizer",
|
"name": "symfony/polyfill-intl-normalizer",
|
||||||
"version": "v1.38.0",
|
"version": "v1.42.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||||
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"
|
"reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502",
|
||||||
"reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",
|
"reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -11174,7 +11305,7 @@
|
|||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"
|
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -11194,7 +11325,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-05-25T13:48:31+00:00"
|
"time": "2026-08-07T06:33:24+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
@@ -12993,16 +13124,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "technikermathe/blade-lucide-icons",
|
"name": "technikermathe/blade-lucide-icons",
|
||||||
"version": "v3.168.0",
|
"version": "v3.169.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PascaleBeier/blade-lucide-icons.git",
|
"url": "https://github.com/PascaleBeier/blade-lucide-icons.git",
|
||||||
"reference": "42cceff9aca03fe8e99e65c67473e65bd8b35388"
|
"reference": "f73b9b4f065da5d5afc865aadf28260aef0f4477"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PascaleBeier/blade-lucide-icons/zipball/42cceff9aca03fe8e99e65c67473e65bd8b35388",
|
"url": "https://api.github.com/repos/PascaleBeier/blade-lucide-icons/zipball/f73b9b4f065da5d5afc865aadf28260aef0f4477",
|
||||||
"reference": "42cceff9aca03fe8e99e65c67473e65bd8b35388",
|
"reference": "f73b9b4f065da5d5afc865aadf28260aef0f4477",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -13052,9 +13183,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PascaleBeier/blade-lucide-icons/issues",
|
"issues": "https://github.com/PascaleBeier/blade-lucide-icons/issues",
|
||||||
"source": "https://github.com/PascaleBeier/blade-lucide-icons/tree/v3.168.0"
|
"source": "https://github.com/PascaleBeier/blade-lucide-icons/tree/v3.169.0"
|
||||||
},
|
},
|
||||||
"time": "2026-08-20T00:38:36+00:00"
|
"time": "2026-08-25T00:39:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "thecodingmachine/safe",
|
"name": "thecodingmachine/safe",
|
||||||
@@ -13325,23 +13456,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vlucas/phpdotenv",
|
"name": "vlucas/phpdotenv",
|
||||||
"version": "v5.6.4",
|
"version": "v5.7.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/vlucas/phpdotenv.git",
|
"url": "https://github.com/vlucas/phpdotenv.git",
|
||||||
"reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b"
|
"reference": "301c07936b16d88628b126b01d082ba153cf4c40"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b",
|
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/301c07936b16d88628b126b01d082ba153cf4c40",
|
||||||
"reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b",
|
"reference": "301c07936b16d88628b126b01d082ba153cf4c40",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-pcre": "*",
|
"ext-pcre": "*",
|
||||||
"graham-campbell/result-type": "^1.1.4",
|
"graham-campbell/result-type": "^1.2",
|
||||||
"php": "^7.2.5 || ^8.0",
|
"php": "^7.2.5 || ^8.0",
|
||||||
"phpoption/phpoption": "^1.9.5",
|
"phpoption/phpoption": "^1.10",
|
||||||
"symfony/polyfill-ctype": "^1.26",
|
"symfony/polyfill-ctype": "^1.26",
|
||||||
"symfony/polyfill-mbstring": "^1.26",
|
"symfony/polyfill-mbstring": "^1.26",
|
||||||
"symfony/polyfill-php80": "^1.26"
|
"symfony/polyfill-php80": "^1.26"
|
||||||
@@ -13385,7 +13516,7 @@
|
|||||||
"homepage": "https://github.com/vlucas"
|
"homepage": "https://github.com/vlucas"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
|
"description": "Loads environment variables from `.env` to `$_ENV` and `$_SERVER` automagically, and optionally to `getenv()`.",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"dotenv",
|
"dotenv",
|
||||||
"env",
|
"env",
|
||||||
@@ -13393,7 +13524,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/vlucas/phpdotenv/issues",
|
"issues": "https://github.com/vlucas/phpdotenv/issues",
|
||||||
"source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4"
|
"source": "https://github.com/vlucas/phpdotenv/tree/v5.7.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -13405,7 +13536,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-07-06T19:11:50+00:00"
|
"time": "2026-08-24T18:07:49+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "voku/portable-ascii",
|
"name": "voku/portable-ascii",
|
||||||
|
|||||||
@@ -35,4 +35,9 @@
|
|||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'stoic' => [
|
||||||
|
'sso_secret' => env('STOIC_SSO_SECRET'),
|
||||||
|
'host' => env('STOIC_HOST'),
|
||||||
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
return [
|
return [
|
||||||
|
|
||||||
'nav' => [
|
'nav' => [
|
||||||
|
'home' => 'Αρχική',
|
||||||
'products' => 'Προϊόντα',
|
'products' => 'Προϊόντα',
|
||||||
'contact' => 'Επικοινωνία',
|
'contact' => 'Επικοινωνία',
|
||||||
],
|
],
|
||||||
@@ -15,4 +16,29 @@
|
|||||||
// Laravel pluralization: {0} zero|{1} one|[2,*] many. :count is replaced automatically.
|
// Laravel pluralization: {0} zero|{1} one|[2,*] many. :count is replaced automatically.
|
||||||
'customer_reviews' => '{0} Καμία αξιολόγηση πελάτη|{1} :count αξιολόγηση πελάτη|[2,*] :count αξιολογήσεις πελατών',
|
'customer_reviews' => '{0} Καμία αξιολόγηση πελάτη|{1} :count αξιολόγηση πελάτη|[2,*] :count αξιολογήσεις πελατών',
|
||||||
|
|
||||||
|
'shop' => [
|
||||||
|
// Laravel pluralization keyed on the total result count.
|
||||||
|
'showing_results' => '{0} Δεν βρέθηκαν προϊόντα|{1} Εμφάνιση :first–:last από :total αποτέλεσμα|[2,*] Εμφάνιση :first–:last από :total αποτελέσματα',
|
||||||
|
'no_products' => 'Δεν βρέθηκαν προϊόντα σε αυτή την κατηγορία.',
|
||||||
|
'search_label' => 'Αναζήτηση προϊόντων',
|
||||||
|
'search_placeholder' => 'Αναζήτησε προϊόντα…',
|
||||||
|
'filter_price' => 'Φίλτρο τιμής',
|
||||||
|
'apply' => 'Εφαρμογή',
|
||||||
|
'availability' => 'Διαθεσιμότητα',
|
||||||
|
'in_stock_only' => 'Μόνο διαθέσιμα προϊόντα',
|
||||||
|
'sort_label' => 'Ταξινόμηση προϊόντων',
|
||||||
|
'sort_default' => 'Προεπιλεγμένη ταξινόμηση',
|
||||||
|
'sort_popularity' => 'Δημοφιλή',
|
||||||
|
'sort_price_asc' => 'Τιμή: Αύξουσα',
|
||||||
|
'sort_price_desc' => 'Τιμή: Φθίνουσα',
|
||||||
|
'sort_newest' => 'Νεότερα',
|
||||||
|
],
|
||||||
|
|
||||||
|
'pagination' => [
|
||||||
|
'nav_label' => 'Σελιδοποίηση',
|
||||||
|
'page' => 'Σελίδα :page',
|
||||||
|
'next' => 'Επόμενη σελίδα',
|
||||||
|
'previous' => 'Προηγούμενη σελίδα',
|
||||||
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
return [
|
return [
|
||||||
|
|
||||||
'nav' => [
|
'nav' => [
|
||||||
|
'home' => 'Home',
|
||||||
'products' => 'Products',
|
'products' => 'Products',
|
||||||
'contact' => 'Contact',
|
'contact' => 'Contact',
|
||||||
],
|
],
|
||||||
@@ -15,4 +16,29 @@
|
|||||||
// Laravel pluralization: {0} zero|{1} one|[2,*] many. :count is replaced automatically.
|
// Laravel pluralization: {0} zero|{1} one|[2,*] many. :count is replaced automatically.
|
||||||
'customer_reviews' => '{0} No customer reviews|{1} :count customer review|[2,*] :count customer reviews',
|
'customer_reviews' => '{0} No customer reviews|{1} :count customer review|[2,*] :count customer reviews',
|
||||||
|
|
||||||
|
'shop' => [
|
||||||
|
// Laravel pluralization keyed on the total result count.
|
||||||
|
'showing_results' => '{0} No products found|{1} Showing :first–:last of :total result|[2,*] Showing :first–:last of :total results',
|
||||||
|
'no_products' => 'No products found in this category.',
|
||||||
|
'search_label' => 'Search products',
|
||||||
|
'search_placeholder' => 'Search products…',
|
||||||
|
'filter_price' => 'Filter by price',
|
||||||
|
'apply' => 'Apply',
|
||||||
|
'availability' => 'Availability',
|
||||||
|
'in_stock_only' => 'In-stock products only',
|
||||||
|
'sort_label' => 'Sort products',
|
||||||
|
'sort_default' => 'Default sorting',
|
||||||
|
'sort_popularity' => 'Popularity',
|
||||||
|
'sort_price_asc' => 'Price: Low to High',
|
||||||
|
'sort_price_desc' => 'Price: High to Low',
|
||||||
|
'sort_newest' => 'Newest',
|
||||||
|
],
|
||||||
|
|
||||||
|
'pagination' => [
|
||||||
|
'nav_label' => 'Pagination',
|
||||||
|
'page' => 'Page :page',
|
||||||
|
'next' => 'Next page',
|
||||||
|
'previous' => 'Previous page',
|
||||||
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
+53
-23
@@ -45,7 +45,7 @@ @layer base {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes back-to-top-spin {
|
@keyframes spin {
|
||||||
from {
|
from {
|
||||||
transform: rotate(0deg);
|
transform: rotate(0deg);
|
||||||
}
|
}
|
||||||
@@ -115,9 +115,9 @@ @layer components {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ── Hero star — same burst shape/spin as back-to-top, always on ─ */
|
/* ── Hero star — same burst shape/spin as back-to-top, always on ─ */
|
||||||
.hero-star {
|
.rotating-star {
|
||||||
transform-origin: center;
|
transform-origin: center;
|
||||||
animation: back-to-top-spin 7s infinite linear;
|
animation: spin 7s infinite linear;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Back to top ──────────────────────────────────────────────── */
|
/* ── Back to top ──────────────────────────────────────────────── */
|
||||||
@@ -138,7 +138,7 @@ @layer components {
|
|||||||
.back-to-top-shape path {
|
.back-to-top-shape path {
|
||||||
fill: theme(colors.brand-light);
|
fill: theme(colors.brand-light);
|
||||||
transform-origin: center;
|
transform-origin: center;
|
||||||
animation: back-to-top-spin 7s infinite linear;
|
animation: spin 7s infinite linear;
|
||||||
animation-play-state: paused;
|
animation-play-state: paused;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,27 +300,12 @@ @layer components {
|
|||||||
transform: translate(0, 0);
|
transform: translate(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Text dance — the word itself toggles font-weight/font-style
|
|
||||||
(normal → bold+italic) three times, then stays bold+italic, once
|
|
||||||
its .is-visible ancestor appears (pair with the `appear` Stimulus
|
|
||||||
controller — data-controller="appear" data-appear-visible-class
|
|
||||||
="is-visible"); add data-text="<same word>" ── */
|
|
||||||
.text-dance {
|
.text-dance {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-weight: inherit;
|
font-weight: inherit;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Layout-shift guard: reserve the wider bold+italic width up front.
|
|
||||||
A zero-height, invisible line contributes its (wider)
|
|
||||||
shrink-to-fit width to the inline-block box, so the box never
|
|
||||||
has to grow once the animation starts — nothing around the word
|
|
||||||
moves. Trade-off: since the real word starts out narrower and
|
|
||||||
left-aligned, this leaves a small trailing gap after it until
|
|
||||||
the first bold+italic pulse fills the box. (A variable-font
|
|
||||||
weight axis would be a second way to smooth this out, but
|
|
||||||
Manrope ships here as separate static weight files, not a
|
|
||||||
variable font, so there's no axis to animate.) */
|
|
||||||
.text-dance::before {
|
.text-dance::before {
|
||||||
content: attr(data-text);
|
content: attr(data-text);
|
||||||
display: block;
|
display: block;
|
||||||
@@ -335,12 +320,57 @@ @layer components {
|
|||||||
animation: text-dance 0.8s ease 3 forwards;
|
animation: text-dance 0.8s ease 3 forwards;
|
||||||
animation-delay: var(--dance-delay, 0s);
|
animation-delay: var(--dance-delay, 0s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Typography for markdown rendered from Stoic legal-page bodies (h1.h6, p, lists,
|
||||||
|
links, tables) — a plain set of descendant selectors, not expressible as
|
||||||
|
utilities on the wrapper alone since the markup itself is generated by Str::markdown(). */
|
||||||
|
.legal-content {
|
||||||
|
@apply text-neutral-700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content > * + * {
|
||||||
|
@apply mt-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content h2 {
|
||||||
|
@apply font-display text-2xl font-bold text-black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content h3 {
|
||||||
|
@apply font-display text-xl font-bold text-black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content ul,
|
||||||
|
.legal-content ol {
|
||||||
|
@apply ml-6 space-y-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content ul {
|
||||||
|
@apply list-disc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content ol {
|
||||||
|
@apply list-decimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content a {
|
||||||
|
@apply underline hover:text-black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content strong {
|
||||||
|
@apply font-bold text-black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content table {
|
||||||
|
@apply w-full border-collapse text-left text-sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content th,
|
||||||
|
.legal-content td {
|
||||||
|
@apply border border-neutral-300 px-3 py-2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replayed 3 times via animation-iteration-count on .is-visible
|
|
||||||
.text-dance above — each iteration starts back at 0% (normal) and
|
|
||||||
snaps to 100% (bold+italic); forwards fill holds the final
|
|
||||||
iteration's 100% state after it ends, so the word settles there. */
|
|
||||||
@keyframes text-dance {
|
@keyframes text-dance {
|
||||||
0%, 60% { font-weight: inherit; font-style: normal; }
|
0%, 60% { font-weight: inherit; font-style: normal; }
|
||||||
70%, 100% { font-weight: 800; font-style: italic; }
|
70%, 100% { font-weight: 800; font-style: italic; }
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
---
|
||||||
|
name: "Πολιτική Cookies"
|
||||||
|
slug: "cookies-policy"
|
||||||
|
|
||||||
|
meta_title: ""
|
||||||
|
meta_description: ""
|
||||||
|
og_image: ""
|
||||||
|
noindex: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
Η παρούσα Πολιτική Cookies εξηγεί πώς η 3DEALER χρησιμοποιεί cookies και παρόμοιες τεχνολογίες κατά την επίσκεψή σας στο ηλεκτρονικό κατάστημα.
|
||||||
|
|
||||||
|
## 1. Τι είναι τα cookies
|
||||||
|
|
||||||
|
Τα cookies είναι μικρά αρχεία κειμένου που αποθηκεύονται στη συσκευή σας όταν επισκέπτεστε έναν ιστότοπο. Χρησιμοποιούνται για την ορθή λειτουργία του ιστότοπου, την αποθήκευση προτιμήσεων, τη συλλογή στατιστικών στοιχείων και, όπου επιτρέπεται, την προβολή ή μέτρηση διαφημίσεων.
|
||||||
|
|
||||||
|
Εκτός από cookies, ενδέχεται να χρησιμοποιούμε και παρόμοιες τεχνολογίες, όπως pixels και tags.
|
||||||
|
|
||||||
|
## 2. Ποια cookies χρησιμοποιούμε
|
||||||
|
|
||||||
|
Η 3DEALER χρησιμοποιεί διαφορετικές κατηγορίες cookies, ανάλογα με τον σκοπό τους.
|
||||||
|
|
||||||
|
### Απαραίτητα cookies
|
||||||
|
|
||||||
|
Τα απαραίτητα cookies είναι αυτά που απαιτούνται για τη σωστή και ασφαλή λειτουργία του ηλεκτρονικού καταστήματος.
|
||||||
|
|
||||||
|
Μπορούν να χρησιμοποιούνται, μεταξύ άλλων, για:
|
||||||
|
|
||||||
|
* τη λειτουργία του καλαθιού αγορών,
|
||||||
|
* τη διατήρηση της συνεδρίας σας,
|
||||||
|
* τη σύνδεση στον λογαριασμό σας,
|
||||||
|
* την ολοκλήρωση του checkout,
|
||||||
|
* την ασφάλεια του ιστοτόπου,
|
||||||
|
* την αποθήκευση των επιλογών σας σχετικά με τα cookies.
|
||||||
|
|
||||||
|
Τα συγκεκριμένα cookies δεν μπορούν να απενεργοποιηθούν μέσω του μηχανισμού συγκατάθεσης, καθώς χωρίς αυτά ορισμένες βασικές λειτουργίες του ηλεκτρονικού καταστήματος δεν θα είναι διαθέσιμες.
|
||||||
|
|
||||||
|
### Cookies λειτουργικότητας
|
||||||
|
|
||||||
|
Τα cookies λειτουργικότητας χρησιμοποιούνται για την αποθήκευση επιλογών και προτιμήσεων που βελτιώνουν την εμπειρία χρήσης του ηλεκτρονικού καταστήματος.
|
||||||
|
|
||||||
|
**@TODO: Να καταγραφούν τα συγκεκριμένα cookies λειτουργικότητας που χρησιμοποιεί το Boboko/3DEALER.**
|
||||||
|
|
||||||
|
### Cookies Analytics
|
||||||
|
|
||||||
|
Τα cookies analytics χρησιμοποιούνται για να κατανοούμε τον τρόπο με τον οποίο οι επισκέπτες χρησιμοποιούν το ηλεκτρονικό κατάστημα.
|
||||||
|
|
||||||
|
Η 3DEALER χρησιμοποιεί υπηρεσίες όπως το **Google Analytics** και ενδέχεται να χρησιμοποιεί το **Google Tag Manager** για τη διαχείριση των σχετικών tags.
|
||||||
|
|
||||||
|
Οι πληροφορίες που συλλέγονται μπορούν να περιλαμβάνουν στοιχεία όπως:
|
||||||
|
|
||||||
|
* ποιες σελίδες επισκέπτεστε,
|
||||||
|
* πόσο χρόνο παραμένετε στον ιστότοπο,
|
||||||
|
* από ποια σελίδα προέρχεστε,
|
||||||
|
* τη συσκευή και το πρόγραμμα περιήγησης που χρησιμοποιείτε,
|
||||||
|
* γενικές πληροφορίες σχετικά με την αλληλεπίδρασή σας με τον ιστότοπο.
|
||||||
|
|
||||||
|
Τα συγκεκριμένα cookies ενεργοποιούνται μόνο σύμφωνα με τις επιλογές συγκατάθεσής σας, όπου απαιτείται από την ισχύουσα νομοθεσία.
|
||||||
|
|
||||||
|
### Cookies διαφήμισης και marketing
|
||||||
|
|
||||||
|
Η 3DEALER χρησιμοποιεί τεχνολογίες διαφημιστικής μέτρησης και marketing, όπως:
|
||||||
|
|
||||||
|
* **Meta Pixel**
|
||||||
|
* **TikTok Pixel**
|
||||||
|
|
||||||
|
Οι τεχνολογίες αυτές μπορούν να χρησιμοποιούνται για τη μέτρηση της αποτελεσματικότητας των διαφημιστικών ενεργειών, την κατανόηση των αλληλεπιδράσεων με τις διαφημίσεις και, όπου υποστηρίζεται και επιτρέπεται, την προβολή πιο σχετικών διαφημίσεων.
|
||||||
|
|
||||||
|
Τα σχετικά cookies και pixels ενεργοποιούνται μόνο σύμφωνα με τις επιλογές συγκατάθεσής σας, όπου απαιτείται.
|
||||||
|
|
||||||
|
**@TODO: Να επιβεβαιωθούν τα ακριβή Meta/TikTok cookies και events που χρησιμοποιούνται στο production.**
|
||||||
|
|
||||||
|
## 3. Πίνακας cookies
|
||||||
|
|
||||||
|
Ο παρακάτω πίνακας θα πρέπει να ενημερωθεί με βάση τα πραγματικά cookies που χρησιμοποιούνται στο production περιβάλλον.
|
||||||
|
|
||||||
|
| Cookie / Τεχνολογία | Πάροχος | Κατηγορία | Σκοπός | Διάρκεια |
|
||||||
|
| ------------------- | ---------------- | ---------- | ---------------------------------------------- | -------- |
|
||||||
|
| @TODO | Boboko / 3DEALER | Απαραίτητο | Λειτουργία καταστήματος | @TODO |
|
||||||
|
| @TODO | Boboko / 3DEALER | Απαραίτητο | Καλάθι / checkout | @TODO |
|
||||||
|
| @TODO | Google | Analytics | Στατιστικά χρήσης | @TODO |
|
||||||
|
| @TODO | Meta | Marketing | Διαφημιστική μέτρηση | @TODO |
|
||||||
|
| @TODO | TikTok | Marketing | Διαφημιστική μέτρηση | @TODO |
|
||||||
|
| @TODO | hCaptcha | Ασφάλεια | Προστασία από αυτοματοποιημένη/κακόβουλη χρήση | @TODO |
|
||||||
|
|
||||||
|
**@TODO: Ο πίνακας πρέπει να συμπληρωθεί μετά από έλεγχο του production site, ιδανικά με cookie scan.**
|
||||||
|
|
||||||
|
## 4. Συγκατάθεση για τη χρήση cookies
|
||||||
|
|
||||||
|
Κατά την πρώτη επίσκεψή σας στο ηλεκτρονικό κατάστημα, εμφανίζεται μηχανισμός διαχείρισης συγκατάθεσης cookies, μέσω του οποίου μπορείτε να επιλέξετε ποιες κατηγορίες μη απαραίτητων cookies επιτρέπετε.
|
||||||
|
|
||||||
|
Μπορείτε να:
|
||||||
|
|
||||||
|
* αποδεχτείτε όλα τα cookies,
|
||||||
|
* απορρίψετε τα μη απαραίτητα cookies,
|
||||||
|
* επιλέξετε συγκεκριμένες κατηγορίες cookies.
|
||||||
|
|
||||||
|
Τα απαραίτητα cookies παραμένουν ενεργά, καθώς είναι αναγκαία για τη λειτουργία του ηλεκτρονικού καταστήματος.
|
||||||
|
|
||||||
|
Η επιλογή σας αποθηκεύεται και εφαρμόζεται στις επόμενες επισκέψεις σας.
|
||||||
|
|
||||||
|
## 5. Ανάκληση ή αλλαγή συγκατάθεσης
|
||||||
|
|
||||||
|
Μπορείτε να αλλάξετε ή να ανακαλέσετε τη συγκατάθεσή σας για τη χρήση μη απαραίτητων cookies οποιαδήποτε στιγμή.
|
||||||
|
|
||||||
|
**@TODO: Να προστεθεί ο τρόπος με τον οποίο ανοίγει ξανά το cookie preference centre του Boboko, π.χ. μέσω συνδέσμου «Ρυθμίσεις Cookies» στο footer.**
|
||||||
|
|
||||||
|
Η ανάκληση της συγκατάθεσης δεν επηρεάζει τη νομιμότητα της επεξεργασίας που πραγματοποιήθηκε πριν από την ανάκλησή της.
|
||||||
|
|
||||||
|
## 6. Cookies τρίτων
|
||||||
|
|
||||||
|
Ορισμένες από τις υπηρεσίες που χρησιμοποιούμε παρέχονται από τρίτους, όπως η Google, η Meta, η TikTok και η hCaptcha.
|
||||||
|
|
||||||
|
Οι τρίτοι αυτοί πάροχοι ενδέχεται να επεξεργάζονται πληροφορίες που συλλέγονται μέσω cookies ή παρόμοιων τεχνολογιών σύμφωνα με τις δικές τους πολιτικές και τους δικούς τους όρους.
|
||||||
|
|
||||||
|
Η χρήση υπηρεσιών τρίτων μπορεί επίσης να συνεπάγεται διαβίβαση δεδομένων εκτός του Ευρωπαϊκού Οικονομικού Χώρου. Όπου απαιτείται, εφαρμόζονται οι προβλεπόμενες από τη νομοθεσία εγγυήσεις για τη συγκεκριμένη διαβίβαση.
|
||||||
|
|
||||||
|
## 7. Cookies και προσωπικά δεδομένα
|
||||||
|
|
||||||
|
Ορισμένα cookies ή παρόμοιες τεχνολογίες μπορεί να οδηγήσουν σε επεξεργασία πληροφοριών που θεωρούνται προσωπικά δεδομένα.
|
||||||
|
|
||||||
|
Για περισσότερες πληροφορίες σχετικά με τον τρόπο με τον οποίο η 3DEALER συλλέγει και επεξεργάζεται προσωπικά δεδομένα, δείτε την **Πολιτική Απορρήτου**.
|
||||||
|
|
||||||
|
## 8. Ρυθμίσεις του browser
|
||||||
|
|
||||||
|
Μπορείτε επίσης να περιορίσετε ή να διαγράψετε cookies μέσω των ρυθμίσεων του προγράμματος περιήγησής σας.
|
||||||
|
|
||||||
|
Ωστόσο, η απενεργοποίηση ορισμένων cookies ενδέχεται να επηρεάσει τη λειτουργία του ηλεκτρονικού καταστήματος ή να εμποδίσει τη σωστή λειτουργία ορισμένων υπηρεσιών.
|
||||||
|
|
||||||
|
## 9. Τροποποιήσεις της Πολιτικής Cookies
|
||||||
|
|
||||||
|
Η παρούσα Πολιτική Cookies μπορεί να τροποποιείται όταν αλλάζουν οι τεχνολογίες που χρησιμοποιούμε, οι υπηρεσίες του ηλεκτρονικού καταστήματος ή η σχετική νομοθεσία.
|
||||||
|
|
||||||
|
Η πιο πρόσφατη έκδοση θα είναι πάντοτε διαθέσιμη στην ιστοσελίδα της 3DEALER.
|
||||||
|
|
||||||
|
**Τελευταία ενημέρωση:** @TODO
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
name: "Αρχική"
|
||||||
|
slug: "home"
|
||||||
|
|
||||||
|
meta_title: "3dealer — Ό,τι φαντάζεσαι, τυπωμένο σε 3D"
|
||||||
|
meta_description: "Gaming φιγούρες, κρανία, κλειδοθήκες και ό,τι πιο τρελό σου περνάει απ' το μυαλό. Σχεδιασμένα και τυπωμένα σε 3D, ένα προς ένα."
|
||||||
|
og_image: ""
|
||||||
|
|
||||||
|
trivia_image: "3dealer-clickers-square.jpeg"
|
||||||
|
trivia_body: "Gaming φιγούρες, κρανία, κλειδοθήκες, dark humor και ό,τι πιο τρελό σου περνάει απ' το μυαλό, όλα σχεδιασμένα και τυπωμένα εδώ, στην Ελλάδα."
|
||||||
|
trivia_body_image: "3d-printed-hands-heart-1200.png"
|
||||||
|
classics_title: "Θρυλικά & ασυναγώνιστα"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Content
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
---
|
||||||
|
name: "Πολιτική Απορρήτου"
|
||||||
|
slug: "privacy-policy"
|
||||||
|
|
||||||
|
meta_title: ""
|
||||||
|
meta_description: ""
|
||||||
|
og_image: ""
|
||||||
|
noindex: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
Η 3DEALER («3DEALER», «εμείς», «μας») σέβεται την ιδιωτικότητα των επισκεπτών και των πελατών της και προστατεύει τα προσωπικά τους δεδομένα σύμφωνα με την ισχύουσα νομοθεσία, συμπεριλαμβανομένου του Γενικού Κανονισμού Προστασίας Δεδομένων (ΕΕ) 2016/679 («GDPR») και της σχετικής ελληνικής νομοθεσίας.
|
||||||
|
|
||||||
|
Η παρούσα Πολιτική Απορρήτου εξηγεί ποια προσωπικά δεδομένα συλλέγουμε, για ποιους σκοπούς τα χρησιμοποιούμε, με ποιους μπορεί να τα μοιραζόμαστε και ποια δικαιώματα έχετε.
|
||||||
|
|
||||||
|
## 1. Υπεύθυνος επεξεργασίας
|
||||||
|
|
||||||
|
Υπεύθυνος επεξεργασίας των προσωπικών δεδομένων που συλλέγονται μέσω του ηλεκτρονικού καταστήματος είναι:
|
||||||
|
|
||||||
|
**3DEALER**
|
||||||
|
Πάρου 31, Κυψέλη, ΤΚ 11255, Αθήνα
|
||||||
|
ΑΦΜ: @TODO
|
||||||
|
ΓΕΜΗ: @TODO
|
||||||
|
Email: [print@3dealer.gr](mailto:print@3dealer.gr)
|
||||||
|
Τηλέφωνο: 6976 443140
|
||||||
|
|
||||||
|
Η 3DEALER καθορίζει τους σκοπούς και τα μέσα επεξεργασίας των προσωπικών δεδομένων των πελατών και χρηστών του ηλεκτρονικού καταστήματος.
|
||||||
|
|
||||||
|
## 2. Ποια δεδομένα συλλέγουμε
|
||||||
|
|
||||||
|
Ανάλογα με τον τρόπο με τον οποίο χρησιμοποιείτε το ηλεκτρονικό κατάστημα, ενδέχεται να συλλέγουμε:
|
||||||
|
|
||||||
|
* ονοματεπώνυμο,
|
||||||
|
* διεύθυνση email,
|
||||||
|
* αριθμό τηλεφώνου,
|
||||||
|
* διεύθυνση αποστολής και χρέωσης,
|
||||||
|
* στοιχεία παραγγελίας και προϊόντων,
|
||||||
|
* στοιχεία που σχετίζονται με την πληρωμή,
|
||||||
|
* στοιχεία επικοινωνίας και το περιεχόμενο μηνυμάτων που μας αποστέλλετε,
|
||||||
|
* στοιχεία λογαριασμού χρήστη,
|
||||||
|
* κριτικές που επιλέγετε να δημοσιεύσετε,
|
||||||
|
* τεχνικά δεδομένα σχετικά με τη χρήση της ιστοσελίδας,
|
||||||
|
* δεδομένα που συλλέγονται μέσω cookies και παρόμοιων τεχνολογιών, σύμφωνα με την Πολιτική Cookies.
|
||||||
|
|
||||||
|
Δεν αποθηκεύουμε τα πλήρη στοιχεία της πιστωτικής ή χρεωστικής σας κάρτας στους διακομιστές της 3DEALER. Οι ηλεκτρονικές πληρωμές πραγματοποιούνται μέσω εξωτερικών παρόχων πληρωμών.
|
||||||
|
|
||||||
|
## 3. Δημιουργία λογαριασμού
|
||||||
|
|
||||||
|
Μπορείτε να δημιουργήσετε λογαριασμό στο ηλεκτρονικό κατάστημα για να διαχειρίζεστε τις παραγγελίες και τα στοιχεία σας.
|
||||||
|
|
||||||
|
Για τη δημιουργία και λειτουργία του λογαριασμού ενδέχεται να επεξεργαζόμαστε στοιχεία όπως το όνομα, email και στοιχεία σύνδεσης.
|
||||||
|
|
||||||
|
Η επεξεργασία αυτή είναι απαραίτητη για την παροχή της υπηρεσίας λογαριασμού.
|
||||||
|
|
||||||
|
Το ηλεκτρονικό κατάστημα υποστηρίζει επίσης guest checkout. Στην περίπτωση guest checkout δεν δημιουργείται λογαριασμός χρήστη. Τα στοιχεία που παρέχετε χρησιμοποιούνται αποκλειστικά στον βαθμό που είναι απαραίτητος για την επεξεργασία και ολοκλήρωση της παραγγελίας και για τις σχετικές νομικές υποχρεώσεις.
|
||||||
|
|
||||||
|
## 4. Παραγγελίες και αγορές
|
||||||
|
|
||||||
|
Όταν πραγματοποιείτε παραγγελία, επεξεργαζόμαστε τα απαραίτητα στοιχεία για:
|
||||||
|
|
||||||
|
* την καταχώριση και εκτέλεση της παραγγελίας,
|
||||||
|
* την επεξεργασία της πληρωμής,
|
||||||
|
* την αποστολή και παράδοση των προϊόντων,
|
||||||
|
* την επικοινωνία μαζί σας σχετικά με την παραγγελία,
|
||||||
|
* την έκδοση των απαραίτητων παραστατικών,
|
||||||
|
* την τήρηση των φορολογικών και λογιστικών υποχρεώσεών μας,
|
||||||
|
* την αντιμετώπιση τυχόν επιστροφών, ακυρώσεων ή παραπόνων.
|
||||||
|
|
||||||
|
Η νομική βάση για τις παραπάνω επεξεργασίες είναι κατά περίπτωση η εκτέλεση της σύμβασης, η συμμόρφωση με νομική υποχρέωση και το έννομο συμφέρον της 3DEALER για την ορθή λειτουργία και προστασία της επιχείρησής της.
|
||||||
|
|
||||||
|
## 5. Επικοινωνία
|
||||||
|
|
||||||
|
Εάν επικοινωνήσετε μαζί μας μέσω email, τηλεφώνου ή της φόρμας επικοινωνίας, επεξεργαζόμαστε τα στοιχεία που μας παρέχετε προκειμένου να απαντήσουμε στο αίτημά σας.
|
||||||
|
|
||||||
|
Η νομική βάση είναι, ανάλογα με την περίπτωση, η λήψη μέτρων κατόπιν αιτήματός σας πριν από τη σύναψη σύμβασης, η εκτέλεση σύμβασης ή το έννομο συμφέρον μας για την εξυπηρέτηση των χρηστών και πελατών μας.
|
||||||
|
|
||||||
|
## 6. Newsletter και εμπορική επικοινωνία
|
||||||
|
|
||||||
|
Εφόσον επιλέξετε να εγγραφείτε στο newsletter της 3DEALER, χρησιμοποιούμε τη διεύθυνση email σας για την αποστολή ενημερώσεων, προσφορών και άλλου εμπορικού περιεχομένου.
|
||||||
|
|
||||||
|
Η εγγραφή στο newsletter πραγματοποιείται με τη συγκατάθεσή σας.
|
||||||
|
|
||||||
|
Μπορείτε να ανακαλέσετε τη συγκατάθεσή σας οποιαδήποτε στιγμή, χρησιμοποιώντας τον σύνδεσμο απεγγραφής που περιλαμβάνεται στα emails ή επικοινωνώντας μαζί μας στο [print@3dealer.gr](mailto:print@3dealer.gr).
|
||||||
|
|
||||||
|
Η ανάκληση της συγκατάθεσης δεν επηρεάζει τη νομιμότητα της επεξεργασίας που πραγματοποιήθηκε πριν από αυτήν.
|
||||||
|
|
||||||
|
## 7. Κριτικές προϊόντων
|
||||||
|
|
||||||
|
Εφόσον επιλέξετε να υποβάλετε κριτική για ένα προϊόν, ενδέχεται να δημοσιεύσουμε το όνομα ή άλλο στοιχείο που επιλέξατε να εμφανίζεται μαζί με την κριτική.
|
||||||
|
|
||||||
|
Παρακαλούμε να μην συμπεριλαμβάνετε προσωπικά δεδομένα δικά σας ή τρίτων στο περιεχόμενο μιας δημόσιας κριτικής, εφόσον δεν είναι απαραίτητο.
|
||||||
|
|
||||||
|
## 8. Πάροχοι πληρωμών
|
||||||
|
|
||||||
|
Για την ολοκλήρωση των πληρωμών ενδέχεται να χρησιμοποιούμε τρίτους παρόχους, όπως Stripe και PayPal, καθώς και τραπεζικά ιδρύματα για πληρωμές μέσω τραπεζικής κατάθεσης ή IRIS.
|
||||||
|
|
||||||
|
Τα δεδομένα που απαιτούνται για την ολοκλήρωση μιας πληρωμής ενδέχεται να διαβιβάζονται στον αντίστοιχο πάροχο πληρωμών.
|
||||||
|
|
||||||
|
**@TODO: Να επιβεβαιωθούν οι ακριβείς πάροχοι πληρωμών/τράπεζες που θα χρησιμοποιούνται στο production και να προστεθούν στην τελική έκδοση.**
|
||||||
|
|
||||||
|
Οι πάροχοι αυτοί επεξεργάζονται τα δεδομένα σύμφωνα με τις δικές τους πολιτικές απορρήτου και τους ισχύοντες όρους τους.
|
||||||
|
|
||||||
|
## 9. Εταιρείες μεταφοράς και παράδοσης
|
||||||
|
|
||||||
|
Για την αποστολή των παραγγελιών σας χρησιμοποιούμε υπηρεσίες μεταφοράς και παράδοσης, μεταξύ άλλων από την ELTA Courier και την BOX NOW.
|
||||||
|
|
||||||
|
Για την παράδοση μιας παραγγελίας ενδέχεται να διαβιβάζονται στον αντίστοιχο πάροχο στοιχεία όπως ονοματεπώνυμο, διεύθυνση, τηλέφωνο και στοιχεία που είναι απαραίτητα για την παράδοση.
|
||||||
|
|
||||||
|
## 10. Λογιστικές και φορολογικές υπηρεσίες
|
||||||
|
|
||||||
|
Τα στοιχεία των παραγγελιών και τα απαραίτητα στοιχεία των πελατών ενδέχεται να διαβιβάζονται στο σύστημα Epsilon που χρησιμοποιείται από την 3DEALER για την έκδοση και διαχείριση παραστατικών και για την εκπλήρωση των φορολογικών και λογιστικών υποχρεώσεών της.
|
||||||
|
|
||||||
|
## 11. Ασφάλεια και προστασία από κατάχρηση
|
||||||
|
|
||||||
|
Χρησιμοποιούμε τεχνικά και οργανωτικά μέτρα για την προστασία των προσωπικών δεδομένων από απώλεια, μη εξουσιοδοτημένη πρόσβαση, αλλοίωση ή παράνομη επεξεργασία.
|
||||||
|
|
||||||
|
Για την προστασία της ιστοσελίδας από κακόβουλη ή αυτοματοποιημένη χρήση ενδέχεται να χρησιμοποιούμε την υπηρεσία hCaptcha. Η χρήση της υπηρεσίας μπορεί να συνεπάγεται επεξεργασία τεχνικών δεδομένων σύμφωνα με την πολιτική απορρήτου του αντίστοιχου παρόχου.
|
||||||
|
|
||||||
|
## 12. Analytics και διαφημιστικές υπηρεσίες
|
||||||
|
|
||||||
|
Η 3DEALER χρησιμοποιεί υπηρεσίες ανάλυσης επισκεψιμότητας και διαφημιστικής μέτρησης, όπως:
|
||||||
|
|
||||||
|
* Google Analytics
|
||||||
|
* Google Tag Manager
|
||||||
|
* Meta Pixel
|
||||||
|
* TikTok Pixel
|
||||||
|
|
||||||
|
Οι συγκεκριμένες τεχνολογίες ενδέχεται να χρησιμοποιούν cookies ή παρόμοιες τεχνολογίες για τη συλλογή πληροφοριών σχετικά με τη χρήση της ιστοσελίδας και την αποτελεσματικότητα των διαφημιστικών ενεργειών.
|
||||||
|
|
||||||
|
Οι μη απολύτως απαραίτητες τεχνολογίες ενεργοποιούνται μόνο σύμφωνα με τις επιλογές συγκατάθεσης που πραγματοποιείτε μέσω του μηχανισμού διαχείρισης cookies.
|
||||||
|
|
||||||
|
Περισσότερες πληροφορίες παρέχονται στην Πολιτική Cookies.
|
||||||
|
|
||||||
|
**@TODO: Να επιβεβαιωθούν τα ακριβή εργαλεία, οι λογαριασμοί και οι υπηρεσίες που θα είναι ενεργά στο production.**
|
||||||
|
|
||||||
|
## 13. Ποιοι μπορεί να έχουν πρόσβαση στα δεδομένα
|
||||||
|
|
||||||
|
Η 3DEALER δεν πωλεί ούτε εκμισθώνει τα προσωπικά σας δεδομένα.
|
||||||
|
|
||||||
|
Πρόσβαση στα προσωπικά δεδομένα μπορεί να έχουν, στον βαθμό που είναι απαραίτητο για την παροχή των αντίστοιχων υπηρεσιών:
|
||||||
|
|
||||||
|
* πάροχοι πληρωμών,
|
||||||
|
* εταιρείες courier,
|
||||||
|
* πάροχοι υπηρεσιών φιλοξενίας και τεχνικής υποστήριξης,
|
||||||
|
* πάροχοι υπηρεσιών email/newsletter,
|
||||||
|
* πάροχοι analytics και διαφημιστικών υπηρεσιών,
|
||||||
|
* λογιστικές και φορολογικές υπηρεσίες,
|
||||||
|
* δημόσιες αρχές και φορείς, όταν αυτό απαιτείται από τον νόμο.
|
||||||
|
|
||||||
|
Οι τρίτοι πάροχοι που επεξεργάζονται δεδομένα για λογαριασμό της 3DEALER χρησιμοποιούνται σύμφωνα με τις απαιτήσεις της ισχύουσας νομοθεσίας περί προστασίας προσωπικών δεδομένων.
|
||||||
|
|
||||||
|
## 14. Διαβιβάσεις εκτός Ευρωπαϊκού Οικονομικού Χώρου
|
||||||
|
|
||||||
|
Ορισμένοι από τους παρόχους που χρησιμοποιούμε ενδέχεται να επεξεργάζονται δεδομένα εκτός του Ευρωπαϊκού Οικονομικού Χώρου.
|
||||||
|
|
||||||
|
Σε αυτές τις περιπτώσεις, η 3DEALER λαμβάνει τα κατάλληλα μέτρα ώστε η διαβίβαση να πραγματοποιείται σύμφωνα με τις απαιτήσεις του GDPR και να παρέχεται το απαιτούμενο επίπεδο προστασίας των προσωπικών δεδομένων.
|
||||||
|
|
||||||
|
**@TODO: Να ελεγχθούν οι ακριβείς χώρες επεξεργασίας και οι μηχανισμοί διαβίβασης για Stripe, PayPal, Google, Meta, TikTok, hCaptcha και τον πάροχο newsletter.**
|
||||||
|
|
||||||
|
## 15. Χρόνος διατήρησης
|
||||||
|
|
||||||
|
Διατηρούμε τα προσωπικά δεδομένα μόνο για όσο διάστημα είναι απαραίτητο για τον σκοπό για τον οποίο συλλέχθηκαν.
|
||||||
|
|
||||||
|
Τα δεδομένα που σχετίζονται με παραγγελίες και συναλλαγές διατηρούνται για όσο απαιτείται από τη φορολογική, λογιστική και εμπορική νομοθεσία.
|
||||||
|
|
||||||
|
Τα δεδομένα λογαριασμού διατηρούνται για όσο ο λογαριασμός παραμένει ενεργός, εκτός εάν υπάρχει νόμιμος λόγος για μεγαλύτερη διατήρηση.
|
||||||
|
|
||||||
|
Τα δεδομένα που χρησιμοποιούνται για newsletter διατηρούνται μέχρι την ανάκληση της συγκατάθεσης ή την απεγγραφή σας, εκτός εάν υπάρχει άλλος νόμιμος λόγος διατήρησης.
|
||||||
|
|
||||||
|
Τα δεδομένα επικοινωνίας διατηρούνται για όσο είναι απαραίτητο για την εξυπηρέτηση του αιτήματος και, όπου απαιτείται, για την προστασία των νόμιμων συμφερόντων μας.
|
||||||
|
|
||||||
|
## 16. Τα δικαιώματά σας
|
||||||
|
|
||||||
|
Σύμφωνα με τον GDPR, έχετε, υπό τις προϋποθέσεις που προβλέπει η νομοθεσία, δικαίωμα:
|
||||||
|
|
||||||
|
* πρόσβασης στα προσωπικά σας δεδομένα,
|
||||||
|
* διόρθωσης ανακριβών ή ελλιπών δεδομένων,
|
||||||
|
* διαγραφής των δεδομένων σας,
|
||||||
|
* περιορισμού της επεξεργασίας,
|
||||||
|
* φορητότητας των δεδομένων,
|
||||||
|
* εναντίωσης σε συγκεκριμένες μορφές επεξεργασίας,
|
||||||
|
* ανάκλησης της συγκατάθεσής σας, όταν η επεξεργασία βασίζεται σε συγκατάθεση.
|
||||||
|
|
||||||
|
Η άσκηση ενός δικαιώματος δεν σημαίνει ότι αυτό μπορεί να εφαρμοστεί σε κάθε περίπτωση. Για παράδειγμα, ενδέχεται να είμαστε υποχρεωμένοι να διατηρήσουμε ορισμένα δεδομένα λόγω φορολογικής ή άλλης νόμιμης υποχρέωσης.
|
||||||
|
|
||||||
|
Για την άσκηση των δικαιωμάτων σας μπορείτε να επικοινωνήσετε μαζί μας:
|
||||||
|
|
||||||
|
**Email:** [print@3dealer.gr](mailto:print@3dealer.gr)
|
||||||
|
**Τηλέφωνο:** 6976 443140
|
||||||
|
|
||||||
|
Θα απαντήσουμε στο αίτημά σας χωρίς αδικαιολόγητη καθυστέρηση και, κατά κανόνα, εντός ενός (1) μήνα από την παραλαβή του.
|
||||||
|
|
||||||
|
## 17. Δικαίωμα υποβολής καταγγελίας
|
||||||
|
|
||||||
|
Εάν θεωρείτε ότι η επεξεργασία των προσωπικών σας δεδομένων παραβιάζει την ισχύουσα νομοθεσία, έχετε δικαίωμα να υποβάλετε καταγγελία στην Αρχή Προστασίας Δεδομένων Προσωπικού Χαρακτήρα.
|
||||||
|
|
||||||
|
## 18. Αλλαγές στην Πολιτική Απορρήτου
|
||||||
|
|
||||||
|
Η παρούσα Πολιτική Απορρήτου μπορεί να τροποποιείται όταν απαιτείται, για παράδειγμα λόγω αλλαγών στη νομοθεσία, στις υπηρεσίες που χρησιμοποιούμε ή στον τρόπο λειτουργίας του ηλεκτρονικού καταστήματος.
|
||||||
|
|
||||||
|
Η πιο πρόσφατη έκδοση θα είναι πάντοτε διαθέσιμη στην ιστοσελίδα μας.
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
name: "Αποστολές & Επιστροφές"
|
||||||
|
slug: "shipping-returns"
|
||||||
|
|
||||||
|
meta_title: ""
|
||||||
|
meta_description: ""
|
||||||
|
og_image: ""
|
||||||
|
noindex: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Προετοιμασία παραγγελιών
|
||||||
|
|
||||||
|
Όλα τα προϊόντα της 3DEALER εκτυπώνονται και προετοιμάζονται κατά παραγγελία.
|
||||||
|
|
||||||
|
Ο συνήθης χρόνος προετοιμασίας μιας παραγγελίας είναι **2–7 εργάσιμες ημέρες**.
|
||||||
|
|
||||||
|
Ο χρόνος προετοιμασίας δεν περιλαμβάνει τον χρόνο μεταφοράς από την εταιρεία courier.
|
||||||
|
|
||||||
|
Σε περιόδους αυξημένης ζήτησης, ενδέχεται να υπάρξουν καθυστερήσεις. Σε περίπτωση σημαντικής καθυστέρησης, η 3DEALER θα ενημερώσει τον πελάτη.
|
||||||
|
|
||||||
|
## 2. Αποστολές
|
||||||
|
|
||||||
|
Οι παραγγελίες αποστέλλονται μέσω:
|
||||||
|
|
||||||
|
* ELTA Courier
|
||||||
|
* BOX NOW
|
||||||
|
|
||||||
|
Αποστολές πραγματοποιούνται στις περιοχές που υποστηρίζονται από το ηλεκτρονικό κατάστημα:
|
||||||
|
|
||||||
|
* Ελλάδα
|
||||||
|
* Κύπρος
|
||||||
|
|
||||||
|
Το διαθέσιμο κόστος και οι επιλογές αποστολής εμφανίζονται κατά την ολοκλήρωση της παραγγελίας.
|
||||||
|
|
||||||
|
**Κόστος αποστολής:** @TODO — οι τιμές αποστολής ορίζονται δυναμικά από τις ρυθμίσεις του Καταστήματος.
|
||||||
|
|
||||||
|
Δεν παρέχεται δωρεάν αποστολή.
|
||||||
|
|
||||||
|
Δεν υποστηρίζεται πληρωμή με αντικαταβολή.
|
||||||
|
|
||||||
|
## 3. Χρόνος παράδοσης
|
||||||
|
|
||||||
|
Ο χρόνος παράδοσης εξαρτάται από την εταιρεία courier και τον προορισμό.
|
||||||
|
|
||||||
|
Η 3DEALER δεν ευθύνεται για καθυστερήσεις που οφείλονται αποκλειστικά στην εταιρεία μεταφοράς, σε ακραία καιρικά φαινόμενα, απεργίες, προβλήματα στο δίκτυο μεταφορών ή άλλες περιστάσεις που βρίσκονται εκτός του εύλογου ελέγχου της.
|
||||||
|
|
||||||
|
Σε περίπτωση καθυστέρησης, μπορείτε να επικοινωνήσετε μαζί μας στο [print@3dealer.gr](mailto:print@3dealer.gr).
|
||||||
|
|
||||||
|
## 4. Παραλαβή παραγγελίας
|
||||||
|
|
||||||
|
Ο πελάτης είναι υπεύθυνος για την ορθότητα των στοιχείων παράδοσης που καταχωρίζει κατά την παραγγελία.
|
||||||
|
|
||||||
|
Σε περίπτωση λανθασμένης ή ελλιπούς διεύθυνσης, η παράδοση ενδέχεται να καθυστερήσει ή να απαιτηθεί νέα αποστολή. Τυχόν πρόσθετα έξοδα που προκύπτουν από λανθασμένα στοιχεία παράδοσης ενδέχεται να επιβαρύνουν τον πελάτη.
|
||||||
|
|
||||||
|
## 5. Προϊόν που παραδόθηκε κατεστραμμένο
|
||||||
|
|
||||||
|
Σε περίπτωση που το προϊόν παραδοθεί εμφανώς κατεστραμμένο, παρακαλούμε να επικοινωνήσετε μαζί μας το συντομότερο δυνατό στο [print@3dealer.gr](mailto:print@3dealer.gr) και να μας αποστείλετε φωτογραφίες του προϊόντος και της συσκευασίας.
|
||||||
|
|
||||||
|
Η 3DEALER θα εξετάσει το περιστατικό και, εφόσον διαπιστωθεί ζημιά που προέκυψε κατά τη μεταφορά ή άλλη έλλειψη συμμόρφωσης, θα προχωρήσει στην κατάλληλη λύση σύμφωνα με την ισχύουσα νομοθεσία.
|
||||||
|
|
||||||
|
## 6. Δικαίωμα υπαναχώρησης
|
||||||
|
|
||||||
|
Για τις αγορές που εμπίπτουν στο πεδίο εφαρμογής του δικαιώματος υπαναχώρησης, ο καταναλωτής μπορεί να υπαναχωρήσει από τη σύμβαση εντός δεκατεσσάρων (14) ημερολογιακών ημερών από την ημέρα παραλαβής του προϊόντος.
|
||||||
|
|
||||||
|
Για την άσκηση του δικαιώματος υπαναχώρησης, ο πελάτης πρέπει να ενημερώσει την 3DEALER με σαφή δήλωση στο [print@3dealer.gr](mailto:print@3dealer.gr).
|
||||||
|
|
||||||
|
Το προϊόν πρέπει να επιστραφεί χωρίς αδικαιολόγητη καθυστέρηση και, σε κάθε περίπτωση, εντός δεκατεσσάρων (14) ημερών από την ημέρα κατά την οποία ο πελάτης ενημέρωσε την 3DEALER για την απόφασή του να υπαναχωρήσει.
|
||||||
|
|
||||||
|
Ο πελάτης φέρει το άμεσο κόστος επιστροφής του προϊόντος, εκτός εάν έχει συμφωνηθεί διαφορετικά ή η 3DEALER δεν έχει ενημερώσει προηγουμένως σχετικά.
|
||||||
|
|
||||||
|
Ο πελάτης ευθύνεται για τυχόν μείωση της αξίας του προϊόντος που προκύπτει από χειρισμό πέρα από αυτόν που είναι απαραίτητος για τη διαπίστωση της φύσης, των χαρακτηριστικών και της λειτουργίας του.
|
||||||
|
|
||||||
|
## 7. Εξαιρέσεις από το δικαίωμα υπαναχώρησης
|
||||||
|
|
||||||
|
Το δικαίωμα υπαναχώρησης δεν εφαρμόζεται στις περιπτώσεις που εξαιρούνται από την ισχύουσα νομοθεσία.
|
||||||
|
|
||||||
|
Ειδικότερα, μπορεί να μην εφαρμόζεται σε προϊόντα που κατασκευάζονται σύμφωνα με τις ειδικές προδιαγραφές του πελάτη ή είναι σαφώς εξατομικευμένα.
|
||||||
|
|
||||||
|
**@TODO: Να επιβεβαιωθεί ποια προϊόντα της 3DEALER θεωρούνται εξατομικευμένα/custom και εάν υπάρχουν προϊόντα που δεν υπόκεινται στο δικαίωμα υπαναχώρησης.**
|
||||||
|
|
||||||
|
Το γεγονός ότι ένα προϊόν παράγεται μετά την υποβολή της παραγγελίας δεν αποτελεί από μόνο του εξαίρεση από το δικαίωμα υπαναχώρησης.
|
||||||
|
|
||||||
|
## 8. Επιστροφή χρημάτων
|
||||||
|
|
||||||
|
Σε περίπτωση έγκυρης υπαναχώρησης, η 3DEALER επιστρέφει τα χρήματα που έλαβε από τον πελάτη για την αγορά, συμπεριλαμβανομένων, όπου απαιτείται από τη νομοθεσία, των βασικών εξόδων παράδοσης.
|
||||||
|
|
||||||
|
Η επιστροφή χρημάτων πραγματοποιείται με το ίδιο μέσο πληρωμής που χρησιμοποιήθηκε για την αρχική συναλλαγή, εκτός εάν συμφωνηθεί διαφορετικά.
|
||||||
|
|
||||||
|
Η 3DEALER μπορεί να καθυστερήσει την επιστροφή χρημάτων μέχρι να παραλάβει το επιστρεφόμενο προϊόν ή μέχρι ο πελάτης να αποδείξει ότι το έχει αποστείλει, όποιο συμβεί πρώτο.
|
||||||
|
|
||||||
|
## 9. Αλλαγές προϊόντων
|
||||||
|
|
||||||
|
**@TODO: Να επιβεβαιωθεί εάν η 3DEALER προσφέρει αλλαγές προϊόντων/μεγέθους ή εάν οι αλλαγές γίνονται αποκλειστικά μέσω επιστροφής και νέας παραγγελίας.**
|
||||||
|
|
||||||
|
Σε περίπτωση που προσφέρονται αλλαγές, η διαδικασία και τυχόν έξοδα αποστολής θα γνωστοποιούνται στον πελάτη πριν από την ολοκλήρωση της αλλαγής.
|
||||||
|
|
||||||
|
## 10. Ελαττωματικά ή μη συμμορφούμενα προϊόντα
|
||||||
|
|
||||||
|
Σε περίπτωση που ένα προϊόν είναι ελαττωματικό ή δεν ανταποκρίνεται στη σύμβαση, ο πελάτης έχει τα δικαιώματα που προβλέπει η ισχύουσα νομοθεσία περί πώλησης αγαθών και προστασίας καταναλωτή.
|
||||||
|
|
||||||
|
Η ύπαρξη μικρών αισθητικών χαρακτηριστικών που είναι φυσιολογικά για την τρισδιάστατη εκτύπωση, όπως γραμμές στρώσεων ή μικρές διαφοροποιήσεις, δεν αποτελεί από μόνη της ελάττωμα.
|
||||||
|
|
||||||
|
Για οποιοδήποτε πρόβλημα με προϊόν, επικοινωνήστε μαζί μας στο [print@3dealer.gr](mailto:print@3dealer.gr), αναφέροντας τον αριθμό παραγγελίας και, όπου είναι δυνατόν, επισυνάπτοντας φωτογραφίες.
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
---
|
||||||
|
name: "Όροι & Προϋποθέσεις"
|
||||||
|
slug: "terms-and-conditions"
|
||||||
|
|
||||||
|
meta_title: ""
|
||||||
|
meta_description: ""
|
||||||
|
og_image: ""
|
||||||
|
noindex: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Γενικά
|
||||||
|
|
||||||
|
Το ηλεκτρονικό κατάστημα 3DEALER (εφεξής «το Κατάστημα» ή «3DEALER») λειτουργεί από την επιχείρηση 3DEALER, με έδρα στην Πάρου 31, Κυψέλη, ΤΚ 11255, Αθήνα.
|
||||||
|
|
||||||
|
**ΑΦΜ:** @TODO
|
||||||
|
**ΓΕΜΗ:** @TODO
|
||||||
|
|
||||||
|
Για οποιαδήποτε πληροφορία ή επικοινωνία σχετικά με παραγγελίες, προϊόντα ή τη λειτουργία του Καταστήματος, μπορείτε να επικοινωνείτε μαζί μας:
|
||||||
|
|
||||||
|
**Email:** [print@3dealer.gr](mailto:print@3dealer.gr)
|
||||||
|
**Τηλέφωνο:** 6976 443140
|
||||||
|
|
||||||
|
Η χρήση του Καταστήματος και η πραγματοποίηση αγορών μέσω αυτού προϋποθέτουν την αποδοχή των παρόντων Όρων & Προϋποθέσεων.
|
||||||
|
|
||||||
|
Οι παρόντες όροι διέπουν τις αγορές που πραγματοποιούνται μέσω του ηλεκτρονικού καταστήματος και συμπληρώνονται από την Πολιτική Απορρήτου και την Πολιτική Αποστολών & Επιστροφών.
|
||||||
|
|
||||||
|
## 2. Προϊόντα
|
||||||
|
|
||||||
|
Τα προϊόντα που διατίθενται μέσω του Καταστήματος περιγράφονται και απεικονίζονται με όσο το δυνατόν μεγαλύτερη ακρίβεια.
|
||||||
|
|
||||||
|
Τα προϊόντα της 3DEALER κατασκευάζονται με τρισδιάστατη εκτύπωση. Λόγω της φύσης της διαδικασίας παραγωγής, ενδέχεται να εμφανίζουν γραμμές στρώσεων, σημεία ένωσης, μικρές διαφοροποιήσεις ή άλλες μικρές αισθητικές ατέλειες. Τα χαρακτηριστικά αυτά αποτελούν φυσιολογικό αποτέλεσμα της διαδικασίας 3D εκτύπωσης και δεν θεωρούνται από μόνα τους ελάττωμα του προϊόντος.
|
||||||
|
|
||||||
|
Όλα τα προϊόντα εκτυπώνονται και προετοιμάζονται κατά παραγγελία. Ο συνήθης χρόνος προετοιμασίας είναι 2–7 εργάσιμες ημέρες.
|
||||||
|
|
||||||
|
Εκτός εάν αναφέρεται διαφορετικά στην περιγραφή συγκεκριμένου προϊόντος, τα προϊόντα προορίζονται για διακοσμητική χρήση ή για χρήση σε λογικά και ρεαλιστικά πλαίσια. Η χρήση με υπερβολική δύναμη, σε πολύ υψηλές θερμοκρασίες ή με τρόπο διαφορετικό από τον προβλεπόμενο ενδέχεται να προκαλέσει ζημιά στο προϊόν.
|
||||||
|
|
||||||
|
## 3. Τιμές
|
||||||
|
|
||||||
|
Όλες οι τιμές των προϊόντων αναγράφονται σε ευρώ (€) και περιλαμβάνουν τον ισχύοντα ΦΠΑ.
|
||||||
|
|
||||||
|
Το κόστος αποστολής υπολογίζεται κατά την ολοκλήρωση της παραγγελίας και εμφανίζεται πριν από την επιβεβαίωση της αγοράς.
|
||||||
|
|
||||||
|
**Κόστος αποστολής:** @TODO — το ακριβές κόστος υπολογίζεται δυναμικά ανάλογα με τις ρυθμίσεις αποστολής του Καταστήματος.
|
||||||
|
|
||||||
|
## 4. Παραγγελίες
|
||||||
|
|
||||||
|
Ο πελάτης μπορεί να πραγματοποιήσει αγορά είτε δημιουργώντας λογαριασμό στο Κατάστημα είτε χρησιμοποιώντας τη δυνατότητα guest checkout, χωρίς δημιουργία λογαριασμού.
|
||||||
|
|
||||||
|
Για την ολοκλήρωση μιας παραγγελίας απαιτούνται τα στοιχεία που είναι απαραίτητα για την επεξεργασία, πληρωμή και παράδοσή της.
|
||||||
|
|
||||||
|
Πριν από την οριστικοποίηση της παραγγελίας, ο πελάτης έχει τη δυνατότητα να ελέγξει τα στοιχεία της παραγγελίας και το συνολικό κόστος, συμπεριλαμβανομένων τυχόν εξόδων αποστολής.
|
||||||
|
|
||||||
|
Με την ολοκλήρωση της παραγγελίας αποστέλλεται επιβεβαίωση στη διεύθυνση email που έχει δηλώσει ο πελάτης.
|
||||||
|
|
||||||
|
**@TODO: Να επιβεβαιωθεί εάν η παραγγελία θεωρείται οριστική με την ολοκλήρωση της πληρωμής ή με την αποστολή της επιβεβαίωσης παραγγελίας.**
|
||||||
|
|
||||||
|
## 5. Τρόποι πληρωμής
|
||||||
|
|
||||||
|
Το Κατάστημα υποστηρίζει τους ακόλουθους τρόπους πληρωμής:
|
||||||
|
|
||||||
|
* Πιστωτική ή χρεωστική κάρτα
|
||||||
|
* PayPal
|
||||||
|
* Stripe
|
||||||
|
* IRIS
|
||||||
|
* Τραπεζική κατάθεση
|
||||||
|
|
||||||
|
Για τις ηλεκτρονικές πληρωμές ενδέχεται να χρησιμοποιούνται υπηρεσίες τρίτων παρόχων πληρωμών. Τα στοιχεία της κάρτας ή άλλα ευαίσθητα στοιχεία πληρωμής δεν αποθηκεύονται από την 3DEALER, αλλά υποβάλλονται σε επεξεργασία από τον αντίστοιχο πάροχο πληρωμών σύμφωνα με τους δικούς του όρους και την πολιτική απορρήτου του.
|
||||||
|
|
||||||
|
## 6. Ακυρώσεις παραγγελιών
|
||||||
|
|
||||||
|
**@TODO: Να επιβεβαιωθεί η πολιτική ακύρωσης.**
|
||||||
|
|
||||||
|
Ως γενικός κανόνας, ο πελάτης μπορεί να επικοινωνήσει με την 3DEALER το συντομότερο δυνατό μετά την πραγματοποίηση της παραγγελίας, εφόσον επιθυμεί την ακύρωσή της.
|
||||||
|
|
||||||
|
Εφόσον η παραγγελία δεν έχει ακόμη ξεκινήσει να προετοιμάζεται, η 3DEALER μπορεί να προχωρήσει σε ακύρωση και επιστροφή του ποσού που έχει καταβληθεί.
|
||||||
|
|
||||||
|
Εφόσον η παραγωγή έχει ήδη ξεκινήσει, ισχύουν οι όροι της Πολιτικής Αποστολών & Επιστροφών και, όπου εφαρμόζεται, το νόμιμο δικαίωμα υπαναχώρησης.
|
||||||
|
|
||||||
|
## 7. Δικαίωμα υπαναχώρησης και επιστροφές
|
||||||
|
|
||||||
|
Ο καταναλωτής έχει, όπου προβλέπεται από την ισχύουσα νομοθεσία, δικαίωμα υπαναχώρησης από τη σύμβαση εξ αποστάσεως εντός δεκατεσσάρων (14) ημερολογιακών ημερών από την παραλαβή του προϊόντος, χωρίς να χρειάζεται να αιτιολογήσει την απόφασή του.
|
||||||
|
|
||||||
|
Εξαιρέσεις από το δικαίωμα υπαναχώρησης ισχύουν στις περιπτώσεις που προβλέπονται από την ισχύουσα νομοθεσία, μεταξύ άλλων για προϊόντα που κατασκευάζονται σύμφωνα με τις ειδικές προδιαγραφές του καταναλωτή ή είναι σαφώς εξατομικευμένα.
|
||||||
|
|
||||||
|
Η διαδικασία και οι όροι επιστροφών περιγράφονται αναλυτικά στην Πολιτική Αποστολών & Επιστροφών.
|
||||||
|
|
||||||
|
## 8. Νομική εγγύηση και ελαττωματικά προϊόντα
|
||||||
|
|
||||||
|
Η 3DEALER ευθύνεται για τη συμμόρφωση των προϊόντων με τη σύμβαση και για τα νόμιμα δικαιώματα του καταναλωτή σε περίπτωση έλλειψης συμμόρφωσης ή ελαττώματος, σύμφωνα με την ισχύουσα νομοθεσία.
|
||||||
|
|
||||||
|
Η ύπαρξη φυσιολογικών χαρακτηριστικών της τρισδιάστατης εκτύπωσης, όπως οι γραμμές στρώσεων ή μικρές αισθητικές διαφοροποιήσεις που είναι αναμενόμενες από τη συγκεκριμένη διαδικασία παραγωγής, δεν αποτελεί από μόνη της έλλειψη συμμόρφωσης.
|
||||||
|
|
||||||
|
## 9. Διαθεσιμότητα
|
||||||
|
|
||||||
|
Η 3DEALER καταβάλλει κάθε προσπάθεια ώστε οι πληροφορίες σχετικά με τη διαθεσιμότητα των προϊόντων να είναι ακριβείς.
|
||||||
|
|
||||||
|
Σε εξαιρετικές περιπτώσεις όπου ένα προϊόν δεν μπορεί να παραχθεί ή να αποσταλεί, η 3DEALER θα επικοινωνήσει με τον πελάτη και θα ενημερώσει σχετικά με τις διαθέσιμες επιλογές.
|
||||||
|
|
||||||
|
## 10. Πνευματική ιδιοκτησία
|
||||||
|
|
||||||
|
Το περιεχόμενο του Καταστήματος, συμπεριλαμβανομένων ενδεικτικά των σχεδίων, φωτογραφιών, κειμένων, γραφικών, λογοτύπων και λοιπού υλικού, αποτελεί ιδιοκτησία της 3DEALER ή χρησιμοποιείται νόμιμα από αυτήν και προστατεύεται από την ισχύουσα νομοθεσία περί πνευματικής και βιομηχανικής ιδιοκτησίας.
|
||||||
|
|
||||||
|
Δεν επιτρέπεται η αντιγραφή, αναπαραγωγή, τροποποίηση, διανομή ή εμπορική εκμετάλλευση του περιεχομένου χωρίς προηγούμενη γραπτή άδεια.
|
||||||
|
|
||||||
|
## 11. Προσωπικά δεδομένα
|
||||||
|
|
||||||
|
Η επεξεργασία των προσωπικών δεδομένων των πελατών πραγματοποιείται σύμφωνα με την Πολιτική Απορρήτου της 3DEALER.
|
||||||
|
|
||||||
|
## 12. Τροποποίηση των Όρων
|
||||||
|
|
||||||
|
Η 3DEALER διατηρεί το δικαίωμα να τροποποιεί τους παρόντες Όρους & Προϋποθέσεις, όταν αυτό είναι απαραίτητο, ιδίως λόγω αλλαγών στη νομοθεσία, στις υπηρεσίες ή στον τρόπο λειτουργίας του Καταστήματος.
|
||||||
|
|
||||||
|
Οι όροι που ισχύουν για κάθε παραγγελία είναι εκείνοι που ήταν διαθέσιμοι κατά τον χρόνο πραγματοποίησης της συγκεκριμένης παραγγελίας.
|
||||||
|
|
||||||
|
## 13. Εφαρμοστέο δίκαιο
|
||||||
|
|
||||||
|
Οι παρόντες Όροι & Προϋποθέσεις διέπονται από το ελληνικό δίκαιο.
|
||||||
|
|
||||||
|
Για κάθε διαφορά που σχετίζεται με τη χρήση του Καταστήματος ή την αγορά προϊόντων εφαρμόζονται οι διατάξεις της ισχύουσας ελληνικής και ευρωπαϊκής νομοθεσίας περί προστασίας του καταναλωτή.
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 689 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.9 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.5 MiB |
@@ -1 +1,133 @@
|
|||||||
schemas: []
|
schemas:
|
||||||
|
- name: pages
|
||||||
|
label: Pages
|
||||||
|
type: files
|
||||||
|
files:
|
||||||
|
- name: home
|
||||||
|
label: Home Page
|
||||||
|
file: pages/home.md
|
||||||
|
fields:
|
||||||
|
- name: name
|
||||||
|
label: Name
|
||||||
|
ui: string
|
||||||
|
- name: slug
|
||||||
|
label: Slug
|
||||||
|
ui: slug
|
||||||
|
- name: meta_title
|
||||||
|
label: Meta Title
|
||||||
|
ui: string
|
||||||
|
- name: meta_description
|
||||||
|
label: Meta Description
|
||||||
|
ui: string
|
||||||
|
- name: og_image
|
||||||
|
label: Og Image
|
||||||
|
ui: image
|
||||||
|
- name: trivia_body_image
|
||||||
|
label: "Trivia Image (next to the intro paragraph)"
|
||||||
|
ui: image
|
||||||
|
- name: trivia_body
|
||||||
|
label: "Trivia Body (intro paragraph under the hero)"
|
||||||
|
ui: markdown
|
||||||
|
- name: classics_title
|
||||||
|
label: "Classics Section Title (favorites carousel heading)"
|
||||||
|
ui: string
|
||||||
|
- name: terms-and-conditions
|
||||||
|
label: "Terms & Conditions Page"
|
||||||
|
file: pages/terms-and-conditions.md
|
||||||
|
fields:
|
||||||
|
- name: name
|
||||||
|
label: Name
|
||||||
|
ui: string
|
||||||
|
- name: slug
|
||||||
|
label: Slug
|
||||||
|
ui: slug
|
||||||
|
- name: meta_title
|
||||||
|
label: Meta Title
|
||||||
|
ui: string
|
||||||
|
- name: meta_description
|
||||||
|
label: Meta Description
|
||||||
|
ui: string
|
||||||
|
- name: og_image
|
||||||
|
label: Og Image
|
||||||
|
ui: image
|
||||||
|
- name: noindex
|
||||||
|
label: Noindex
|
||||||
|
ui: boolean
|
||||||
|
- name: body
|
||||||
|
label: Body
|
||||||
|
ui: markdown
|
||||||
|
- name: shipping-returns
|
||||||
|
label: "Shipping & Returns Page"
|
||||||
|
file: pages/shipping-returns.md
|
||||||
|
fields:
|
||||||
|
- name: name
|
||||||
|
label: Name
|
||||||
|
ui: string
|
||||||
|
- name: slug
|
||||||
|
label: Slug
|
||||||
|
ui: slug
|
||||||
|
- name: meta_title
|
||||||
|
label: Meta Title
|
||||||
|
ui: string
|
||||||
|
- name: meta_description
|
||||||
|
label: Meta Description
|
||||||
|
ui: string
|
||||||
|
- name: og_image
|
||||||
|
label: Og Image
|
||||||
|
ui: image
|
||||||
|
- name: noindex
|
||||||
|
label: Noindex
|
||||||
|
ui: boolean
|
||||||
|
- name: body
|
||||||
|
label: Body
|
||||||
|
ui: markdown
|
||||||
|
- name: privacy-policy
|
||||||
|
label: "Privacy Policy Page"
|
||||||
|
file: pages/privacy-policy.md
|
||||||
|
fields:
|
||||||
|
- name: name
|
||||||
|
label: Name
|
||||||
|
ui: string
|
||||||
|
- name: slug
|
||||||
|
label: Slug
|
||||||
|
ui: slug
|
||||||
|
- name: meta_title
|
||||||
|
label: Meta Title
|
||||||
|
ui: string
|
||||||
|
- name: meta_description
|
||||||
|
label: Meta Description
|
||||||
|
ui: string
|
||||||
|
- name: og_image
|
||||||
|
label: Og Image
|
||||||
|
ui: image
|
||||||
|
- name: noindex
|
||||||
|
label: Noindex
|
||||||
|
ui: boolean
|
||||||
|
- name: body
|
||||||
|
label: Body
|
||||||
|
ui: markdown
|
||||||
|
- name: cookies-policy
|
||||||
|
label: "Cookies Policy Page"
|
||||||
|
file: pages/cookies-policy.md
|
||||||
|
fields:
|
||||||
|
- name: name
|
||||||
|
label: Name
|
||||||
|
ui: string
|
||||||
|
- name: slug
|
||||||
|
label: Slug
|
||||||
|
ui: slug
|
||||||
|
- name: meta_title
|
||||||
|
label: Meta Title
|
||||||
|
ui: string
|
||||||
|
- name: meta_description
|
||||||
|
label: Meta Description
|
||||||
|
ui: string
|
||||||
|
- name: og_image
|
||||||
|
label: Og Image
|
||||||
|
ui: image
|
||||||
|
- name: noindex
|
||||||
|
label: Noindex
|
||||||
|
ui: boolean
|
||||||
|
- name: body
|
||||||
|
label: Body
|
||||||
|
ui: markdown
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', $collection->translateAttribute('name') . ' — ' . config('app.name'))
|
||||||
|
@section('description', strip_tags($collection->translateAttribute('description') ?? ''))
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="max-w-7xl mx-auto px-4 sm:px-8 py-12">
|
||||||
|
|
||||||
|
<div class="flex items-end justify-between gap-6 flex-wrap mb-10">
|
||||||
|
<h1 class="font-display font-extrabold text-h1">{{ $collection->translateAttribute('name') }}</h1>
|
||||||
|
|
||||||
|
<x-breadcrumb :items="[
|
||||||
|
['label' => __('general.nav.home'), 'href' => route('home')],
|
||||||
|
['label' => $collection->translateAttribute('name')],
|
||||||
|
]" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center justify-between gap-6 flex-wrap border-b border-black pb-6 mb-10">
|
||||||
|
<p class="text-neutral-600">
|
||||||
|
{{ trans_choice('general.shop.showing_results', $products->total(), [
|
||||||
|
'first' => $products->firstItem() ?? 0,
|
||||||
|
'last' => $products->lastItem() ?? 0,
|
||||||
|
'total' => $products->total(),
|
||||||
|
]) }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{{-- Dummy — not wired to real sorting yet --}}
|
||||||
|
<x-ui.select
|
||||||
|
:ariaLabel="__('general.shop.sort_label')"
|
||||||
|
:options="[
|
||||||
|
['value' => 'default', 'label' => __('general.shop.sort_default')],
|
||||||
|
['value' => 'popularity', 'label' => __('general.shop.sort_popularity')],
|
||||||
|
['value' => 'price-asc', 'label' => __('general.shop.sort_price_asc')],
|
||||||
|
['value' => 'price-desc', 'label' => __('general.shop.sort_price_desc')],
|
||||||
|
['value' => 'newest', 'label' => __('general.shop.sort_newest')],
|
||||||
|
]"
|
||||||
|
value="default"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-[1fr_300px] gap-12">
|
||||||
|
|
||||||
|
{{-- Products --}}
|
||||||
|
<div>
|
||||||
|
@if($products->isEmpty())
|
||||||
|
<p class="text-neutral-500">{{ __('general.shop.no_products') }}</p>
|
||||||
|
@else
|
||||||
|
<x-product-grid :products="$products->items()" cols="3" />
|
||||||
|
|
||||||
|
<div class="mt-12">
|
||||||
|
<x-ui.pagination :paginator="$products" />
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{-- Sidebar — search, price and availability filters are dummy for now --}}
|
||||||
|
<aside class="flex flex-col gap-10">
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="shop-search" class="sr-only">{{ __('general.shop.search_label') }}</label>
|
||||||
|
<div class="relative">
|
||||||
|
<x-ui.input
|
||||||
|
type="search"
|
||||||
|
id="shop-search"
|
||||||
|
:placeholder="__('general.shop.search_placeholder')"
|
||||||
|
class="pr-10"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="absolute right-0 top-1/2 -translate-y-1/2"
|
||||||
|
aria-label="{{ __('general.shop.search_label') }}"
|
||||||
|
>
|
||||||
|
<x-ui.icon name="search" :size="20" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-4">
|
||||||
|
<h2 class="font-display font-extrabold uppercase">{{ __('general.shop.filter_price') }}</h2>
|
||||||
|
|
||||||
|
<div class="flex items-center gap-2" aria-hidden="true">
|
||||||
|
<x-ui.icon name="arrow-left" :size="20" />
|
||||||
|
<span class="flex-1 h-px bg-black"></span>
|
||||||
|
<x-ui.icon name="arrow-right" :size="20" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center justify-between gap-4">
|
||||||
|
<span class="text-sm">€10 - €50</span>
|
||||||
|
<button type="button" class="underline-slide [--slide-h:1px] font-display font-bold italic uppercase text-sm">
|
||||||
|
{{ __('general.shop.apply') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-4">
|
||||||
|
<h2 class="font-display font-extrabold uppercase">{{ __('general.shop.availability') }}</h2>
|
||||||
|
<x-ui.checkbox id="shop-in-stock" name="in_stock">
|
||||||
|
{{ __('general.shop.in_stock_only') }}
|
||||||
|
</x-ui.checkbox>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
@@ -10,9 +10,8 @@
|
|||||||
{{-- Links --}}
|
{{-- Links --}}
|
||||||
<nav aria-label="Footer navigation">
|
<nav aria-label="Footer navigation">
|
||||||
<ul class="flex flex-wrap justify-center items-center gap-x-8 gap-y-3 font-semibold uppercase">
|
<ul class="flex flex-wrap justify-center items-center gap-x-8 gap-y-3 font-semibold uppercase">
|
||||||
<li><a href="/contact" class="underline-slide [--slide-h:5px] font-extrabold italic">Επικοινωνία</a></li>
|
<li><a href="{{ route('contact') }}" class="underline-slide [--slide-h:5px] font-extrabold italic">Επικοινωνία</a></li>
|
||||||
<li><a href="/shipping" class="underline-slide [--slide-h:5px] font-extrabold italic">Πληροφορίες αποστολών</a></li>
|
<li><a href="{{ route('legal.shipping-returns') }}" class="underline-slide [--slide-h:5px] font-extrabold italic">Αποστολές & Επιστροφές</a></li>
|
||||||
<li><a href="/returns" class="underline-slide [--slide-h:5px] font-extrabold italic">Πολιτική επιστροφών</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
@@ -57,9 +56,11 @@
|
|||||||
© {{ date('Y') }} {{ config('app.name') }}. Με επιφύλαξη παντός δικαιώματος.
|
© {{ date('Y') }} {{ config('app.name') }}. Με επιφύλαξη παντός δικαιώματος.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<a href="/terms" class="underline-slide [--slide-h:1px] pb-0">Όροι χρήσης</a>
|
<a href="{{ route('legal.terms') }}" class="underline-slide [--slide-h:1px] pb-0">Όροι & Προϋποθέσεις</a>
|
||||||
<span>|</span>
|
<span>|</span>
|
||||||
<a href="/privacy" class="underline-slide [--slide-h:1px] pb-0 ">Πολιτική απορρήτου</a>
|
<a href="{{ route('legal.privacy') }}" class="underline-slide [--slide-h:1px] pb-0">Πολιτική Απορρήτου</a>
|
||||||
|
<span>|</span>
|
||||||
|
<a href="{{ route('legal.cookies') }}" class="underline-slide [--slide-h:1px] pb-0">Πολιτική Cookies</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{-- Contact --}}
|
{{-- Contact --}}
|
||||||
<a href="{{ url('/'.app()->getLocale().'/contact') }}" class="nav-link uppercase inline-flex items-center gap-1 relative font-display font-extrabold italic text-black no-underline"><span>{{ __('general.nav.contact') }}</span></a>
|
<a href="{{ route('contact') }}" class="nav-link uppercase inline-flex items-center gap-1 relative font-display font-extrabold italic text-black no-underline"><span>{{ __('general.nav.contact') }}</span></a>
|
||||||
|
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
|||||||
@@ -49,14 +49,15 @@ class="absolute right-0 bottom-2 cursor-pointer"
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="relative bg-neutral-300 min-h-[320px] lg:min-h-full border-t border-black lg:border-t-0 lg:border-l">
|
<div class=" min-h-[320px] lg:min-h-full border-t border-black lg:border-t-0 lg:border-l flex items-center justify-center">
|
||||||
@if($image)
|
<x-ui.stoic-image
|
||||||
<img src="{{ $image }}" alt="" aria-hidden="true" loading="lazy" width="800" height="800" class="w-full h-full object-cover">
|
src="middle-fingers2.png"
|
||||||
@else
|
preset="medium"
|
||||||
<div class="absolute inset-0 flex items-center justify-center text-neutral-500 text-sm">
|
alt=""
|
||||||
Χωρίς εικόνα
|
aria-hidden="true"
|
||||||
</div>
|
loading="lazy"
|
||||||
@endif
|
class="mix-blend-darken max-w-md"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,14 +1,23 @@
|
|||||||
@props([
|
@props([
|
||||||
'title' => null,
|
'title' => null,
|
||||||
'products' => [],
|
'products' => [],
|
||||||
|
'cols' => 4,
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@php
|
||||||
|
$gridCols = match((int) $cols) {
|
||||||
|
3 => 'grid-cols-2 md:grid-cols-3',
|
||||||
|
2 => 'grid-cols-1 md:grid-cols-2',
|
||||||
|
default => 'grid-cols-2 md:grid-cols-4',
|
||||||
|
};
|
||||||
|
@endphp
|
||||||
|
|
||||||
<section {{ $attributes }}>
|
<section {{ $attributes }}>
|
||||||
@if($title)
|
@if($title)
|
||||||
<h2 class="font-display font-extrabold text-h2 mb-10">{{ $title }}</h2>
|
<h2 class="font-display font-extrabold text-h2 mb-10">{{ $title }}</h2>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
|
<div class="grid {{ $gridCols }} gap-6">
|
||||||
@foreach($products as $product)
|
@foreach($products as $product)
|
||||||
<x-ui.product-card
|
<x-ui.product-card
|
||||||
:name="$product['name']"
|
:name="$product['name']"
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
@props(['paginator'])
|
||||||
|
|
||||||
|
{{--
|
||||||
|
Numbered pager (01 02 03 …) matching the site's underline-slide convention,
|
||||||
|
plus a trailing arrow to the next page. Real pagination — takes any
|
||||||
|
Illuminate\Contracts\Pagination\LengthAwarePaginator.
|
||||||
|
|
||||||
|
Usage: <x-ui.pagination :paginator="$products" />
|
||||||
|
--}}
|
||||||
|
|
||||||
|
@if($paginator->hasPages())
|
||||||
|
<nav aria-label="{{ __('general.pagination.nav_label') }}" {{ $attributes->merge(['class' => 'flex items-center gap-6 font-display font-bold']) }}>
|
||||||
|
<ol class="flex items-center gap-6">
|
||||||
|
@foreach($paginator->getUrlRange(1, $paginator->lastPage()) as $page => $url)
|
||||||
|
<li>
|
||||||
|
@if($page === $paginator->currentPage())
|
||||||
|
<span class="underline-slide is-active" aria-current="page">{{ str_pad((string) $page, 2, '0', STR_PAD_LEFT) }}</span>
|
||||||
|
@else
|
||||||
|
<a href="{{ $url }}" class="underline-slide" aria-label="{{ __('general.pagination.page', ['page' => $page]) }}">{{ str_pad((string) $page, 2, '0', STR_PAD_LEFT) }}</a>
|
||||||
|
@endif
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
@if($paginator->hasMorePages())
|
||||||
|
<a href="{{ $paginator->nextPageUrl() }}" aria-label="{{ __('general.pagination.next') }}">
|
||||||
|
<x-ui.icon name="arrow-right" :size="24" />
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
</nav>
|
||||||
|
@endif
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<div class="group">
|
<div class="group">
|
||||||
<div class="relative flex items-center justify-center mb-4">
|
<div class="relative flex items-center justify-center mb-4">
|
||||||
<a href="{{ $href }}" class="block w-full border border-black overflow-hidden bg-white">
|
<a href="{{ $href }}" class="block w-full border border-black overflow-hidden bg-white aspect-[251/335] flex items-center justify-center">
|
||||||
@if($image)
|
@if($image)
|
||||||
<img
|
<img
|
||||||
src="{{ $image }}"
|
src="{{ $image }}"
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
@props([
|
||||||
|
'options' => [],
|
||||||
|
'value' => null,
|
||||||
|
'name' => null,
|
||||||
|
'ariaLabel' => null,
|
||||||
|
])
|
||||||
|
|
||||||
|
{{--
|
||||||
|
Native <select>, styled to match the site's bordered/uppercase look.
|
||||||
|
Usage:
|
||||||
|
<x-ui.select
|
||||||
|
:options="[['value' => 'a', 'label' => 'Option A'], ...]"
|
||||||
|
value="a"
|
||||||
|
ariaLabel="Sort products"
|
||||||
|
/>
|
||||||
|
--}}
|
||||||
|
|
||||||
|
<div class="relative inline-flex items-center">
|
||||||
|
<select
|
||||||
|
@if($name) name="{{ $name }}" @endif
|
||||||
|
@if($ariaLabel) aria-label="{{ $ariaLabel }}" @endif
|
||||||
|
{{ $attributes->merge(['class' => 'appearance-none bg-transparent border border-black pl-4 pr-10 py-2.5 font-display font-bold cursor-pointer focus:outline-none']) }}
|
||||||
|
>
|
||||||
|
@foreach($options as $option)
|
||||||
|
<option value="{{ $option['value'] }}" @selected($value === $option['value'])>{{ $option['label'] }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<x-ui.icon name="arrow-down" :size="16" class="pointer-events-none absolute right-4" />
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
@props([
|
||||||
|
'src', // Stoic filename string e.g. "hero.png"
|
||||||
|
'preset' => 'medium', // which preset sets the src + default sizes hint
|
||||||
|
'alt' => '',
|
||||||
|
'loading' => 'lazy',
|
||||||
|
'fetchpriority' => 'auto',
|
||||||
|
'sizes' => null, // override when you know the render context
|
||||||
|
'width' => null,
|
||||||
|
'height' => null,
|
||||||
|
'preload' => false, // push a <link rel=preload> into <head> for LCP images
|
||||||
|
])
|
||||||
|
|
||||||
|
@php
|
||||||
|
$ext = strtolower(pathinfo($src, PATHINFO_EXTENSION));
|
||||||
|
$imageSrc = \App\Services\Stoic::image($src, $preset);
|
||||||
|
$srcset = \App\Services\Stoic::srcset($src);
|
||||||
|
$presetW = collect(\App\Services\Stoic::presets())->firstWhere('code', $preset)['width'] ?? 800;
|
||||||
|
$sizesAttr = $sizes ?? "(min-width: 1024px) {$presetW}px, 100vw";
|
||||||
|
[$width, $height] = $width !== null && $height !== null
|
||||||
|
? [$width, $height]
|
||||||
|
: \App\Services\Stoic::dimensions($src, $preset);
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@if($preload)
|
||||||
|
@push('seo')
|
||||||
|
<link rel="preload" as="image" href="{{ $imageSrc }}"
|
||||||
|
@if($srcset) imagesrcset="{{ $srcset }}" imagesizes="{{ $sizesAttr }}" @endif
|
||||||
|
@if($ext !== 'svg') type="image/webp" @endif
|
||||||
|
fetchpriority="high" />
|
||||||
|
@endpush
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<img
|
||||||
|
src="{{ $imageSrc }}"
|
||||||
|
@if($srcset)
|
||||||
|
srcset="{{ $srcset }}"
|
||||||
|
sizes="{{ $sizesAttr }}"
|
||||||
|
@endif
|
||||||
|
@if($width !== null) width="{{ $width }}" @endif
|
||||||
|
@if($height !== null) height="{{ $height }}" @endif
|
||||||
|
alt="{{ $alt }}"
|
||||||
|
loading="{{ $loading }}"
|
||||||
|
fetchpriority="{{ $fetchpriority }}"
|
||||||
|
{{ $attributes }}
|
||||||
|
/>
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', __('general.nav.contact'))
|
||||||
|
@section('description', 'Επικοινώνησε μαζί μας για οποιαδήποτε απορία ή ιδέα έχεις και θα σου απαντήσουμε το συντομότερο δυνατό.')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<section class="grid grid-cols-1 lg:grid-cols-2 lg:divide-x lg:divide-black lg:min-h-[calc(100vh-102px)]">
|
||||||
|
|
||||||
|
<div class="flex flex-col justify-center gap-10 px-8 py-16 lg:px-16">
|
||||||
|
|
||||||
|
<svg viewBox="0 0 135 124" class="rotating-star text-brand w-24 h-24 lg:w-40 lg:h-40" aria-hidden="true" fill="currentColor">
|
||||||
|
<path d="m88.4 0 4 28.9 29.7-5.2-14.3 25.7L135 62l-27.2 12.6 14.3 25.7-29.7-5.2-4 28.9-20.9-21.1L46.6 124l-4-28.9-29.7 5.2 14.3-25.7L0 62l27.2-12.6-14.3-25.7 29.7 5.2 4-28.9 20.9 21.1L88.4 0z"/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<h1 class="font-display text-h2 font-semibold leading-tight lg:text-h2"
|
||||||
|
data-controller="appear"
|
||||||
|
data-appear-visible-class="is-visible">
|
||||||
|
<span class="text-dance">Επικοινώνησε</span><br>
|
||||||
|
μαζί μας <span class="text-dance">άμεσα</span>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="max-w-md ">
|
||||||
|
Έχεις απορία, ιδέα ή θες να μας πεις κάτι; Γράψε μας το μήνυμά σου και θα σου απαντήσουμε το συντομότερο δυνατό.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<form method="POST" action="#" class="flex flex-col gap-8 max-w-xl">
|
||||||
|
@csrf
|
||||||
|
|
||||||
|
<div class="grid grid-cols-1 gap-8 sm:grid-cols-2">
|
||||||
|
<x-ui.field label="Το όνομά σου" for="contact-name">
|
||||||
|
<x-ui.input id="contact-name" name="name" autocomplete="name" :required="true" />
|
||||||
|
</x-ui.field>
|
||||||
|
|
||||||
|
<x-ui.field label="Το email σου" for="contact-email">
|
||||||
|
<x-ui.input id="contact-email" name="email" type="email" autocomplete="email" :required="true" />
|
||||||
|
</x-ui.field>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<x-ui.field label="Το μήνυμά σου" for="contact-message">
|
||||||
|
<x-ui.textarea id="contact-message" name="message" rows="5" :required="true" />
|
||||||
|
</x-ui.field>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<x-ui.button type="submit" size="md">Υποβολή</x-ui.button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="min-h-[320px] bg-neutral-400 lg:min-h-full" aria-hidden="true"></div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
@endsection
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
@extends('layouts.app')
|
@extends('layouts.app')
|
||||||
|
|
||||||
@section('title', config('app.name') . ' — Ό,τι φαντάζεσαι, τυπωμένο σε 3D')
|
@section('title', $page->meta_title)
|
||||||
@section('description', 'Gaming φιγούρες, κρανία, κλειδοθήκες και ό,τι πιο τρελό σου περνάει απ\' το μυαλό. Σχεδιασμένα και τυπωμένα σε 3D, ένα προς ένα.')
|
@section('description', $page->meta_description)
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
@@ -10,12 +10,12 @@
|
|||||||
{{-- Hero --}}
|
{{-- Hero --}}
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-2 lg:divide-x lg:divide-black border-b border-black min-h-[calc(100vh-102px)]">
|
<div class="grid grid-cols-1 lg:grid-cols-2 lg:divide-x lg:divide-black border-b border-black min-h-[calc(100vh-102px)]">
|
||||||
<div class="flex flex-col justify-center gap-8 px-8 py-16 lg:px-16">
|
<div class="flex flex-col justify-center gap-8 px-8 py-16 lg:px-16">
|
||||||
<svg viewBox="0 0 135 124" class="hero-star w-[173px] h-[159px] text-[#f3d121]" aria-hidden="true" fill="currentColor">
|
<svg viewBox="0 0 135 124" class="rotating-star w-[173px] h-[159px] text-[#f3d121]" aria-hidden="true" fill="currentColor">
|
||||||
<path d="m88.4 0 4 28.9 29.7-5.2-14.3 25.7L135 62l-27.2 12.6 14.3 25.7-29.7-5.2-4 28.9-20.9-21.1L46.6 124l-4-28.9-29.7 5.2 14.3-25.7L0 62l27.2-12.6-14.3-25.7 29.7 5.2 4-28.9 20.9 21.1L88.4 0z"/>
|
<path d="m88.4 0 4 28.9 29.7-5.2-14.3 25.7L135 62l-27.2 12.6 14.3 25.7-29.7-5.2-4 28.9-20.9-21.1L46.6 124l-4-28.9-29.7 5.2 14.3-25.7L0 62l27.2-12.6-14.3-25.7 29.7 5.2 4-28.9 20.9 21.1L88.4 0z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
<h1
|
<h1
|
||||||
class="font-display font-semibold text-6xl lg:text-[80px] leading-tight"
|
class="font-display font-semibold text-6xl lg:text-[72px] leading-tight"
|
||||||
aria-label="Ό,τι φαντάζεσαι, το τυπώνουμε"
|
aria-label="Ό,τι φαντάζεσαι, το τυπώνουμε"
|
||||||
data-controller="appear"
|
data-controller="appear"
|
||||||
data-appear-visible-class="is-visible"
|
data-appear-visible-class="is-visible"
|
||||||
@@ -40,10 +40,10 @@ class="absolute left-4 lg:left-8 top-1/2 z-10 -translate-y-1/2 hover:-translate-
|
|||||||
@foreach($heroProducts as $product)
|
@foreach($heroProducts as $product)
|
||||||
<div
|
<div
|
||||||
data-carousel-target="slide"
|
data-carousel-target="slide"
|
||||||
class="{{ $loop->first ? '' : 'hidden' }} group h-full flex flex-col justify-between"
|
class="{{ $loop->first ? '' : 'hidden' }} group h-full flex flex-col justify-center pb-8 relative"
|
||||||
>
|
>
|
||||||
<div class="relative flex items-center justify-center">
|
<div class="relative flex items-center justify-center">
|
||||||
<a href="{{ $product['href'] }}" class="block border border-black bg-white flex items-center justify-center overflow-hidden max-w-sm">
|
<a href="{{ $product['href'] }}" class="block border border-black bg-white flex items-center justify-center overflow-hidden max-w-xs xl:max-w-sm">
|
||||||
@if($product['image'])
|
@if($product['image'])
|
||||||
<img
|
<img
|
||||||
src="{{ $product['image'] }}"
|
src="{{ $product['image'] }}"
|
||||||
@@ -52,6 +52,7 @@ class="{{ $loop->first ? '' : 'hidden' }} group h-full flex flex-col justify-bet
|
|||||||
height="400"
|
height="400"
|
||||||
loading="eager"
|
loading="eager"
|
||||||
fetchpriority="high"
|
fetchpriority="high"
|
||||||
|
preload="{{ $loop->first ? true : false }}"
|
||||||
class="w-full h-full object-cover"
|
class="w-full h-full object-cover"
|
||||||
>
|
>
|
||||||
@else
|
@else
|
||||||
@@ -64,7 +65,7 @@ class="w-full h-full object-cover"
|
|||||||
</x-ui.button>
|
</x-ui.button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-baseline justify-between gap-4">
|
<div class="flex items-baseline justify-between gap-4 absolute bottom-0 left-0 w-full">
|
||||||
<a href="{{ $product['href'] }}" class="font-display font-bold text-2xl leading-snug hover:text-brand">
|
<a href="{{ $product['href'] }}" class="font-display font-bold text-2xl leading-snug hover:text-brand">
|
||||||
{{ $product['name'] }}
|
{{ $product['name'] }}
|
||||||
</a>
|
</a>
|
||||||
@@ -92,23 +93,41 @@ class="absolute right-4 lg:right-8 top-1/2 z-10 -translate-y-1/2 hover:translate
|
|||||||
|
|
||||||
{{-- Info / trivia --}}
|
{{-- Info / trivia --}}
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-2 lg:divide-x lg:divide-black">
|
<div class="grid grid-cols-1 lg:grid-cols-2 lg:divide-x lg:divide-black">
|
||||||
<div class="bg-neutral-300 min-h-[320px] lg:min-h-full flex items-center justify-center text-neutral-500 text-sm">
|
<div class="lg:min-h-full flex items-center justify-center text-neutral-500 text-sm" data-stoic="pages/home#trivia_body_image">
|
||||||
Χωρίς εικόνα
|
@if(!empty($page->trivia_image))
|
||||||
|
<x-ui.stoic-image
|
||||||
|
src="{{ $page->trivia_image }}"
|
||||||
|
preset="medium"
|
||||||
|
alt=""
|
||||||
|
aria-hidden="true"
|
||||||
|
loading="lazy"
|
||||||
|
class="w-full h-full object-cover "
|
||||||
|
/>
|
||||||
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-col justify-center gap-6 px-8 py-16 lg:px-16 text-center">
|
<div class="flex flex-col justify-center gap-6 px-8 py-16 lg:px-16 text-center">
|
||||||
<p class="max-w-md mx-auto text-neutral-600">
|
<h2 class="font-semibold text-h2"
|
||||||
Gaming φιγούρες, κρανία, κλειδοθήκες, dark humor και ό,τι πιο τρελό σου περνάει απ' το μυαλό — όλα σχεδιασμένα και τυπωμένα σε 3D, ένα προς ένα, εδώ στην Ελλάδα.
|
data-controller="appear"
|
||||||
</p>
|
data-appear-visible-class="is-visible">100% σουρεάλ & <span class="text-dance" data-text="3d-printed">3d-printed</span></h2>
|
||||||
<h2 class="font-display font-extrabold text-h2 leading-tight">
|
<div class="max-w-md mx-auto" data-stoic="pages/home#trivia_body">
|
||||||
Στρώση-στρώση,<br>
|
{!! Str::markdown($page->trivia_body) !!}
|
||||||
<span class="italic">0.1mm τη φορά</span>
|
</div>
|
||||||
</h2>
|
<div class="flex items-center justify-center mt-4 mb-6">
|
||||||
<p class="max-w-md mx-auto text-neutral-600">
|
@if(!empty($page->trivia_body_image))
|
||||||
Τόσο λεπτή είναι κάθε στρώση υλικού σε ένα 3D εκτυπωμένο κομμάτι — πιο λεπτή κι από τρίχα. Δεν κρατάμε αποθέματα: κάθε παραγγελία τυπώνεται ειδικά για σένα, στο χρώμα και στο μέγεθος που θες.
|
<x-ui.stoic-image
|
||||||
</p>
|
src="{{ $page->trivia_body_image }}"
|
||||||
|
preset="medium"
|
||||||
|
alt=""
|
||||||
|
aria-hidden="true"
|
||||||
|
loading="lazy"
|
||||||
|
class="max-w-xs"
|
||||||
|
/>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<x-ui.button size="md" :href="url('/'.app()->getLocale().'/products')">Δες τα προϊόντα</x-ui.button>
|
{{-- <x-ui.button size="md" :href="url('/'.app()->getLocale().'/products')">Δες τα προϊόντα</x-ui.button> --}}
|
||||||
|
<x-ui.button size="md" :href="url('/'.app()->getLocale().'/about')">Διάβασε περισσότερα</x-ui.button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -117,9 +136,9 @@ class="absolute right-4 lg:right-8 top-1/2 z-10 -translate-y-1/2 hover:translate
|
|||||||
|
|
||||||
{{-- Classics --}}
|
{{-- Classics --}}
|
||||||
<div class="border-b border-black" data-controller="carousel">
|
<div class="border-b border-black" data-controller="carousel">
|
||||||
<div class="flex items-center justify-between gap-4 px-8 py-8 border-b border-black">
|
<div class="flex items-center justify-between gap-4 px-8 py-12 border-b border-black">
|
||||||
<h2 class="font-display font-extrabold text-h3">Τα αγαπημένα μας</h2>
|
<h2 class="font-display font-extrabold text-h2" data-stoic="pages/home#classics_title">{{ $page->classics_title }}</h2>
|
||||||
<x-ui.button size="sm" :href="url('/'.app()->getLocale().'/products')">Δες όλα</x-ui.button>
|
<x-ui.button size="lg" :href="url('/'.app()->getLocale().'/products')">Όλα τα προϊόντα</x-ui.button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center gap-6 px-8 py-12">
|
<div class="flex items-center gap-6 px-8 py-12">
|
||||||
@@ -128,9 +147,9 @@ class="absolute right-4 lg:right-8 top-1/2 z-10 -translate-y-1/2 hover:translate
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="flex-1 overflow-hidden">
|
<div class="flex-1 overflow-hidden">
|
||||||
@forelse($classicsProducts->chunk(4) as $page)
|
@forelse($classicsProducts->chunk(4) as $chunk)
|
||||||
<div data-carousel-target="slide" class="{{ $loop->first ? '' : 'hidden' }} grid grid-cols-2 md:grid-cols-4 gap-6">
|
<div data-carousel-target="slide" class="{{ $loop->first ? '' : 'hidden' }} grid grid-cols-2 md:grid-cols-4 gap-6">
|
||||||
@foreach($page as $product)
|
@foreach($chunk as $product)
|
||||||
<x-ui.product-card
|
<x-ui.product-card
|
||||||
:name="$product['name']"
|
:name="$product['name']"
|
||||||
:price="$product['price']"
|
:price="$product['price']"
|
||||||
|
|||||||
@@ -26,6 +26,15 @@
|
|||||||
|
|
||||||
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
||||||
|
|
||||||
|
@auth('staff')
|
||||||
|
@php($stoicToken = \App\Services\Stoic::token(auth('staff')->user()->email))
|
||||||
|
<script>
|
||||||
|
window.STOIC_HOST = "{{ config('services.stoic.host') }}";
|
||||||
|
window.STOIC_SSO_TOKEN = "{!! $stoicToken !!}";
|
||||||
|
</script>
|
||||||
|
<script src="{{ asset('js/stoic_embed.js') }}"></script>
|
||||||
|
@endauth
|
||||||
|
|
||||||
@stack('head')
|
@stack('head')
|
||||||
</head>
|
</head>
|
||||||
<body class="min-h-screen antialiased">
|
<body class="min-h-screen antialiased">
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', $page->meta_title ?: $page->name)
|
||||||
|
@section('description', $page->meta_description)
|
||||||
|
|
||||||
|
@if($page->noindex ?? false)
|
||||||
|
@push('seo')
|
||||||
|
<meta name="robots" content="noindex, follow">
|
||||||
|
@endpush
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<section class="mx-auto max-w-2xl px-4 py-20 sm:px-8 sm:py-32">
|
||||||
|
|
||||||
|
<div class="mb-12 text-center">
|
||||||
|
<h1 class="mt-2 font-display text-h3 font-black tracking-tight sm:text-h2" data-stoic="pages/{{ $page->slug }}#name">
|
||||||
|
{{ $page->name }}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="legal-content" data-stoic="pages/{{ $page->slug }}#body">
|
||||||
|
{!! Str::markdown($page->content ?? '') !!}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
@endsection
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
<x-breadcrumb class="mb-14 justify-end" :items="[
|
<x-breadcrumb class="mb-14 justify-end" :items="[
|
||||||
$collection
|
$collection
|
||||||
? ['label' => $collection->translateAttribute('name'), 'href' => '/category/' . $collection->id]
|
? ['label' => $collection->translateAttribute('name'), 'href' => route('category.show', ['collection' => $collection])]
|
||||||
: ['label' => 'Products', 'href' => '/products'],
|
: ['label' => __('general.nav.products'), 'href' => '/products'],
|
||||||
['label' => $product->translateAttribute('name')],
|
['label' => $product->translateAttribute('name')],
|
||||||
]" />
|
]" />
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Http\Controllers\CategoryController;
|
||||||
|
use App\Http\Controllers\ContactController;
|
||||||
use App\Http\Controllers\HomeController;
|
use App\Http\Controllers\HomeController;
|
||||||
|
use App\Http\Controllers\LegalPageController;
|
||||||
use App\Http\Controllers\ProductController;
|
use App\Http\Controllers\ProductController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
@@ -17,6 +20,25 @@
|
|||||||
'product.show',
|
'product.show',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Route::get('/category/{collection}', [CategoryController::class, 'show'])->name(
|
||||||
|
'category.show',
|
||||||
|
);
|
||||||
|
|
||||||
|
Route::get('/contact', [ContactController::class, 'index'])->name('contact');
|
||||||
|
|
||||||
|
Route::get('/terms-and-conditions', [LegalPageController::class, 'terms'])->name(
|
||||||
|
'legal.terms',
|
||||||
|
);
|
||||||
|
Route::get('/shipping-returns', [LegalPageController::class, 'shippingReturns'])->name(
|
||||||
|
'legal.shipping-returns',
|
||||||
|
);
|
||||||
|
Route::get('/privacy-policy', [LegalPageController::class, 'privacy'])->name(
|
||||||
|
'legal.privacy',
|
||||||
|
);
|
||||||
|
Route::get('/cookies-policy', [LegalPageController::class, 'cookies'])->name(
|
||||||
|
'legal.cookies',
|
||||||
|
);
|
||||||
|
|
||||||
Route::get('/__preview/newsletter-split', function () {
|
Route::get('/__preview/newsletter-split', function () {
|
||||||
return view('__preview_newsletter_split');
|
return view('__preview_newsletter_split');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user