TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:21 +02:00
commit be71cfa708
199 changed files with 4138 additions and 0 deletions
@@ -0,0 +1,31 @@
# Bullet List:
# A single bullet list.
#
# CType: bullets
tt_content.bullets =< lib.contentElement
tt_content.bullets {
templateName = Bullets
dataProcessing {
10 = split
10 {
if {
value = 2
isLessThan.field = bullets_type
}
fieldName = bodytext
removeEmptyEntries = 1
as = bullets
}
20 = comma-separated-value
20 {
fieldName = bodytext
if {
value = 2
equals.field = bullets_type
}
fieldDelimiter = |
as = bullets
}
}
}
@@ -0,0 +1,9 @@
# Divider:
# This element inserts a visual divider, which is by default a horizontal line.
#
# CType: div
tt_content.div =< lib.contentElement
tt_content.div {
templateName = Div
}
@@ -0,0 +1,9 @@
# Header Only:
# Adds a header only.
#
# CType: header
tt_content.header =< lib.contentElement
tt_content.header {
templateName = Header
}
@@ -0,0 +1,9 @@
# Plain HTML:
# With this element you can output raw HTML code on the page.
#
# CType: html
tt_content.html =< lib.contentElement
tt_content.html {
templateName = Html
}
@@ -0,0 +1,23 @@
# Image:
# ...
#
# CType: image
tt_content.image =< lib.contentElement
tt_content.image {
templateName = Image
dataProcessing {
10 = files
10 {
references.fieldName = image
}
20 = gallery
20 {
maxGalleryWidth = {$styles.content.textmedia.maxW}
maxGalleryWidthInText = {$styles.content.textmedia.maxWInText}
columnSpacing = {$styles.content.textmedia.columnSpacing}
borderWidth = {$styles.content.textmedia.borderWidth}
borderPadding = {$styles.content.textmedia.borderPadding}
}
}
}
@@ -0,0 +1,22 @@
# Menu of subpages of selected pages including abstracts:
# ...
#
# CType: menu_abstract
tt_content.menu_abstract =< lib.contentElement
tt_content.menu_abstract {
templateName = MenuAbstract
dataProcessing {
10 = menu
10 {
special = directory
special.value.field = pages
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,30 @@
# Content elements for selected categories:
# ...
#
# CType: menu_categorized_content
tt_content.menu_categorized_content =< lib.contentElement
tt_content.menu_categorized_content {
templateName = MenuCategorizedContent
dataProcessing {
10 = database-query
10 {
table = tt_content
selectFields = DISTINCT {#tt_content}.*
pidInList.data = leveluid : 0
recursive = 99
join.data = field:selected_categories
join.wrap = {#sys_category_record_mm} ON uid = {#sys_category_record_mm}.{#uid_foreign} AND {#sys_category_record_mm}.{#uid_local} IN(|)
where.data = field:category_field
where.wrap = {#tablenames}='tt_content' and {#fieldname}='|'
orderBy = tt_content.sorting
as = content
dataProcessing {
10 = files
10 {
references.fieldName = image
}
}
}
}
}
@@ -0,0 +1,27 @@
# Pages for selected categories:
# ...
#
# CType: menu_categorized_pages
tt_content.menu_categorized_pages =< lib.contentElement
tt_content.menu_categorized_pages {
templateName = MenuCategorizedPages
dataProcessing {
10 = menu
10 {
special = categories
special {
value.field = selected_categories
relation.field = category_field
sorting = title
order = asc
}
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,22 @@
# Menu of selected pages:
# ...
#
# CType: menu_pages
tt_content.menu_pages =< lib.contentElement
tt_content.menu_pages {
templateName = MenuPages
dataProcessing {
10 = menu
10 {
special = list
special.value.field = pages
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,26 @@
# Recently updated pages:
# ...
#
# CType: menu_recently_updated
tt_content.menu_recently_updated =< lib.contentElement
tt_content.menu_recently_updated {
templateName = MenuRecentlyUpdated
dataProcessing {
10 = menu
10 {
special = updated
special {
value.field = pages
maxAge = 3600*24*7
excludeNoSearchPages = 1
}
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,26 @@
# Related pages (based on keywords):
# ...
#
# CType: menu_related_pages
tt_content.menu_related_pages =< lib.contentElement
tt_content.menu_related_pages {
templateName = MenuRelatedPages
dataProcessing {
10 = menu
10 {
special = keywords
special {
value.field = pages
excludeNoSearchPages = 1
}
alternativeSortingField = title
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,57 @@
# Section index (page content marked for section menus):
# ...
#
# CType: menu_section
tt_content.menu_section =< lib.contentElement
tt_content.menu_section {
templateName = MenuSection
dataProcessing {
10 = menu
10 {
// Always activate includeNotInMenu for a section menu of the current page
includeNotInMenu.override = 1
includeNotInMenu.override.if.isFalse.field = pages
special = list
special {
value {
field = pages
override {
data = page:uid
if {
isFalse.field = pages
}
// Currrent page uses content of another page
override {
data = page:content_from_pid
if {
isTrue.data = page:content_from_pid
}
}
}
}
}
dataProcessing {
10 = files
10 {
references.fieldName = media
}
20 = database-query
20 {
table = tt_content
pidInList.field = uid
as = content
where = {#sectionIndex} = 1
orderBy = sorting
dataProcessing {
10 = files
10 {
references.fieldName = image
}
}
}
}
}
}
}
@@ -0,0 +1,36 @@
# Menu of subpages of selected pages including sections:
# ...
#
# CType: menu_section_pages
tt_content.menu_section_pages =< lib.contentElement
tt_content.menu_section_pages {
templateName = MenuSectionPages
dataProcessing {
10 = menu
10 {
special = directory
special.value.field = pages
dataProcessing {
10 = files
10 {
references.fieldName = media
}
20 = database-query
20 {
table = tt_content
pidInList.field = uid
where = {#sectionIndex} = 1
orderBy = sorting
as = content
dataProcessing {
10 = files
10 {
references.fieldName = image
}
}
}
}
}
}
}
@@ -0,0 +1,21 @@
# Sitemap:
# ...
#
# CType: menu_sitemap
tt_content.menu_sitemap =< lib.contentElement
tt_content.menu_sitemap {
templateName = MenuSitemap
dataProcessing {
10 = menu
10 {
levels = 7
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,23 @@
# Sitemaps of selected pages:
# ...
#
# CType: menu_sitemap_pages
tt_content.menu_sitemap_pages =< lib.contentElement
tt_content.menu_sitemap_pages {
templateName = MenuSitemapPages
dataProcessing {
10 = menu
10 {
special = directory
special.value.field = pages
levels = 7
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,22 @@
# Menu of subpages of selected pages:
# ...
#
# CType: menu_subpages
tt_content.menu_subpages =< lib.contentElement
tt_content.menu_subpages {
templateName = MenuSubpages
dataProcessing {
10 = menu
10 {
special = directory
special.value.field = pages
dataProcessing {
10 = files
10 {
references.fieldName = media
}
}
}
}
}
@@ -0,0 +1,16 @@
# Insert records:
# This element embeds other content elements.
#
# CType: shortcut
tt_content.shortcut =< lib.contentElement
tt_content.shortcut {
templateName = Shortcut
# Keep this, since the "conf" option can be used
variables.shortcuts = RECORDS
variables.shortcuts {
source.field = records
tables = {$styles.content.shortcut.tables}
}
}
@@ -0,0 +1,32 @@
# Table:
# A simple table.
#
# CType: table
tt_content.table =< lib.contentElement
tt_content.table {
templateName = Table
dataProcessing {
10 = comma-separated-value
10 {
fieldName = bodytext
fieldDelimiter.char.cObject = TEXT
fieldDelimiter.char.cObject {
field = table_delimiter
}
fieldEnclosure.char.cObject = TEXT
fieldEnclosure.char.cObject {
field = table_enclosure
}
fieldEnclosure {
if {
value = 0
equals.field = table_enclosure
negate = 1
}
}
maximumColumns.field = cols
as = table
}
}
}
@@ -0,0 +1,9 @@
# Regular Text Element:
# A regular text element with header and bodytext fields.
#
# CType: text
tt_content.text =< lib.contentElement
tt_content.text {
templateName = Text
}
@@ -0,0 +1,23 @@
# Text & Media:
# Any number of media wrapped right around a regular text element.
#
# CType: textmedia
tt_content.textmedia =< lib.contentElement
tt_content.textmedia {
templateName = Textmedia
dataProcessing {
10 = files
10 {
references.fieldName = assets
}
20 = gallery
20 {
maxGalleryWidth = {$styles.content.textmedia.maxW}
maxGalleryWidthInText = {$styles.content.textmedia.maxWInText}
columnSpacing = {$styles.content.textmedia.columnSpacing}
borderWidth = {$styles.content.textmedia.borderWidth}
borderPadding = {$styles.content.textmedia.borderPadding}
}
}
}
@@ -0,0 +1,23 @@
# Text and Images:
# Text with images.
#
# CType: textpic
tt_content.textpic =< lib.contentElement
tt_content.textpic {
templateName = Textpic
dataProcessing {
10 = files
10 {
references.fieldName = image
}
20 = gallery
20 {
maxGalleryWidth = {$styles.content.textmedia.maxW}
maxGalleryWidthInText = {$styles.content.textmedia.maxWInText}
columnSpacing = {$styles.content.textmedia.columnSpacing}
borderWidth = {$styles.content.textmedia.borderWidth}
borderPadding = {$styles.content.textmedia.borderPadding}
}
}
}
@@ -0,0 +1,18 @@
# File Links:
# Makes a list of files for download.
#
# CType: uploads
tt_content.uploads =< lib.contentElement
tt_content.uploads {
templateName = Uploads
dataProcessing {
10 = files
10 {
references.fieldName = media
collections.field = file_collections
sorting.field = filelink_sorting
sorting.direction.field = filelink_sorting_direction
}
}
}
@@ -0,0 +1,46 @@
# Default configuration for content elements which are using FLUIDTEMPLATE directly
lib.contentElement >
lib.contentElement = FLUIDTEMPLATE
lib.contentElement {
templateName = Default
templateRootPaths {
0 = EXT:fluid_styled_content/Resources/Private/Templates/
10 = {$styles.templates.templateRootPath}
}
partialRootPaths {
0 = EXT:fluid_styled_content/Resources/Private/Partials/
10 = {$styles.templates.partialRootPath}
}
layoutRootPaths {
0 = EXT:fluid_styled_content/Resources/Private/Layouts/
10 = {$styles.templates.layoutRootPath}
}
settings {
defaultHeaderType = {$styles.content.defaultHeaderType}
media {
lazyLoading = {$styles.content.image.lazyLoading}
imageDecoding = {$styles.content.image.imageDecoding}
popup {
bodyTag = <body style="margin:0; background:#fff;">
wrap = <a href="javascript:close();"> | </a>
width = {$styles.content.textmedia.linkWrap.width}
height = {$styles.content.textmedia.linkWrap.height}
crop.data = file:current:crop
JSwindow = 1
JSwindow {
newWindow = {$styles.content.textmedia.linkWrap.newWindow}
if.isFalse = {$styles.content.textmedia.linkWrap.lightboxEnabled}
}
directImageLink = {$styles.content.textmedia.linkWrap.lightboxEnabled}
linkParams.ATagParams.dataWrap = class="{$styles.content.textmedia.linkWrap.lightboxCssClass}" rel="{$styles.content.textmedia.linkWrap.lightboxRelAttribute}"
}
additionalConfig {
no-cookie = 1
api = 0
}
}
}
dataProcessing {
1770716912 = record-transformation
}
}
@@ -0,0 +1,80 @@
plugin.tx_frontend._CSS_DEFAULT_STYLE (
.ce-align-left { text-align: left; }
.ce-align-center { text-align: center; }
.ce-align-right { text-align: right; }
.ce-table td, .ce-table th { vertical-align: top; }
.ce-textpic, .ce-image, .ce-nowrap .ce-bodytext, .ce-gallery, .ce-row, .ce-uploads li, .ce-uploads div { overflow: hidden; }
.ce-left .ce-gallery, .ce-column { float: left; }
.ce-center .ce-outer { position: relative; float: right; right: 50%; }
.ce-center .ce-inner { position: relative; float: right; right: -50%; }
.ce-right .ce-gallery { float: right; }
.ce-gallery figure { display: table; margin: 0; }
.ce-gallery figcaption { display: table-caption; caption-side: bottom; }
.ce-gallery img { display: block; }
.ce-gallery iframe { border-width: 0; }
.ce-border img,
.ce-border iframe {
border: {$styles.content.textmedia.borderWidth}px solid {$styles.content.textmedia.borderColor};
padding: {$styles.content.textmedia.borderPadding}px;
}
.ce-intext.ce-right .ce-gallery, .ce-intext.ce-left .ce-gallery, .ce-above .ce-gallery {
margin-bottom: {$styles.content.textmedia.textMargin}px;
}
.ce-image .ce-gallery { margin-bottom: 0; }
.ce-intext.ce-right .ce-gallery { margin-left: {$styles.content.textmedia.textMargin}px; }
.ce-intext.ce-left .ce-gallery { margin-right: {$styles.content.textmedia.textMargin}px; }
.ce-below .ce-gallery { margin-top: {$styles.content.textmedia.textMargin}px; }
.ce-column { margin-right: {$styles.content.textmedia.columnSpacing}px; }
.ce-column:last-child { margin-right: 0; }
.ce-row { margin-bottom: {$styles.content.textmedia.rowSpacing}px; }
.ce-row:last-child { margin-bottom: 0; }
.ce-above .ce-bodytext { clear: both; }
.ce-intext.ce-left ol, .ce-intext.ce-left ul { padding-left: 40px; overflow: auto; }
/* Headline */
.ce-headline-left { text-align: left; }
.ce-headline-center { text-align: center; }
.ce-headline-right { text-align: right; }
/* Uploads */
.ce-uploads { margin: 0; padding: 0; }
.ce-uploads li { list-style: none outside none; margin: 1em 0; }
.ce-uploads img { float: left; padding-right: 1em; vertical-align: top; }
.ce-uploads span { display: block; }
/* Table */
.ce-table { width: 100%; max-width: 100%; }
.ce-table th, .ce-table td { padding: 0.5em 0.75em; vertical-align: top; }
.ce-table thead th { border-bottom: 2px solid #dadada; }
.ce-table th, .ce-table td { border-top: 1px solid #dadada; }
.ce-table-striped tbody tr:nth-of-type(odd) { background-color: rgba(0,0,0,.05); }
.ce-table-bordered th, .ce-table-bordered td { border: 1px solid #dadada; }
/* Space */
.frame-space-before-extra-small { margin-top: 1em; }
.frame-space-before-small { margin-top: 2em; }
.frame-space-before-medium { margin-top: 3em; }
.frame-space-before-large { margin-top: 4em; }
.frame-space-before-extra-large { margin-top: 5em; }
.frame-space-after-extra-small { margin-bottom: 1em; }
.frame-space-after-small { margin-bottom: 2em; }
.frame-space-after-medium { margin-bottom: 3em; }
.frame-space-after-large { margin-bottom: 4em; }
.frame-space-after-extra-large { margin-bottom: 5em; }
/* Frame */
.frame-ruler-before:before { content: ''; display: block; border-top: 1px solid rgba(0,0,0,0.25); margin-bottom: 2em; }
.frame-ruler-after:after { content: ''; display: block; border-bottom: 1px solid rgba(0,0,0,0.25); margin-top: 2em; }
.frame-indent { margin-left: 15%; margin-right: 15%; }
.frame-indent-left { margin-left: 33%; }
.frame-indent-right { margin-right: 33%; }
)
@@ -0,0 +1,56 @@
styles.templates {
# cat=content/templates/b1; type=string; label= Path of Fluid Templates for all defined content elements
templateRootPath =
# cat=content/templates/b2; type=string; label= Path of Fluid Partials for all defined content elements
partialRootPath =
# cat=content/templates/b3; type=string; label= Path of Fluid Layouts for all defined content elements
layoutRootPath =
}
styles.content {
# cat=content/cHeader/h0; type=int[1-5]; label=Default Header type: Enter the number of the header layout to be used by default
defaultHeaderType = 2
# cat=content/cShortcut/t0; type=string; label=List of accepted tables
shortcut.tables = tt_content
# cat=content/cImage/a0; type=options[lazy,eager,auto,]; label=Default settings for browser-native image lazy loading: Can be "lazy" (browsers could choose to load images later), "eager" (load images right away) or "auto" (browser will determine whether the image should be lazy loaded or not)
image.lazyLoading = lazy
# cat=content/cImage/a1; type=options[sync,async,auto,]; label=Default settings for an image decoding hint to the browser: Can be "sync" (synchronously for atomic presentation with other content), "async" (asynchronously to avoid delaying presentation of other content), "auto" (no preference in decoding mode) or an empty value to omit the usage of the decoding attribute (same as "auto")
image.imageDecoding =
textmedia {
# cat=content/cTextmedia/b1; type=int+; label= Max Image/Media Width: This indicates that maximum number of pixels (width) a block of media elements inserted as content is allowed to consume
maxW = 600
# cat=content/cTextmedia/b2; type=int+; label= Max Image/Media Width (Text): Same as above, but this is the maximum width when text is wrapped around an block of media elements. Default is 50% of the normal Max Media Item Width
maxWInText = 300
# cat=content/cTextmedia/g1; type=int[0-100]; label= Advanced, Column space: Horizontal distance between media elements in a block in content elements of type "Media & Images". If you change this manually in your CSS, you need to adjust this setting accordingly
columnSpacing = 10
# cat=content/cTextmedia/g2; type=int[0-100]; label= Advanced, Row space: Vertical distance after each media elements row in content elements of type ""Text & Media". If you change this manually in your CSS, you need to adjust this setting accordingly
rowSpacing = 10
# cat=content/cTextmedia/g3; type=int[0-100]; label= Advanced, Margin to text: Horizontal distance between an imageblock and text in content elements of type "Text & Images"
textMargin = 10
# cat=content/cTextmedia/i1; type=color; label= Media element border, color: Bordercolor of media elements in content elements when "Border"-option for an element is set
borderColor = #000000
# cat=content/cTextmedia/i2; type=int[0-100]; label= Media element border, thickness: Thickness of border around media elements in content elements when "Border"-option for element is set
borderWidth = 2
# cat=content/cTextmedia/i3; type=int+; label= Media element border, padding: Padding left and right to the media element, around the border
borderPadding = 0
# cat=content/cTextmedia/c1; type=string; label= Click-enlarge Media Width: This specifies the width of the enlarged media element when click-enlarge is enabled
linkWrap.width = 800m
# cat=content/cTextmedia/c2; type=string; label= Click-enlarge Media Height: This specifies the height of the enlarged media element when click-enlarge is enabled
linkWrap.height = 600m
# cat=content/cTextmedia/c3; type=boolean; label= Advanced, New window: If set, every click-enlarged media element will open in it's own popup window and not the current popup window (which may have a wrong size for the media element to fit in)
linkWrap.newWindow = 0
# cat=content/cTextmedia/c4; type=boolean; label= Lightbox click-enlarge rendering: Whether media elements with click-enlarge checked should be rendered lightbox-compliant
linkWrap.lightboxEnabled = 0
# cat=content/cTextmedia/c5; type=string; label= Lightbox CSS class: Which CSS class to use for lightbox links (only applicable if lightbox rendering is enabled)
linkWrap.lightboxCssClass = lightbox
# cat=content/cTextmedia/c6; type=string; label= Lightbox rel="" attribute: Which rel="" attribute to use for lightbox links (only applicable if lightbox rendering is enabled)
linkWrap.lightboxRelAttribute = lightbox[{field:uid}]
}
}
+28
View File
@@ -0,0 +1,28 @@
# Include setup
@import './Helper/ContentElement.typoscript'
# Typical content elements
@import './ContentElement/Bullets.typoscript'
@import './ContentElement/Div.typoscript'
@import './ContentElement/Header.typoscript'
@import './ContentElement/Html.typoscript'
@import './ContentElement/Image.typoscript'
@import './ContentElement/Shortcut.typoscript'
@import './ContentElement/Table.typoscript'
@import './ContentElement/Text.typoscript'
@import './ContentElement/Textmedia.typoscript'
@import './ContentElement/Textpic.typoscript'
@import './ContentElement/Uploads.typoscript'
# Menu content elements
@import './ContentElement/MenuAbstract.typoscript'
@import './ContentElement/MenuCategorizedContent.typoscript'
@import './ContentElement/MenuCategorizedPages.typoscript'
@import './ContentElement/MenuPages.typoscript'
@import './ContentElement/MenuSubpages.typoscript'
@import './ContentElement/MenuSection.typoscript'
@import './ContentElement/MenuSectionPages.typoscript'
@import './ContentElement/MenuRecentlyUpdated.typoscript'
@import './ContentElement/MenuRelatedPages.typoscript'
@import './ContentElement/MenuSitemap.typoscript'
@import './ContentElement/MenuSitemapPages.typoscript'