feat: change to other sitepakage

This commit is contained in:
2024-12-12 12:31:41 +01:00
parent 948513cc41
commit 2bac342a5e
147 changed files with 1060 additions and 28057 deletions

View File

@@ -0,0 +1,70 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
# CSS-Files
[*.css]
indent_style = space
indent_size = 4
# HTML-Files
[*.html]
indent_style = space
indent_size = 4
# TMPL-Files
[*.tmpl]
indent_style = space
indent_size = 4
# JS-Files
[*.js]
indent_style = space
indent_size = 4
# PHP-Files
[*.php]
indent_style = space
indent_size = 4
# MD-Files
[*.md]
indent_style = space
indent_size = 4
# ReST-Files
[*.rst]
indent_style = space
indent_size = 3
# TypoScript
[*.typoscript]
indent_style = space
indent_size = 4
# YML-Files
[{*.yml,*.yaml}]
indent_style = space
indent_size = 2
# package.json
[package.json]
indent_style = space
indent_size = 2
# composer.json
[composer.json]
indent_style = space
indent_size = 4
# phpstan
[*.neon]
indent_style = tab

View File

@@ -0,0 +1,2 @@
Order deny,allow
Deny from all

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,2 @@
Order deny,allow
Deny from all

View File

@@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Directive;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Mutation;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\MutationCollection;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\MutationMode;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Scope;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\SourceKeyword;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\SourceScheme;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\UriValue;
use TYPO3\CMS\Core\Type\Map;
return Map::fromEntries([
// Provide declarations for the backend
Scope::backend(),
// NOTICE: When using `MutationMode::Set` existing declarations will be overridden
new MutationCollection(
// Results in `default-src 'self'`
new Mutation(
MutationMode::Set,
Directive::DefaultSrc,
SourceKeyword::self,
),
// Extends the ancestor directive ('default-src'),
// thus reuses 'self' and adds additional sources
// Results in `img-src 'self' data: https://*.typo3.org`
new Mutation(
MutationMode::Extend,
Directive::ImgSrc,
SourceScheme::data,
new UriValue('https://*.typo3.org'),
),
// NOTICE: the following two instructions for `Directive::ImgSrc` are identical to the previous instruction,
// `MutationMode::Extend` is a shortcut for `MutationMode::InheritOnce` and `MutationMode::Append`
// new Mutation(MutationMode::InheritOnce, Directive::ImgSrc, SourceScheme::data),
// new Mutation(MutationMode::Append, Directive::ImgSrc, SourceScheme::data, new UriValue('https://*.typo3.org')),
// Extends the ancestor directive ('default-src'),
// thus reuses 'self' and adds additional sources
// Results in `script-src 'self' 'nonce-[random]'`
// ('nonce-proxy' is substituted when compiling the policy)
new Mutation(
MutationMode::Extend,
Directive::ScriptSrc,
SourceKeyword::nonceProxy,
),
// Sets (overrides) the directive,
// thus ignores 'self' of the 'default-src' directive
// Results in `worker-src blob:`
new Mutation(
MutationMode::Set,
Directive::WorkerSrc,
SourceScheme::blob,
),
),
]);

View File

