@squeditor/squeditor-framework 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/package.json +36 -0
- package/php/functions.php +92 -0
- package/project-template/package.json +29 -0
- package/project-template/postcss.config.js +6 -0
- package/project-template/squeditor.config.js +81 -0
- package/project-template/src/404.php +21 -0
- package/project-template/src/assets/css/squeditor-icons.css +4719 -0
- package/project-template/src/assets/css/tailwind.css +3 -0
- package/project-template/src/assets/css/uikit-components.css +14586 -0
- package/project-template/src/assets/js/gsap-advanced.js +26 -0
- package/project-template/src/assets/js/gsap-init.js +672 -0
- package/project-template/src/assets/js/gsap-modules/cursor-preview.js +132 -0
- package/project-template/src/assets/js/gsap-modules/cursor.js +456 -0
- package/project-template/src/assets/js/gsap-modules/loop-panels.js +78 -0
- package/project-template/src/assets/js/gsap-modules/marquee.js +106 -0
- package/project-template/src/assets/js/gsap-modules/pinned-panels.js +105 -0
- package/project-template/src/assets/js/gsap-modules/scroll-to.js +54 -0
- package/project-template/src/assets/js/gsap-modules/swipe-slider.js +121 -0
- package/project-template/src/assets/js/gsap-modules/text-mask.js +93 -0
- package/project-template/src/assets/js/gsap-modules/tilt.js +70 -0
- package/project-template/src/assets/js/main.js +302 -0
- package/project-template/src/assets/js/uikit-components.js +18171 -0
- package/project-template/src/assets/scss/_base.scss +140 -0
- package/project-template/src/assets/scss/_components.scss +165 -0
- package/project-template/src/assets/scss/_config.scss +13 -0
- package/project-template/src/assets/scss/_functions.scss +81 -0
- package/project-template/src/assets/scss/_tokens.scss +229 -0
- package/project-template/src/assets/scss/_transitions.scss +36 -0
- package/project-template/src/assets/scss/_uikit-overrides.scss +187 -0
- package/project-template/src/assets/scss/_uikit_dynamic.scss +43 -0
- package/project-template/src/assets/scss/_utilities.scss +31 -0
- package/project-template/src/assets/scss/custom.scss +10 -0
- package/project-template/src/assets/scss/main.scss +11 -0
- package/project-template/src/assets/static/fonts/squeditor-icons/squeditor-icons.eot +0 -0
- package/project-template/src/assets/static/fonts/squeditor-icons/squeditor-icons.svg +1183 -0
- package/project-template/src/assets/static/fonts/squeditor-icons/squeditor-icons.ttf +0 -0
- package/project-template/src/assets/static/fonts/squeditor-icons/squeditor-icons.woff +0 -0
- package/project-template/src/config/site-config.php +34 -0
- package/project-template/src/data/blog.php +21 -0
- package/project-template/src/data/portfolio.php +23 -0
- package/project-template/src/data/team.php +23 -0
- package/project-template/src/index.php +57 -0
- package/project-template/src/init.php +19 -0
- package/project-template/src/page-templates/base.php +39 -0
- package/project-template/src/page-templates/body-scripts.php +26 -0
- package/project-template/src/page-templates/head.php +47 -0
- package/project-template/src/page-templates/transition.php +45 -0
- package/project-template/src/sections/cards/cards-grid.php +34 -0
- package/project-template/src/sections/cards/cards-horizontal.php +28 -0
- package/project-template/src/sections/cta/cta-banner.php +34 -0
- package/project-template/src/sections/cta/cta-newsletter.php +19 -0
- package/project-template/src/sections/footer/layout-01.php +35 -0
- package/project-template/src/sections/header/layout-01.php +36 -0
- package/project-template/src/sections/hero/hero-centered.php +44 -0
- package/project-template/src/sections/hero/hero-split.php +132 -0
- package/project-template/src/sections/hero/hero-video.php +22 -0
- package/project-template/src/sections/sidebar/sidebar-right.php +11 -0
- package/project-template/src/template-parts/breadcrumbs.php +17 -0
- package/project-template/src/template-parts/footer.php +74 -0
- package/project-template/src/template-parts/header.php +120 -0
- package/project-template/src/template-parts/mega-menu.php +7 -0
- package/project-template/src/template-parts/nav.php +16 -0
- package/project-template/src/template-parts/page-title-bar.php +14 -0
- package/project-template/tailwind.config.js +26 -0
- package/project-template/vite.config.js +67 -0
- package/scripts/build-components.js +109 -0
- package/scripts/copy-static.js +150 -0
- package/scripts/dev-router.php +23 -0
- package/scripts/dev.js +55 -0
- package/scripts/get-port.js +27 -0
- package/scripts/package-customer.js +278 -0
- package/scripts/package-dist.js +54 -0
- package/scripts/scaffold.js +72 -0
- package/scripts/snapshot.js +74 -0
- package/uikit-manifest.json +248 -0
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/config/site-config.php
|
|
3
|
+
// Global site data — available in all templates via $site
|
|
4
|
+
|
|
5
|
+
$site = [
|
|
6
|
+
'name' => 'My Project',
|
|
7
|
+
'lang' => 'en',
|
|
8
|
+
'logo' => 'assets/static/images/logo.svg',
|
|
9
|
+
'description' => 'Squeditor project starter template.',
|
|
10
|
+
'og_image' => 'assets/static/images/og-default.png',
|
|
11
|
+
'url' => 'https://example.com',
|
|
12
|
+
'page_transition' => 'disabled', // Options: 'curve', 'wave', 'blinds', 'slide', 'disabled'
|
|
13
|
+
'enable_cursor' => false, // Global GSAP Cursor State
|
|
14
|
+
'cursor_config' => '', // Default cursor settings
|
|
15
|
+
|
|
16
|
+
'nav' => [
|
|
17
|
+
['label' => 'Products', 'url' => '#'],
|
|
18
|
+
['label' => 'Pricing', 'url' => '#'],
|
|
19
|
+
['label' => 'About', 'url' => '#'],
|
|
20
|
+
['label' => 'Contact', 'url' => '#'],
|
|
21
|
+
],
|
|
22
|
+
|
|
23
|
+
'socials' => [
|
|
24
|
+
'twitter' => 'https://twitter.com/squeditor',
|
|
25
|
+
'github' => 'https://github.com/squeditor',
|
|
26
|
+
'instagram' => 'https://instagram.com/squeditor',
|
|
27
|
+
],
|
|
28
|
+
|
|
29
|
+
'contact' => [
|
|
30
|
+
'email' => 'hello@example.com',
|
|
31
|
+
'phone' => '+1 555 000 0000',
|
|
32
|
+
'address' => '123 Main Street, City, Country',
|
|
33
|
+
],
|
|
34
|
+
];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/data/blog.php
|
|
3
|
+
|
|
4
|
+
$blog_posts = [
|
|
5
|
+
[
|
|
6
|
+
'title' => 'Getting Started with Squeditor',
|
|
7
|
+
'excerpt' => 'Learn how to build static HTML sites beautifully.',
|
|
8
|
+
'image' => 'assets/static/images/placeholder.png',
|
|
9
|
+
'date' => 'Oct 12, 2026',
|
|
10
|
+
'author' => 'Jane Doe',
|
|
11
|
+
'url' => 'blog/getting-started.html'
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
'title' => 'Tailwind and UIKit3 Combination',
|
|
15
|
+
'excerpt' => 'Why utility-first CSS and component JS play well together.',
|
|
16
|
+
'image' => 'assets/static/images/placeholder.png',
|
|
17
|
+
'date' => 'Oct 20, 2026',
|
|
18
|
+
'author' => 'John Smith',
|
|
19
|
+
'url' => 'blog/tailwind-uikit.html'
|
|
20
|
+
],
|
|
21
|
+
];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/data/portfolio.php
|
|
3
|
+
|
|
4
|
+
$portfolio_items = [
|
|
5
|
+
[
|
|
6
|
+
'title' => 'Tech Startup Website',
|
|
7
|
+
'category' => 'Web Design',
|
|
8
|
+
'image' => 'assets/static/images/placeholder.png',
|
|
9
|
+
'url' => 'portfolio/item-1.html'
|
|
10
|
+
],
|
|
11
|
+
[
|
|
12
|
+
'title' => 'Corporate Rebranding',
|
|
13
|
+
'category' => 'Branding',
|
|
14
|
+
'image' => 'assets/static/images/placeholder.png',
|
|
15
|
+
'url' => 'portfolio/item-2.html'
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
'title' => 'E-Commerce Platform',
|
|
19
|
+
'category' => 'Development',
|
|
20
|
+
'image' => 'assets/static/images/placeholder.png',
|
|
21
|
+
'url' => 'portfolio/item-3.html'
|
|
22
|
+
]
|
|
23
|
+
];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/data/team.php
|
|
3
|
+
|
|
4
|
+
$team_members = [
|
|
5
|
+
[
|
|
6
|
+
'name' => 'Oussama B.',
|
|
7
|
+
'role' => 'Founder',
|
|
8
|
+
'photo' => 'assets/static/images/common/avatars/02.svg',
|
|
9
|
+
'bio' => 'Oussama is the founder of Squeditor.',
|
|
10
|
+
],
|
|
11
|
+
[
|
|
12
|
+
'name' => 'Younes B.',
|
|
13
|
+
'role' => 'Frontend Developer',
|
|
14
|
+
'photo' => 'assets/static/images/common/avatars/01.svg',
|
|
15
|
+
'bio' => 'Younes is the frontend developer of Squeditor.',
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
'name' => 'Anass B.',
|
|
19
|
+
'role' => 'UI Designer/Developer',
|
|
20
|
+
'photo' => 'assets/static/images/common/avatars/10.svg',
|
|
21
|
+
'bio' => 'Anass is the UI designer/developer of Squeditor.',
|
|
22
|
+
]
|
|
23
|
+
];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/index.php
|
|
3
|
+
require_once __DIR__ . '/init.php';
|
|
4
|
+
/*|
|
|
5
|
+
title: Home — Squeditor
|
|
6
|
+
description: A Squeditor project starter template.
|
|
7
|
+
|*/
|
|
8
|
+
|
|
9
|
+
// Page config
|
|
10
|
+
$is_home = true;
|
|
11
|
+
$page_title = 'Home — Squeditor';
|
|
12
|
+
$page_description = 'A Squeditor project starter template.';
|
|
13
|
+
$body_class = 'page-home';
|
|
14
|
+
|
|
15
|
+
// Header config
|
|
16
|
+
// $header_args = [
|
|
17
|
+
// 'layout' => 'layout-01',
|
|
18
|
+
// 'isDark' => false,
|
|
19
|
+
// 'isFloat' => true
|
|
20
|
+
// ];
|
|
21
|
+
|
|
22
|
+
// Footer config
|
|
23
|
+
// $footer_args = [
|
|
24
|
+
// 'layout' => 'layout-01',
|
|
25
|
+
// 'isDark' => true
|
|
26
|
+
// ];
|
|
27
|
+
|
|
28
|
+
// Content
|
|
29
|
+
ob_start();
|
|
30
|
+
?>
|
|
31
|
+
|
|
32
|
+
<section class="py-32 md:py-48 flex items-center justify-center bg-gradient-to-b from-zinc-100 to-transparent" data-uk-height-viewport="offset-top: true">
|
|
33
|
+
<div class="max-w-4xl mx-auto px-6 text-center">
|
|
34
|
+
|
|
35
|
+
<h2 class="text-6xl font-bold tracking-tight mb-8 lg:px-8">
|
|
36
|
+
Start building<span class="opacity-30"> creative websites</span> with Squeditor
|
|
37
|
+
</h2>
|
|
38
|
+
|
|
39
|
+
<p class="text-xl text-muted max-w-2xl mx-auto font-light leading-relaxed mb-12">
|
|
40
|
+
You can now begin creating interactive GSAP experiences, modifying the UIKit configuration, and adding content to your template files.
|
|
41
|
+
</p>
|
|
42
|
+
|
|
43
|
+
<div class="flex items-center justify-center gap-4">
|
|
44
|
+
<a href="https://squeditor.com/" class="btn btn-lg btn-secondary !px-8 !py-3 !rounded-full text-white font-medium hover:scale-105 transition-transform">
|
|
45
|
+
Try Squeditor
|
|
46
|
+
</a>
|
|
47
|
+
<a href="https://docs.squeditor.com/" class="btn btn-lg !px-8 !py-3 !rounded-full text-white font-medium !border !border-1 !border-solid !border-zinc-200 hover:scale-105 transition-transform">
|
|
48
|
+
View Docs
|
|
49
|
+
</a>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
</div>
|
|
53
|
+
</section>
|
|
54
|
+
|
|
55
|
+
<?php
|
|
56
|
+
$content = ob_get_clean();
|
|
57
|
+
require SRC_PATH . '/page-templates/base.php';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/init.php
|
|
3
|
+
|
|
4
|
+
// Require framework helpers
|
|
5
|
+
require_once __DIR__ . '/../../squeditor-framework/php/functions.php';
|
|
6
|
+
|
|
7
|
+
// Require site-wide config
|
|
8
|
+
require_once __DIR__ . '/config/site-config.php';
|
|
9
|
+
|
|
10
|
+
// Define SRC_PATH for get_template_part() calls
|
|
11
|
+
define('SRC_PATH', __DIR__);
|
|
12
|
+
|
|
13
|
+
// Global Theme & Schema Detection
|
|
14
|
+
$active_theme = $_GET['theme'] ?? 'default';
|
|
15
|
+
$active_schema = $_GET['schema'] ?? 'light';
|
|
16
|
+
|
|
17
|
+
// Add to site config for template access
|
|
18
|
+
$site['theme'] = $active_theme;
|
|
19
|
+
$site['schema'] = $active_schema;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/page-templates/base.php
|
|
3
|
+
|
|
4
|
+
// Page defaults (overridden by individual pages before including base.php)
|
|
5
|
+
$page_title = $page_title ?? $site['name'];
|
|
6
|
+
$page_description = $page_description ?? $site['description'];
|
|
7
|
+
$page_og_image = $page_og_image ?? $site['og_image'];
|
|
8
|
+
// Global body classes derived from theme/schema
|
|
9
|
+
$theme_class = 'theme-' . htmlspecialchars($site['theme']);
|
|
10
|
+
$schema_class = 'sq-theme-' . htmlspecialchars($site['schema']);
|
|
11
|
+
$body_class = trim($theme_class . ' ' . $schema_class . ' ' . ($body_class ?? ''));
|
|
12
|
+
|
|
13
|
+
?>
|
|
14
|
+
<!DOCTYPE html>
|
|
15
|
+
<html lang="<?= $site['lang'] ?? 'en' ?>">
|
|
16
|
+
<head>
|
|
17
|
+
<?php require __DIR__ . '/head.php'; ?>
|
|
18
|
+
<?php if (isset($extra_head)) echo $extra_head; ?>
|
|
19
|
+
</head>
|
|
20
|
+
<?php
|
|
21
|
+
$enable_cursor = $enable_cursor ?? ($site['enable_cursor'] ?? true);
|
|
22
|
+
$cursor_config = $cursor_config ?? ($site['cursor_config'] ?? '');
|
|
23
|
+
?>
|
|
24
|
+
<body class="<?= htmlspecialchars($body_class) ?>" <?= $body_attr ?? '' ?> data-sq-transition="<?= htmlspecialchars($site['page_transition'] ?? 'curve') ?>" <?php if ($enable_cursor): ?>data-sq-cursor="<?= htmlspecialchars($cursor_config) ?>"<?php endif; ?>>
|
|
25
|
+
|
|
26
|
+
<?php get_template_part('header', $header_args ?? []); ?>
|
|
27
|
+
|
|
28
|
+
<main id="main-content">
|
|
29
|
+
<?php echo $content ?? ''; ?>
|
|
30
|
+
</main>
|
|
31
|
+
|
|
32
|
+
<?php get_template_part('footer', $footer_args ?? []); ?>
|
|
33
|
+
|
|
34
|
+
<?php require __DIR__ . '/body-scripts.php'; ?>
|
|
35
|
+
<?php if (isset($extra_footer)) echo $extra_footer; ?>
|
|
36
|
+
<?php require __DIR__ . '/transition.php'; ?>
|
|
37
|
+
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/page-templates/body-scripts.php
|
|
3
|
+
|
|
4
|
+
$is_snapshot = getenv('SQUEDITOR_SNAPSHOT') === '1' || (isset($_GET['snapshot']) && $_GET['snapshot'] === '1');
|
|
5
|
+
$vite_port = getenv('SQUEDITOR_VITE_PORT') ?: '5173';
|
|
6
|
+
$vite_server = "http://127.0.0.1:{$vite_port}";
|
|
7
|
+
$is_vite = false;
|
|
8
|
+
|
|
9
|
+
if (!$is_snapshot) {
|
|
10
|
+
$fp = @fsockopen('127.0.0.1', $vite_port, $errno, $errstr, 0.05);
|
|
11
|
+
if ($fp) {
|
|
12
|
+
$is_vite = true;
|
|
13
|
+
fclose($fp);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if ($is_vite):
|
|
18
|
+
?>
|
|
19
|
+
<!-- Vite Development Scripts -->
|
|
20
|
+
<script src="<?= $vite_server ?>/assets/js/uikit-components.js"></script>
|
|
21
|
+
<script src="<?= $vite_server ?>/assets/js/main.js" type="module"></script>
|
|
22
|
+
<?php else: ?>
|
|
23
|
+
<!-- Production Static Scripts -->
|
|
24
|
+
<script src="assets/js/uikit-components.js"></script>
|
|
25
|
+
<script src="assets/js/main.js" type="module"></script>
|
|
26
|
+
<?php endif; ?>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/page-templates/head.php
|
|
3
|
+
|
|
4
|
+
$is_snapshot = getenv('SQUEDITOR_SNAPSHOT') === '1' || (isset($_GET['snapshot']) && $_GET['snapshot'] === '1');
|
|
5
|
+
$vite_port = getenv('SQUEDITOR_VITE_PORT') ?: '5173';
|
|
6
|
+
$vite_server = "http://127.0.0.1:{$vite_port}";
|
|
7
|
+
$is_vite = false;
|
|
8
|
+
|
|
9
|
+
if (!$is_snapshot) {
|
|
10
|
+
$fp = @fsockopen('127.0.0.1', $vite_port, $errno, $errstr, 0.05);
|
|
11
|
+
if ($fp) {
|
|
12
|
+
$is_vite = true;
|
|
13
|
+
fclose($fp);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
?>
|
|
17
|
+
<meta charset="UTF-8">
|
|
18
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
19
|
+
<title><?= htmlspecialchars($page_title) ?></title>
|
|
20
|
+
<meta name="description" content="<?= htmlspecialchars($page_description) ?>">
|
|
21
|
+
|
|
22
|
+
<!-- Typography -->
|
|
23
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
24
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
25
|
+
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+Arabic:wght@100;200;300;400;500;600;700&family=TASA+Orbiter:wght@400..800&display=swap" rel="stylesheet">
|
|
26
|
+
|
|
27
|
+
<!-- Open Graph -->
|
|
28
|
+
<meta property="og:title" content="<?= htmlspecialchars($page_title) ?>">
|
|
29
|
+
<meta property="og:description" content="<?= htmlspecialchars($page_description) ?>">
|
|
30
|
+
<meta property="og:image" content="assets/static/images/og-default.png">
|
|
31
|
+
<meta property="og:type" content="website">
|
|
32
|
+
|
|
33
|
+
<!-- Squeditor CSS -->
|
|
34
|
+
<?php if ($is_vite): ?>
|
|
35
|
+
<!-- Vite Development Environment -->
|
|
36
|
+
<script type="module" src="<?= $vite_server ?>/@vite/client"></script>
|
|
37
|
+
<link rel="stylesheet" href="<?= $vite_server ?>/assets/css/tailwind.css">
|
|
38
|
+
<link rel="stylesheet" href="<?= $vite_server ?>/assets/css/squeditor-icons.css">
|
|
39
|
+
<script type="module" src="<?= $vite_server ?>/assets/scss/main.scss"></script>
|
|
40
|
+
<style>html.js-fouc { opacity: 0; transition: opacity 0.15s ease-out; }</style>
|
|
41
|
+
<script>document.documentElement.classList.add('js-fouc');</script>
|
|
42
|
+
<?php else: ?>
|
|
43
|
+
<!-- Production Static Assets -->
|
|
44
|
+
<link rel="stylesheet" href="assets/css/squeditor-icons.css">
|
|
45
|
+
<link rel="stylesheet" href="assets/css/tailwind.css">
|
|
46
|
+
<link rel="stylesheet" href="assets/css/main_css.css">
|
|
47
|
+
<?php endif; ?>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/page-templates/transition.php
|
|
3
|
+
|
|
4
|
+
$transition = $site['page_transition'] ?? 'curve';
|
|
5
|
+
if ($transition !== 'disabled'):
|
|
6
|
+
?>
|
|
7
|
+
<div class="sq-page-transition transition-<?= htmlspecialchars($transition) ?>" aria-hidden="true">
|
|
8
|
+
<?php if ($transition === 'curve'): ?>
|
|
9
|
+
<svg class="shape-overlays" viewBox="0 0 100 100" preserveAspectRatio="none">
|
|
10
|
+
<defs>
|
|
11
|
+
<linearGradient id="sq-grad-1" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
12
|
+
<stop offset="0%" stop-color="var(--sq-page-transition-from)" />
|
|
13
|
+
<stop offset="100%" stop-color="var(--sq-page-transition-to)" />
|
|
14
|
+
</linearGradient>
|
|
15
|
+
<linearGradient id="sq-grad-2" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
16
|
+
<stop offset="0%" stop-color="var(--sq-page-transition-to)" />
|
|
17
|
+
<stop offset="100%" stop-color="var(--sq-page-transition-from)" />
|
|
18
|
+
</linearGradient>
|
|
19
|
+
</defs>
|
|
20
|
+
<path class="shape-overlays__path" fill="url(#sq-grad-2)"></path>
|
|
21
|
+
<path class="shape-overlays__path" fill="url(#sq-grad-1)"></path>
|
|
22
|
+
</svg>
|
|
23
|
+
<?php elseif ($transition === 'wave'): ?>
|
|
24
|
+
<svg class="sq-transition-svg" viewBox="0 0 100 100" preserveAspectRatio="none">
|
|
25
|
+
<defs>
|
|
26
|
+
<linearGradient id="sq-grad-wave" x1="0" y1="0" x2="99" y2="99" gradientUnits="userSpaceOnUse">
|
|
27
|
+
<stop offset="0.2" stop-color="var(--sq-page-transition-from)" />
|
|
28
|
+
<stop offset="0.7" stop-color="var(--sq-page-transition-to)" />
|
|
29
|
+
</linearGradient>
|
|
30
|
+
</defs>
|
|
31
|
+
<path class="sq-transition-path" stroke="url(#sq-grad-wave)" fill="url(#sq-grad-wave)" stroke-width="0" vector-effect="non-scaling-stroke" d="M 0 0 V 100 Q 50 100 100 100 V 0 z"></path>
|
|
32
|
+
</svg>
|
|
33
|
+
<?php elseif ($transition === 'slide'): ?>
|
|
34
|
+
<div class="sq-transition-slide w-full h-full bg-gradient-to-t from-transition-from via-transition-via to-transition-to"></div>
|
|
35
|
+
<?php elseif ($transition === 'blinds'): ?>
|
|
36
|
+
<div class="sq-transition-blinds flex w-full h-full">
|
|
37
|
+
<div class="blind-strip flex-1 h-full bg-gradient-to-t from-transition-from via-transition-via to-transition-to"></div>
|
|
38
|
+
<div class="blind-strip flex-1 h-full bg-gradient-to-t from-transition-from via-transition-via to-transition-to"></div>
|
|
39
|
+
<div class="blind-strip flex-1 h-full bg-gradient-to-t from-transition-from via-transition-via to-transition-to"></div>
|
|
40
|
+
<div class="blind-strip flex-1 h-full bg-gradient-to-t from-transition-from via-transition-via to-transition-to"></div>
|
|
41
|
+
<div class="blind-strip flex-1 h-full bg-gradient-to-t from-transition-from via-transition-via to-transition-to"></div>
|
|
42
|
+
</div>
|
|
43
|
+
<?php endif; ?>
|
|
44
|
+
</div>
|
|
45
|
+
<?php endif; ?>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/sections/cards/cards-grid.php
|
|
3
|
+
$items = $items ?? [];
|
|
4
|
+
$badge = $badge ?? '';
|
|
5
|
+
$heading = $heading ?? '';
|
|
6
|
+
$subheading = $subheading ?? '';
|
|
7
|
+
?>
|
|
8
|
+
<section class="py-32">
|
|
9
|
+
<div class="max-w-7xl mx-auto px-6">
|
|
10
|
+
<?php if ($heading): ?>
|
|
11
|
+
<div class="text-center mb-20 max-w-3xl mx-auto">
|
|
12
|
+
<?php if ($badge): ?>
|
|
13
|
+
<span class="text-xs font-black tracking-widest text-secondary block mb-4"><?= htmlspecialchars($badge) ?></span>
|
|
14
|
+
<?php endif; ?>
|
|
15
|
+
<h2 class="text-3xl md:text-5xl font-bold mb-6"><?= htmlspecialchars($heading) ?></h2>
|
|
16
|
+
<p class="text-lg text-muted leading-relaxed"><?= htmlspecialchars($subheading) ?></p>
|
|
17
|
+
</div>
|
|
18
|
+
<?php endif; ?>
|
|
19
|
+
|
|
20
|
+
<div class="grid grid-cols-2 md:grid-cols-4 gap-x-6 gap-y-6">
|
|
21
|
+
<?php foreach ($items as $card): ?>
|
|
22
|
+
<div class="sq-card">
|
|
23
|
+
<?php if (!empty($card['icon'])): ?>
|
|
24
|
+
<div class="sq-icon-wrapper text-secondary mb-6">
|
|
25
|
+
<i class="text-2xl <?= htmlspecialchars($card['icon']) ?>"></i>
|
|
26
|
+
</div>
|
|
27
|
+
<?php endif; ?>
|
|
28
|
+
<h3 class="text-lg font-bold mb-3"><?= htmlspecialchars($card['title'] ?? 'Card Title') ?></h3>
|
|
29
|
+
<p class="text-sm text-muted leading-relaxed"><?= htmlspecialchars($card['excerpt'] ?? 'Card description text.') ?></p>
|
|
30
|
+
</div>
|
|
31
|
+
<?php endforeach; ?>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</section>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/sections/cards/cards-horizontal.php
|
|
3
|
+
$items = $items ?? [];
|
|
4
|
+
?>
|
|
5
|
+
<section class="py-20">
|
|
6
|
+
<div class="max-w-5xl mx-auto px-6 space-y-12">
|
|
7
|
+
<?php foreach ($items as $card): ?>
|
|
8
|
+
<div class="relative group flex flex-col md:flex-row sq-card !p-0 overflow-hidden shadow-sm">
|
|
9
|
+
<div class="w-64 h-64">
|
|
10
|
+
<img src="<?= htmlspecialchars($card['image'] ?? 'assets/static/images/placeholder.png') ?>" class="w-full h-full object-cover" alt="">
|
|
11
|
+
</div>
|
|
12
|
+
<div class="p-8 md:w-2/3 flex flex-col justify-center">
|
|
13
|
+
<h3 class="text-2xl font-bold mb-3 tracking-tight"><?= htmlspecialchars($card['title'] ?? 'Title') ?></h3>
|
|
14
|
+
<p class="leading-relaxed opacity-60"><?= htmlspecialchars($card['excerpt'] ?? 'Description') ?></p>
|
|
15
|
+
<ul class="mt-4 leading-relaxed">
|
|
16
|
+
<?php foreach ($card['features'] as $feature): ?>
|
|
17
|
+
<li class="flex items-center gap-2"><i class="sq-icon-chevron-right opacity-30"></i> <?= htmlspecialchars($feature) ?></li>
|
|
18
|
+
<?php endforeach; ?>
|
|
19
|
+
</ul>
|
|
20
|
+
<span class="absolute top-6 end-6 w-10 h-10 p-0 rounded-full flex items-center justify-center border border-zinc-200 dark:border-zinc-800 group-hover:-rotate-45 transition-transform duration-300">
|
|
21
|
+
<i class="sq-icon-arrow-right"></i>
|
|
22
|
+
</span>
|
|
23
|
+
</div>
|
|
24
|
+
<a href="#" class="absolute inset-0"></a>
|
|
25
|
+
</div>
|
|
26
|
+
<?php endforeach; ?>
|
|
27
|
+
</div>
|
|
28
|
+
</section>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/sections/cta/cta-banner.php
|
|
3
|
+
$heading = $heading ?? 'Ready to start?';
|
|
4
|
+
$subheading = $subheading ?? '';
|
|
5
|
+
$button_text = $button_text ?? 'Get Started';
|
|
6
|
+
$button_url = $button_url ?? '#';
|
|
7
|
+
$secondary_button_text = $secondary_button_text ?? '';
|
|
8
|
+
$hint_text = $hint_text ?? '';
|
|
9
|
+
?>
|
|
10
|
+
<section class="py-32 text-center border-t border-zinc-300 border-opacity-30 dark:border-opacity-5">
|
|
11
|
+
<div class="max-w-4xl mx-auto px-6">
|
|
12
|
+
<h2 class="text-4xl md:text-5xl font-bold mb-4 tracking-tighter">
|
|
13
|
+
<?= $heading ?>
|
|
14
|
+
</h2>
|
|
15
|
+
<p class="text-lg mb-10 leading-relaxed max-w-2xl mx-auto text-muted">
|
|
16
|
+
<?= htmlspecialchars($subheading) ?>
|
|
17
|
+
</p>
|
|
18
|
+
<div class="flex flex-col sm:flex-row items-center justify-center gap-4">
|
|
19
|
+
<a href="<?= htmlspecialchars($button_url) ?>" class="btn btn-secondary btn-lg w-full sm:w-auto hover:shadow-xl transition-all hover:-translate-y-1">
|
|
20
|
+
<?= htmlspecialchars($button_text) ?>
|
|
21
|
+
</a>
|
|
22
|
+
<?php if ($secondary_button_text): ?>
|
|
23
|
+
<a href="#" class="btn btn-ghost btn-lg w-full sm:w-auto transition-all">
|
|
24
|
+
<?= htmlspecialchars($secondary_button_text) ?>
|
|
25
|
+
</a>
|
|
26
|
+
<?php endif; ?>
|
|
27
|
+
</div>
|
|
28
|
+
<?php if ($hint_text): ?>
|
|
29
|
+
<div class="mt-3">
|
|
30
|
+
<span class="text-sm text-muted"><?= htmlspecialchars($hint_text) ?></span>
|
|
31
|
+
</div>
|
|
32
|
+
<?php endif; ?>
|
|
33
|
+
</div>
|
|
34
|
+
</section>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/sections/cta/cta-newsletter.php
|
|
3
|
+
$heading = $heading ?? 'Subscribe to our newsletter';
|
|
4
|
+
$subheading = $subheading ?? 'Get the latest updates and news from our team.';
|
|
5
|
+
?>
|
|
6
|
+
<section class="py-20 bg-zinc-50 dark:bg-zinc-800 dark:bg-opacity-40">
|
|
7
|
+
<div class="max-w-7xl mx-auto px-6 flex flex-col items-center justify-between gap-8">
|
|
8
|
+
<div class="mb-8 md:mb-0 md:w-1/2">
|
|
9
|
+
<h2 class="text-4xl font-bold text-center m-0"><?= htmlspecialchars($heading) ?></h2>
|
|
10
|
+
<p class="text-center mt-4"><?= htmlspecialchars($subheading) ?></p>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="md:w-1/2 w-full">
|
|
13
|
+
<form class="flex w-full">
|
|
14
|
+
<input type="email" placeholder="Your email address" class="form-input !rounded-r-none h-12">
|
|
15
|
+
<button type="submit" class="btn btn-lg btn-secondary !rounded-l-none h-12 px-6">Subscribe</button>
|
|
16
|
+
</form>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</section>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/sections/footer/layout-01.php
|
|
3
|
+
// Custom footer layout example triggered by $footer_args['layout'] = 'layout-01'
|
|
4
|
+
|
|
5
|
+
$isDark = $isDark ?? false;
|
|
6
|
+
$footerClasses = 'sq--footer py-16';
|
|
7
|
+
if ($isDark) $footerClasses .= ' bg-zinc-900 text-white';
|
|
8
|
+
else $footerClasses .= ' bg-zinc-50 border-t';
|
|
9
|
+
?>
|
|
10
|
+
<footer id="sq_footer_01" class="<?= htmlspecialchars($footerClasses) ?>">
|
|
11
|
+
<div class="max-w-7xl mx-auto px-6">
|
|
12
|
+
|
|
13
|
+
<div class="flex flex-col md:flex-row justify-between items-center gap-8 mb-12">
|
|
14
|
+
<div>
|
|
15
|
+
<h2 class="text-3xl font-bold mb-4">Let's build something great.</h2>
|
|
16
|
+
<p class="opacity-70 max-w-md">Layout 01 features a simplified, high-impact footer designed to drive immediate conversions.</p>
|
|
17
|
+
</div>
|
|
18
|
+
<a href="register.html" class="btn btn-lg btn-accent rounded-full px-8 shadow-xl hover:-translate-y-1 transition-transform">Start your free trial</a>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<hr class="border-zinc-200 dark:border-zinc-800 mb-8">
|
|
22
|
+
|
|
23
|
+
<div class="flex flex-col md:flex-row justify-between items-center gap-4 text-sm opacity-60">
|
|
24
|
+
<p>© <?= date('Y') ?> <?= htmlspecialchars($site['name']) ?>. Layout 01 Active.</p>
|
|
25
|
+
<div class="flex gap-6">
|
|
26
|
+
<?php foreach ($site['socials'] as $platform => $url): ?>
|
|
27
|
+
<a href="<?= htmlspecialchars($url) ?>" class="hover:text-primary transition-colors">
|
|
28
|
+
<span data-uk-icon="icon: <?= htmlspecialchars($platform) ?>; ratio: 0.8"></span>
|
|
29
|
+
</a>
|
|
30
|
+
<?php endforeach; ?>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
</div>
|
|
35
|
+
</footer>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/sections/header/layout-01.php
|
|
3
|
+
|
|
4
|
+
$isDark = $isDark ?? false;
|
|
5
|
+
$isFloat = $isFloat ?? false;
|
|
6
|
+
|
|
7
|
+
$headerClasses = 'sq--header w-full z-[1000]';
|
|
8
|
+
if ($isFloat) $headerClasses .= ' absolute top-0';
|
|
9
|
+
if ($isDark) $headerClasses .= ' dark-mode text-white bg-zinc-900';
|
|
10
|
+
else $headerClasses .= ' bg-white border-b';
|
|
11
|
+
?>
|
|
12
|
+
<header id="sq_header_01" class="<?= htmlspecialchars($headerClasses) ?>" data-uk-sticky="top: 80; cls-active: shadow-md border-b-0; animation: uk-animation-slide-top">
|
|
13
|
+
<div class="max-w-7xl mx-auto px-6 h-24 flex items-center justify-between">
|
|
14
|
+
|
|
15
|
+
<!-- Logo Left -->
|
|
16
|
+
<a href="index.html" class="sq--logo flex items-center gap-3 group">
|
|
17
|
+
<div class="w-8 h-8 bg-secondary text-white rounded-full flex items-center justify-center transition-transform group-hover:rotate-12">
|
|
18
|
+
<i class="sq-icon-zap"></i>
|
|
19
|
+
</div>
|
|
20
|
+
<div>
|
|
21
|
+
<h1 class="font-bold text-2xl m-0 leading-none"><?= htmlspecialchars($site['name']) ?></h1>
|
|
22
|
+
</div>
|
|
23
|
+
</a>
|
|
24
|
+
|
|
25
|
+
<!-- Desktop Nav Right -->
|
|
26
|
+
<div class="hidden md:flex items-center gap-8">
|
|
27
|
+
<?php get_template_part('nav'); ?>
|
|
28
|
+
<a href="contact.html" class="btn btn-secondary btn-md rounded-full px-6">Get in Touch</a>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<!-- Mobile Toggle -->
|
|
32
|
+
<button class="md:hidden" data-uk-toggle="target: #sq_mobile_offcanvas" type="button" aria-label="Menu">
|
|
33
|
+
<span data-uk-icon="icon: menu; ratio: 1.2"></span>
|
|
34
|
+
</button>
|
|
35
|
+
</div>
|
|
36
|
+
</header>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// src/sections/hero/hero-centered.php
|
|
3
|
+
$badge = $badge ?? '';
|
|
4
|
+
$heading = $heading ?? 'Welcome to Our Website';
|
|
5
|
+
$subheading = $subheading ?? 'We build things that work.';
|
|
6
|
+
$cta_primary_text = $cta_primary_text ?? 'Get Started';
|
|
7
|
+
$cta_primary_url = $cta_primary_url ?? '#';
|
|
8
|
+
$cta_secondary_text = $cta_secondary_text ?? 'View Demo';
|
|
9
|
+
$cta_secondary_url = $cta_secondary_url ?? '#';
|
|
10
|
+
$mockup_image = $mockup_image ?? '';
|
|
11
|
+
?>
|
|
12
|
+
<section class="relative pt-24 pb-0 text-center overflow-hidden" data-uk-height-viewport="min-height: 600px; offset-top: true;">
|
|
13
|
+
<div class="absolute top-0 left-0 right-0 bg-gradient-to-t from-black/5 dark:from-white/5 to-transparent -z-10" data-uk-height-viewport="min-height: 600px; offset-top: true;"></div>
|
|
14
|
+
<div class="max-w-4xl mx-auto px-6">
|
|
15
|
+
<?php if ($badge): ?>
|
|
16
|
+
<span class="sq-badge"><?= htmlspecialchars($badge) ?></span>
|
|
17
|
+
<?php endif; ?>
|
|
18
|
+
|
|
19
|
+
<h1 class="text-4xl md:text-7xl mb-6 leading-tight tracking-tighter">
|
|
20
|
+
<?= $heading ?>
|
|
21
|
+
</h1>
|
|
22
|
+
|
|
23
|
+
<p class="text-lg md:text-xl mb-10 max-w-2xl mx-auto leading-relaxed text-muted">
|
|
24
|
+
<?= htmlspecialchars($subheading) ?>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 mb-20">
|
|
28
|
+
<a href="<?= htmlspecialchars($cta_primary_url) ?>" class="btn btn-secondary btn-lg w-full sm:w-auto hover:shadow-xl hover:-translate-y-1">
|
|
29
|
+
<?= htmlspecialchars($cta_primary_text) ?>
|
|
30
|
+
</a>
|
|
31
|
+
<a href="<?= htmlspecialchars($cta_secondary_url) ?>" class="btn btn-ghost !border-2 !border-solid hover:!border-black/20 dark:!border-white/10 dark:hover:!border-white/20 !bg-transparent btn-lg w-full sm:w-auto hover:shadow-xl hover:-translate-y-1">
|
|
32
|
+
<?= htmlspecialchars($cta_secondary_text) ?>
|
|
33
|
+
</a>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<?php if ($mockup_image): ?>
|
|
37
|
+
<div class="relative max-w-6xl mx-auto px-4 md:px-10">
|
|
38
|
+
<div class="rounded-t-2xl border-x border-t border-zinc-100 shadow-2xl p-2 pb-0 bg-white/50 backdrop-blur-sm">
|
|
39
|
+
<img src="<?= htmlspecialchars($mockup_image) ?>" class="w-full rounded-t-xl shadow-lg border border-zinc-100" alt="App Mockup">
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<?php endif; ?>
|
|
43
|
+
</div>
|
|
44
|
+
</section>
|