@@ -0,0 +1,42 @@
imports:
- { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
- { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
- { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }
editor:
config:
contentsCss: "EXT:base/Resources/Public/Css/rte.css"
stylesSet:
- { name: "Lead", element: "p", attributes: { 'class': 'lead' } }
toolbarGroups:
- { name: styles, groups: [ format, styles ] }
- { name: basicstyles, groups: [ basicstyles ] }
- { name: paragraph, groups: [ list, indent, blocks, align ] }
- "/"
- { name: links, groups: [ links ] }
- { name: clipboard, groups: [ clipboard, cleanup, undo ] }
- { name: editing, groups: [ spellchecker ] }
- { name: insert, groups: [ insert ] }
- { name: tools, groups: [ table, specialchar ] }
- { name: document, groups: [ mode ] }
format_tags: "p;h1;h2;h3;h4;h5;pre"
justifyClasses:
- text-left
- text-center
- text-right
- text-justify
extraPlugins:
- justify
removePlugins:
- image
removeButtons:
- Anchor
- Underline
- Strike

View File

@@ -0,0 +1,47 @@
#
# BACKENDLAYOUT: DEFAULT
#
mod {
web_layout {
BackendLayouts {
default {
title = Default
config {
backend_layout {
colCount = 12
rowCount = 2
rows {
1 {
columns {
1 {
name = LLL:EXT:base/Resources/Private/Language/locallang_be.xlf:backend_layout.column.normal
colPos = 0
colspan = 12
identifier = main
}
}
}
2 {
columns {
1 {
name = Footer Left
colPos = 90
colspan = 6
identifier = footer-left
}
2 {
name = Footer Right
colPos = 91
colspan = 6
identifier = footer-right
}
}
}
}
}
}
icon = EXT:test/Resources/Public/Icons/BackendLayouts/example.svg
}
}
}
}

View File

@@ -0,0 +1,71 @@
lib.dynamicContent = COA
lib.dynamicContent {
5 = LOAD_REGISTER
5 {
colPos.cObject = TEXT
colPos.cObject {
field = colPos
ifEmpty.cObject = TEXT
ifEmpty.cObject {
value.current = 1
ifEmpty = 0
}
}
slide.cObject = TEXT
slide.cObject {
override {
field = slide
if {
isInList.field = slide
value = -1, 0, 1, 2
}
}
ifEmpty = 0
}
pageUid.cObject = TEXT
pageUid.cObject {
field = pageUid
ifEmpty.data = TSFE:id
}
contentFromPid.cObject = TEXT
contentFromPid.cObject {
data = DB:pages:{register:pageUid}:content_from_pid
data.insertData = 1
}
wrap.cObject = TEXT
wrap.cObject {
field = wrap
}
elementWrap.cObject = TEXT
elementWrap.cObject {
field = elementWrap
}
}
20 = CONTENT
20 {
table = tt_content
select {
includeRecordsWithoutDefaultTranslation = 1
orderBy = sorting
where = {#colPos}={register:colPos}
where.insertData = 1
pidInList.data = register:pageUid
pidInList.override.data = register:contentFromPid
}
slide = {register:slide}
slide.insertData = 1
renderObj {
stdWrap {
dataWrap = {register:elementWrap}
required = 1
}
}
stdWrap {
dataWrap = {register:wrap}
required = 1
}
}
90 = RESTORE_REGISTER
}
lib.dynamicContentSlide =< lib.dynamicContent
lib.dynamicContentSlide.20.slide = -1

View File

@@ -0,0 +1,36 @@
################
#### CONFIG ####
################
config {
absRefPrefix = auto
no_cache = {$config.no_cache}
uniqueLinkVars = 1
pageTitleFirst = 1
linkVars = L
prefixLocalAnchors = {$config.prefixLocalAnchors}
renderCharset = utf-8
metaCharset = utf-8
doctype = html5
removeDefaultJS = {$config.removeDefaultJS}
inlineStyle2TempFile = 1
admPanel = {$config.admPanel}
debug = 0
cache_period = 86400
sendCacheHeaders = {$config.sendCacheHeaders}
intTarget =
extTarget =
disablePrefixComment = 1
index_enable = 1
index_externals = 1
index_metatags = 1
headerComment = {$config.headerComment}
// Disable Image Upscaling
noScaleUp = 1
// Compression and Concatenation of CSS and JS Files
compressJs = 1
compressCss = 1
concatenateJs = 1
concatenateCss = 1
}

View File

@@ -0,0 +1,79 @@
##############
#### PAGE ####
##############
page = PAGE
page {
typeNum = 0
shortcutIcon = EXT:base/Resources/Public/Icons/favicon.ico
10 = PAGEVIEW
10 {
paths {
0 = EXT:base/Resources/Private/PageView/
1 = {$page.pageview.paths}
}
dataProcessing {
10 = files
10 {
references.fieldName = media
}
20 = menu
20 {
levels = 2
includeSpacer = 1
as = mainnavigation
}
30 = page-content
}
}
meta {
viewport = {$page.meta.viewport}
robots = {$page.meta.robots}
apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable}
X-UA-Compatible = {$page.meta.compatible}
X-UA-Compatible {
attribute = http-equiv
}
}
includeCSSLibs {
}
includeCSS {
main = EXT:base/Resources/Public/Scss/main.scss
}
includeJSLibs {
navigation = EXT:base/Resources/Public/JavaScript/navigation.js
}
includeJS {
}
includeJSFooterlibs {
}
includeJSFooter {
test_scripts = EXT:base/Resources/Public/JavaScript/main.js
}
}
<INCLUDE_TYPOSCRIPT: source="DIR:EXT:base/ContentBlocks" extensions="typoscript">
lib.contentElement {
layoutRootPaths {
0 = EXT:base/Resources/Private/ContentElements/Layouts/
}
}
lib.contentBlock {
partialRootPaths.0 < lib.contentElement.partialRootPaths.0
layoutRootPaths.0 < lib.contentElement.layoutRootPaths.0
settings < lib.contentElement.settings
}

View File

@@ -0,0 +1,5 @@
name: cloonar-typo3/base
label: 'Base Design'
dependencies:
- typo3/fluid-styled-content
- typo3/fluid-styled-content-css

View File

@@ -0,0 +1,21 @@
@import './PageTsConfig/BackendLayouts/'
RTE {
default {
preset = base
}
}
TCEFORM {
pages {
}
tt_content {
}
}
TCEMAIN {
}

View File

@@ -0,0 +1,28 @@
styles:
templates:
layoutRootPath: 'EXT:base/Resources/Private/ContentElements/Layouts/'
partialRootPath: 'EXT:base/Resources/Private/ContentElements/Partials/'
templateRootPath: 'EXT:base/Resources/Private/ContentElements/Templates/'
page:
pageview:
paths: 'EXT:base/Resources/Private/PageView/'
meta:
viewport: 'width=device-width, initial-scale=1'
robots: 'index,follow'
apple-mobile-web-app-capable: 'no'
compatible: 'IE=edge'
tracking:
google:
trackingID: ''
anonymizeIp: '1'
config:
no_cache: '0'
removeDefaultJS: '0'
admPanel: '1'
prefixLocalAnchors: 'all'
headerComment: 'build by get.typo3.org/sitepackage'
sendCacheHeaders: '1'

View File

@@ -0,0 +1 @@
@import './TypoScript/'

View File

@@ -0,0 +1,3 @@
<?php
// $GLOBALS['TCA']['tt_content']['columns']['cloonar_hero_bodytext']['config']['enableRichText'] = true;

View File

@@ -0,0 +1,3 @@
.frame-type-cloonar_hero .container {
display: flex;
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 16 16"><path fill="#FFF" d="M1 1h14v14H1V1z"/><path fill="#999" d="M1 1v14h14V1H1zm1 1h12v12H2V2z"/><path fill="#666" d="M3 3h10v1H3V3z"/><path fill="#B9B9B9" d="M3 5h10v1H3V5z"/><path fill="#59F" d="M7 7h6v6H7V7z"/><path fill="#FFF" d="M11 12H8l.75-1 .75-1 .75 1 .75 1z"/><path fill="#FFF" d="M12 12H9.333l.667-.667.667-.666.666.666L12 12z"/><circle cx="11.5" cy="9.5" r=".5" fill="#FFF"/><path fill="#B9B9B9" d="M3 7h3v1H3V7zm0 2h3v1H3V9zm0 2h3v1H3v-1z"/></svg>

After

Width:  |  Height:  |  Size: 537 B

View File

@@ -0,0 +1,21 @@
name: cloonar/hero
typeName: cloonar_hero
group: default
prefixFields: true
prefixType: full
fields:
-
identifier: header
useExistingField: true
-
identifier: bodytext
type: Textarea
enableRichtext: true
useExistingField: true
- identifier: image
type: File
properties:
allowed: [jpg, jpeg, png, gif]
useExistingField: true
- identifier: imageorient
useExistingField: true

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file datatype="plaintext" original="labels.xlf" source-language="en" date="2024-12-12T00:46:08+00:00" product-name="cloonar/hero">
<header/>
<body>
<trans-unit id="title">
<source>Hero</source>
</trans-unit>
<trans-unit id="description">
<source>Description for Content Element cloonar/hero</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,21 @@
<html
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Preview"/>
<f:section name="Header">
<be:link.editRecord uid="{data.uid}" table="{data.mainType}">{data.header}</be:link.editRecord>
</f:section>
<f:section name="Content">
Preview for Content Block: cloonar/hero
</f:section>
<f:comment>
<!-- Uncomment to override preview footer -->
<f:section name="Footer">
My custom Footer
</f:section>
</f:comment>

View File

@@ -0,0 +1,18 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:cb="http://typo3.org/ns/TYPO3/CMS/ContentBlocks/ViewHelpers"
xmlns:bk2k="http://typo3.org/ns/BK2K/BootstrapPackage/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="Main">
<f:asset.css identifier="hero" href="{cb:assetPath()}/frontend.css"/>
<div class="textpic textpic-{data.imageorient}">
<div class="textpic-item textpic-gallery">
<f:image image="{data.image.0}" alt="Wobi" />
</div>
<div class="textpic-item textpic-text">
<f:format.html>{data.bodytext}</f:format.html>
</div>
</div>
</f:section>

4
packages/base/README.md Normal file
View File

@@ -0,0 +1,4 @@
Site Package for the project "Test"
==============================================================
Add some explanation here.

View File

@@ -0,0 +1,2 @@
Order deny,allow
Deny from all

View File

@@ -0,0 +1,8 @@
<div class="frame frame-type-{data.CType}">
<div class="container">
<div class="header">
<h2>{data.header}</h2>
</div>
<f:render section="Main" optional="true" />
</div>
</div>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2024-12-11UTC16:10:160">
<header>
<authorName>Test</authorName>
<authorEmail>test@test.at</authorEmail>
</header>
<body>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2024-12-11UTC16:10:160">
<header>
<authorName>Test</authorName>
<authorEmail>test@test.at</authorEmail>
</header>
<body>
<trans-unit id="backend_layout.default">
<source>Default</source>
</trans-unit>
<trans-unit id="backend_layout.column.stage">
<source>Stage</source>
</trans-unit>
<trans-unit id="backend_layout.column.normal">
<source>Normal</source>
</trans-unit>
<trans-unit id="backend_layout.column.right">
<source>Right</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2024-12-11UTC16:10:160">
<header>
<authorName>Test</authorName>
<authorEmail>test@test.at</authorEmail>
</header>
<body>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,21 @@
<header>
<!-- Main Navigation -->
<f:render partial="Navigation/Main" arguments="{_all}" />
</header>
<main>
<!-- Main Section -->
<f:render section="Main" />
</main>
<footer>
<f:cObject
typoscriptObjectPath="lib.dynamicContentSlide"
data="{pageUid: '{data.uid}', colPos: '90'}"
/>
<f:cObject
typoscriptObjectPath="lib.dynamicContentSlide"
data="{pageUid: '{data.uid}', colPos: '91'}"
/>
<p>&copy; {f:format.date(date: 'now', format: 'Y')} Your Company</p>
</footer>

View File

@@ -0,0 +1,6 @@
<f:layout name="Default" />
<f:section name="Main">
<f:render partial="Content" arguments="{records: content.main.records}"/>
</f:section>

View File

@@ -0,0 +1,7 @@
<f:for each="{records}" as="record">
<f:cObject
typoscriptObjectPath="{record.mainType}"
data="{record}"
table="{record.mainType}"
/>
</f:for>

View File

@@ -0,0 +1,29 @@
<nav class="main-nav" id="mainNav">
<div class="container">
<a href="/" class="nav-logo">Brand Logo</a>
<button class="nav-toggle" id="navToggle" aria-label="Toggle Menu">
<span class="nav-toggle-icon"></span>
</button>
<ul class="nav-links" id="navLinks">
<f:for each="{mainnavigation}" as="mainnavigationItem">
<li class="nav-item{f:if(condition: mainnavigationItem.active, then:' active')}{f:if(condition: mainnavigationItem.children, then:' has-submenu')}">
<a href="{mainnavigationItem.link}" target="{mainnavigationItem.target}" title="{mainnavigationItem.title}">
{mainnavigationItem.title}
</a>
<f:if condition="{mainnavigationItem.children}">
<ul class="sub-menu">
<f:for each="{mainnavigationItem.children}" as="child">
<li class="{f:if(condition: child.active, then:'active')}">
<a class="nav-link" href="{child.link}" target="{child.target}" title="{child.title}">
{child.title}
</a>
</li>
</f:for>
</ul>
</f:if>
</li>
</f:for>
</ul>
</div>
</nav>

View File

@@ -0,0 +1,3 @@
/**
* Created by get.typo3.org/sitepackage
*/

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="83.098" height="84.172" viewBox="43.201 42.122 83.098 84.172">
<path fill="#FF8700" d="M106.074 100.128c-1.247.368-2.242.506-3.549.506-10.689 0-26.389-37.359-26.389-49.793 0-4.577 1.083-6.104 2.613-7.415-13.084 1.527-28.784 6.329-33.806 12.433-1.085 1.529-1.743 3.926-1.743 6.98 0 19.41 20.718 63.455 35.332 63.455 6.765.001 18.164-11.112 27.542-26.166M99.25 42.122c13.52 0 27.049 2.18 27.049 9.812 0 15.483-9.819 34.246-14.832 34.246-8.942 0-20.065-24.867-20.065-37.301.001-5.67 2.181-6.757 7.848-6.757"/>
</svg>

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

View File

@@ -0,0 +1 @@
console.log('WE LOVE TYPO3');

View File

@@ -0,0 +1,41 @@
document.addEventListener('DOMContentLoaded', function () {
const nav = document.getElementById('mainNav');
const toggle = document.getElementById('navToggle');
const navLinks = document.getElementById('navLinks');
let lastScrollTop = 0;
// Toggle menu on mobile
toggle.addEventListener('click', function () {
nav.classList.toggle('open');
toggle.classList.toggle('active');
});
// Sticky on scroll
window.addEventListener('scroll', function () {
const currentScroll = window.pageYOffset || document.documentElement.scrollTop;
if (currentScroll > 0) {
nav.classList.add('sticky');
} else {
nav.classList.remove('sticky');
}
lastScrollTop = currentScroll <= 0 ? 0 : currentScroll;
});
// Optionally handle dropdowns on mobile (if desired)
// For example:
const submenuParents = document.querySelectorAll('.nav-item.has-submenu');
submenuParents.forEach(parent => {
parent.addEventListener('click', (e) => {
if (window.innerWidth <= 992) {
e.preventDefault();
const subMenu = parent.querySelector('.sub-menu');
if (subMenu) {
const isOpen = subMenu.style.display === 'block';
// Close all open submenus first (optional)
document.querySelectorAll('.sub-menu').forEach(sm => sm.style.display = 'none');
subMenu.style.display = isOpen ? 'none' : 'block';
}
}
});
});
});

View File

@@ -0,0 +1,10 @@
// Example mixin for transitions
@mixin transition($property: all, $duration: 0.3s, $timing: ease-in-out) {
transition: $property $duration $timing;
}
@mixin respond($breakpoint) {
@media (min-width: $breakpoint) {
@content;
}
}

View File

@@ -0,0 +1,11 @@
// Example variables, extend as needed
$primary-color: #4b4b4b;
$secondary-color: #ffffff;
$brand-color: #6B8E23;
$font-stack: 'Helvetica', sans-serif;
// Breakpoints
$breakpoint-sm: 576px;
$breakpoint-md: 768px;
$breakpoint-lg: 992px;
$breakpoint-xl: 1200px;

View File

@@ -0,0 +1,20 @@
.container {
margin: auto;
padding: 3rem 1rem;
@include respond($breakpoint-sm) {
max-width: 540px;
}
@include respond($breakpoint-md) {
max-width: 720px;
}
@include respond($breakpoint-lg) {
max-width: 960px;
}
@include respond($breakpoint-xl) {
max-width: 1140px;
}
}

View File

@@ -0,0 +1,5 @@
body {
font-family: $font-stack;
color: $primary-color;
line-height: 1.5;
}

View File

@@ -0,0 +1,6 @@
// A simple CSS reset, adapt as needed
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}

View File

@@ -0,0 +1,3 @@
@import 'reset';
@import 'global';
@import 'container';

View File

@@ -0,0 +1,19 @@
.content-element {
margin: 2rem auto;
padding: 2rem;
background-color: #f5f5f5; // default background
// Apply responsive widths at breakpoints using the respond mixin
&--blue {
background-color: #cceeff;
}
&--gray {
background-color: #eeeeee;
}
&--image {
background: url('EXT:my_sitepackage/Resources/Public/Images/background-image.jpg') no-repeat center/cover;
}
}

View File

@@ -0,0 +1,142 @@
.main-nav {
width: 100%;
background: $secondary-color url('EXT:my_sitepackage/Resources/Public/Images/linen-texture.png') repeat;
position: relative;
z-index: 1000;
&.sticky {
position: fixed;
top: 0;
left: 0;
right: 0;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.container {
display: flex;
align-items: center;
justify-content: space-between;
margin: 0 auto;
padding: 1rem;
}
.nav-logo {
img {
display: block;
max-height: 50px;
height: auto;
width: auto;
}
}
.nav-toggle {
background: none;
border: none;
cursor: pointer;
display: none; // hidden by default on desktop
position: relative;
width: 30px;
height: 30px;
.nav-toggle-icon {
width: 100%;
height: 2px;
background: $primary-color;
display: block;
position: relative;
@include transition(all, 0.3s);
&::before,
&::after {
content: '';
width: 100%;
height: 2px;
background: $primary-color;
position: absolute;
left: 0;
@include transition(all, 0.3s);
}
&::before {
top: -8px;
}
&::after {
top: 8px;
}
}
&.active .nav-toggle-icon {
background: transparent;
&::before {
transform: rotate(45deg) translate(5px, 5px);
}
&::after {
transform: rotate(-45deg) translate(5px, -5px);
}
}
}
.nav-links {
display: flex;
list-style: none;
.nav-item {
margin: 0 1rem;
.nav-link {
text-decoration: none;
color: $primary-color;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 1rem;
@include transition(color);
&:hover {
color: $brand-color;
}
}
}
}
// Responsive: show hamburger and collapse menu on smaller screens
@media (max-width: $breakpoint-lg) {
.nav-toggle {
display: block;
}
// Hide links by default on mobile and show only when toggled
.nav-links {
position: absolute;
top: 100%;
left: 0;
right: 0;
flex-direction: column;
background: $secondary-color url('EXT:my_sitepackage/Resources/Public/Images/linen-texture.png') repeat;
max-height: 0;
overflow: hidden;
@include transition(max-height, 0.4s);
.nav-item {
margin: 0;
padding: 1rem;
border-top: 1px solid rgba(0,0,0,0.1);
&:first-child {
border-top: none;
}
.nav-link {
display: block;
}
}
}
&.open .nav-links {
max-height: 500px; // Adjust to fit all items
}
}
}

View File

@@ -0,0 +1,4 @@
@import 'abstracts/variables';
@import 'abstracts/mixins';
@import 'base/base';
@import 'components/navigation';

View File

@@ -0,0 +1,23 @@
{
"name": "cloonar-typo3/base",
"type": "typo3-cms-extension",
"description": "Base Design",
"homepage": "https://cloonar.com",
"license": ["GPL-2.0-or-later"],
"keywords": ["TYPO3 CMS"],
"require": {
"typo3/cms-core": "^13.4",
"typo3/cms-rte-ckeditor": "^13.4",
"typo3/cms-fluid-styled-content": "^13.4"
},
"autoload": {
"psr-4": {
"Cloonar\\Base\\": "Classes/"
}
},
"extra": {
"typo3/cms": {
"extension-key": "base"
}
}
}

View File

@@ -0,0 +1,3 @@
#
# Extension Configuration template
#

View File

@@ -0,0 +1,29 @@
<?php
$EM_CONF[$_EXTKEY] = [
'title' => 'Test',
'description' => 'Test',
'category' => 'templates',
'constraints' => [
'depends' => [
'typo3' => '13.4.0-13.4.99',
'fluid_styled_content' => '13.4.0-13.4.99',
'rte_ckeditor' => '13.4.0-13.4.99',
],
'conflicts' => [
],
],
'autoload' => [
'psr-4' => [
'Test\\Test\\' => 'Classes',
],
],
'state' => 'stable',
'uploadfolder' => 0,
'createDirs' => '',
'clearCacheOnLoad' => 1,
'author' => 'Test',
'author_email' => 'test@test.at',
'author_company' => 'test',
'version' => '1.0.0',
];

View File

@@ -0,0 +1,6 @@
<?php
defined('TYPO3') or die('Access denied.');
// Add default RTE configuration
$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['base'] = 'EXT:base/Configuration/RTE/Default.yaml';

View File

@@ -0,0 +1,3 @@
<?php
defined('TYPO3') or die('Access denied.');