diff --git a/Configuration/Sets/Boostrap5/config.yaml b/Configuration/Sets/Boostrap5/config.yaml new file mode 100644 index 000000000..0a6ff7de5 --- /dev/null +++ b/Configuration/Sets/Boostrap5/config.yaml @@ -0,0 +1,3 @@ +name: bootstrap-package/bootstrap-5 +label: 'Bootstrap Package: Bootstrap 5' +hidden: true diff --git a/Configuration/Sets/Boostrap5/settings.definitions.yaml b/Configuration/Sets/Boostrap5/settings.definitions.yaml new file mode 100644 index 000000000..5476a4d7f --- /dev/null +++ b/Configuration/Sets/Boostrap5/settings.definitions.yaml @@ -0,0 +1,182 @@ +categories: + BootstrapPackage: + label: 'Bootstrap Package' + BootstrapPackage.scss: + label: 'SCSS' + parent: BootstrapPackage + BootstrapPackage.scss.colors: + label: 'Colors' + parent: BootstrapPackage.scss + BootstrapPackage.scss.contrast: + label: 'Contrast' + parent: BootstrapPackage.scss + BootstrapPackage.scss.body: + label: 'Body' + parent: BootstrapPackage.scss + BootstrapPackage.scss.links: + label: 'Links' + parent: BootstrapPackage.scss + BootstrapPackage.scss.fonts: + label: 'Fonts' + parent: BootstrapPackage.scss + BootstrapPackage.scss.options: + label: 'Options' + parent: BootstrapPackage.scss + +settings: + + # Colors + plugin.bootstrap_package.settings.scss.primary: + label: '$primary' + category: BootstrapPackage.scss.colors + type: string + default: '#577760' + + plugin.bootstrap_package.settings.scss.secondary: + label: '$secondary' + category: BootstrapPackage.scss.colors + type: string + default: '#514553' + + plugin.bootstrap_package.settings.scss.tertiary: + label: '$tertiary' + category: BootstrapPackage.scss.colors + type: string + default: '#758c7f' + + plugin.bootstrap_package.settings.scss.quaternary: + label: '$quaternary' + category: BootstrapPackage.scss.colors + type: string + default: '#2d1e2f' + + plugin.bootstrap_package.settings.scss.default: + label: '$default' + category: BootstrapPackage.scss.colors + type: string + default: '#eaebec' + + plugin.bootstrap_package.settings.scss.success: + label: '$success' + category: BootstrapPackage.scss.colors + type: string + default: '#3A833A' + + plugin.bootstrap_package.settings.scss.info: + label: '$info' + category: BootstrapPackage.scss.colors + type: string + default: '#287F9A' + + plugin.bootstrap_package.settings.scss.warning: + label: '$warning' + category: BootstrapPackage.scss.colors + type: string + default: '#a4660e' + + plugin.bootstrap_package.settings.scss.danger: + label: '$danger' + category: BootstrapPackage.scss.colors + type: string + default: '#d4403a' + + plugin.bootstrap_package.settings.scss.lighter: + label: '$lighter' + category: BootstrapPackage.scss.colors + type: string + default: '$gray-100' + + plugin.bootstrap_package.settings.scss.light: + label: '$light' + category: BootstrapPackage.scss.colors + type: string + default: '$gray-200' + + plugin.bootstrap_package.settings.scss.dark: + label: '$dark' + category: BootstrapPackage.scss.colors + type: string + default: '$gray-800' + + plugin.bootstrap_package.settings.scss.darker: + label: '$darker' + category: BootstrapPackage.scss.colors + type: string + default: '$gray-900' + + # Contrast + plugin.bootstrap_package.settings.scss.min-contrast-ratio: + label: '$min-contrast-ratio' + category: BootstrapPackage.scss.contrast + type: number + default: 4.5 + + # Body + plugin.bootstrap_package.settings.scss.body-bg: + label: '$body-bg' + category: BootstrapPackage.scss.body + type: string + default: '$white' + + plugin.bootstrap_package.settings.scss.body-color: + label: '$body-color' + category: BootstrapPackage.scss.body + type: string + default: '$gray-900' + + # Links + plugin.bootstrap_package.settings.scss.link-color: + label: '$link-color' + category: BootstrapPackage.scss.links + type: string + default: '$primary' + + plugin.bootstrap_package.settings.scss.link-shade-percentage: + label: '$link-shade-percentage' + category: BootstrapPackage.scss.links + type: string + default: '20%' + + plugin.bootstrap_package.settings.scss.link-hover-color: + label: '$link-shade-percentage' + category: BootstrapPackage.scss.links + type: string + default: 'shift-color($link-color, $link-shade-percentage)' + + # Fonts + plugin.bootstrap_package.settings.scss.font-family-sans-serif: + label: '$font-family-sans-serif' + category: BootstrapPackage.scss.fonts + type: string + default: '"#{$google-webfont}", sans-serif' + + plugin.bootstrap_package.settings.scss.font-family-monospace: + label: '$font-family-monospace' + category: BootstrapPackage.scss.fonts + type: string + default: 'SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace' + + # Options + plugin.bootstrap_package.settings.scss.enable-rounded: + label: '$enable-rounded' + category: BootstrapPackage.scss.options + type: bool + default: true + + plugin.bootstrap_package.settings.scss.enable-shadows: + label: '$enable-shadows' + category: BootstrapPackage.scss.options + type: bool + default: true + + plugin.bootstrap_package.settings.scss.enable-gradients: + label: '$enable-gradients' + category: BootstrapPackage.scss.options + type: bool + default: false + + plugin.bootstrap_package.settings.scss.enable-transitions: + label: '$enable-transitions' + category: BootstrapPackage.scss.options + type: bool + default: true diff --git a/Configuration/Sets/Boostrap5/setup.typoscript b/Configuration/Sets/Boostrap5/setup.typoscript new file mode 100644 index 000000000..b63d8325a --- /dev/null +++ b/Configuration/Sets/Boostrap5/setup.typoscript @@ -0,0 +1 @@ +@import 'EXT:bootstrap_package/Configuration/TypoScript/Bootstrap5/setup.typoscript' diff --git a/Configuration/Sets/ContentElements/config.yaml b/Configuration/Sets/ContentElements/config.yaml new file mode 100644 index 000000000..2eaddc6c3 --- /dev/null +++ b/Configuration/Sets/ContentElements/config.yaml @@ -0,0 +1,2 @@ +name: bootstrap-package/content-elements +label: 'Bootstrap Package: Content Elements' diff --git a/Configuration/Sets/ContentElements/settings.definitions.yaml b/Configuration/Sets/ContentElements/settings.definitions.yaml new file mode 100644 index 000000000..39a564283 --- /dev/null +++ b/Configuration/Sets/ContentElements/settings.definitions.yaml @@ -0,0 +1,320 @@ +categories: + BootstrapPackage: + label: 'Bootstrap Package' + BootstrapPackage.content-elements: + label: 'Content Elements' + parent: BootstrapPackage + BootstrapPackage.content-elements.templates: + label: 'Templates' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.header: + label: 'Header' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.subheader: + label: 'Subheader' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.lightbox: + label: 'Lightbox' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.media: + label: 'Media' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.gallery: + label: 'Gallery' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.menu-thumbnail: + label: 'Menu Thumbnail' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.menu-card: + label: 'Menu Card' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.text-and-icon: + label: 'Text and Icon' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.timeline: + label: 'Timeline' + parent: BootstrapPackage.content-elements + BootstrapPackage.content-elements.uploads: + label: 'Uploads' + parent: BootstrapPackage.content-elements + +settings: + + # Templates + plugin.bootstrap_package_contentelements.view.layoutRootPath: + label: 'Layout Root Path' + description: 'Path to layouts' + category: BootstrapPackage.content-elements.templates + type: string + default: 'EXT:bootstrap_package/Resources/Private/Layouts/ContentElement/' + + plugin.bootstrap_package_contentelements.view.partialRootPath: + label: 'Partial Root Path' + description: 'Path to partials' + category: BootstrapPackage.content-elements.templates + type: string + default: 'EXT:bootstrap_package/Resources/Private/Partials/ContentElement/' + + plugin.bootstrap_package_contentelements.view.templateRootPath: + label: 'Template Root Path' + description: 'Path to templates' + category: BootstrapPackage.content-elements.templates + type: string + default: 'EXT:bootstrap_package/Resources/Private/Templates/ContentElement/' + + # Header + plugin.bootstrap_package_contentelements.header.defaultHeaderType: + label: 'Default Header type' + description: 'Enter the number of the header layout to be used by default [1-5]' + category: BootstrapPackage.content-elements.header + type: number + default: 2 + + plugin.bootstrap_package_contentelements.header.class: + label: 'Default Header class' + category: BootstrapPackage.content-elements.header + type: string + default: 'element-header' + + plugin.bootstrap_package_contentelements.header.date.format: + label: 'Header date format' + category: BootstrapPackage.content-elements.header + type: string + default: '%B %e, %Y' + + # Subheader + plugin.bootstrap_package_contentelements.subheader.class: + label: 'Default Subheader class' + category: BootstrapPackage.content-elements.subheader + type: string + default: 'element-subheader' + + # Lightbox + plugin.bootstrap_package_contentelements.lightbox.cssClass: + label: 'CSS Class' + category: BootstrapPackage.content-elements.lightbox + type: string + default: 'lightbox' + + plugin.bootstrap_package_contentelements.lightbox.prefix: + label: 'Group Prefix' + category: BootstrapPackage.content-elements.lightbox + type: string + default: 'lightbox-group' + + plugin.bootstrap_package_contentelements.lightbox.image.maxHeight: + label: 'Max Image Hight' + category: BootstrapPackage.content-elements.lightbox + type: int + default: 1200 + + plugin.bootstrap_package_contentelements.lightbox.image.maxWidth: + label: 'Max Image Width' + category: BootstrapPackage.content-elements.lightbox + type: int + default: 1200 + + # Media + plugin.bootstrap_package_contentelements.media.additionalConfig.autoplay: + label: 'Autoplay' + category: BootstrapPackage.content-elements.media + type: bool + default: false + + plugin.bootstrap_package_contentelements.media.additionalConfig.controls: + label: 'Controls' + category: BootstrapPackage.content-elements.media + type: bool + default: true + + plugin.bootstrap_package_contentelements.media.additionalConfig.loop: + label: 'Loop' + category: BootstrapPackage.content-elements.media + type: bool + default: false + + plugin.bootstrap_package_contentelements.media.additionalConfig.enablejsapi: + label: 'Enable JavaScript API' + category: BootstrapPackage.content-elements.media + type: bool + default: true + + plugin.bootstrap_package_contentelements.media.additionalConfig.showinfo: + label: 'Show Info' + category: BootstrapPackage.content-elements.media + type: bool + default: false + + plugin.bootstrap_package_contentelements.media.additionalConfig.relatedVideos: + label: 'Related Videos' + category: BootstrapPackage.content-elements.media + type: bool + default: false + + plugin.bootstrap_package_contentelements.media.additionalConfig.modestbranding: + label: 'Modest Branding' + category: BootstrapPackage.content-elements.media + type: bool + default: false + + plugin.bootstrap_package_contentelements.media.additionalConfig.nocookie: + label: 'No Cookie' + category: BootstrapPackage.content-elements.media + type: bool + default: true + + # Gallery + plugin.bootstrap_package_contentelements.gallery.columns.1: + label: 'Item CSS Class for 1 column' + category: BootstrapPackage.content-elements.gallery + type: string + default: 'gallery-item-size-1' + + plugin.bootstrap_package_contentelements.gallery.columns.2: + label: 'Item CSS Class for 2 columns' + category: BootstrapPackage.content-elements.gallery + type: string + default: 'gallery-item-size-2' + + plugin.bootstrap_package_contentelements.gallery.columns.3: + label: 'Item CSS Class for 3 columns' + category: BootstrapPackage.content-elements.gallery + type: string + default: 'gallery-item-size-3' + + plugin.bootstrap_package_contentelements.gallery.columns.4: + label: 'Item CSS Class for 4 columns' + category: BootstrapPackage.content-elements.gallery + type: string + default: 'gallery-item-size-4' + + plugin.bootstrap_package_contentelements.gallery.columns.5: + label: 'Item CSS Class for 5 columns' + category: BootstrapPackage.content-elements.gallery + type: string + default: 'gallery-item-size-5' + + plugin.bootstrap_package_contentelements.gallery.columns.6: + label: 'Item CSS Class for 6 columns' + category: BootstrapPackage.content-elements.gallery + type: string + default: 'gallery-item-size-6' + + # Menu Thumbnail + plugin.bootstrap_package_contentelements.menu_thumbnail.title.crop: + label: 'Crop Title' + category: BootstrapPackage.content-elements.menu-thumbnail + type: int + default: 100 + + plugin.bootstrap_package_contentelements.menu_thumbnail.subtitle.crop: + label: 'Crop Subtitle' + category: BootstrapPackage.content-elements.menu-thumbnail + type: int + default: 100 + + # Menu Card + plugin.bootstrap_package_contentelements.menu_card.title.crop: + label: 'Crop Title' + category: BootstrapPackage.content-elements.menu-card + type: int + default: 100 + + plugin.bootstrap_package_contentelements.menu_card.subtitle.crop: + label: 'Crop Subtitle' + category: BootstrapPackage.content-elements.menu-card + type: int + default: 100 + + plugin.bootstrap_package_contentelements.menu_card.abstract.crop: + label: 'Crop Abstract' + category: BootstrapPackage.content-elements.menu-card + type: int + default: 250 + + plugin.bootstrap_package_contentelements.menu_card.icon.enable: + label: 'Enable Icon' + category: BootstrapPackage.content-elements.menu-card + type: bool + default: false + + plugin.bootstrap_package_contentelements.menu_card.icon.height: + label: 'Icon Height' + category: BootstrapPackage.content-elements.menu-card + type: string + default: '32' + + plugin.bootstrap_package_contentelements.menu_card.icon.width: + label: 'Icon Width' + category: BootstrapPackage.content-elements.menu-card + type: string + default: '32c' + + # Text and Icon + plugin.bootstrap_package_contentelements.texticon.icon.default.height: + label: 'Default Icon Height' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '32' + + plugin.bootstrap_package_contentelements.texticon.icon.default.width: + label: 'Default Icon Width' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '32' + + plugin.bootstrap_package_contentelements.texticon.icon.medium.height: + label: 'Medium Icon Height' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '48' + + plugin.bootstrap_package_contentelements.texticon.icon.medium.width: + label: 'Medium Icon Width' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '48' + + plugin.bootstrap_package_contentelements.texticon.icon.large.height: + label: 'Large Icon Height' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '64' + + plugin.bootstrap_package_contentelements.texticon.icon.large.width: + label: 'Large Icon Width' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '64' + + plugin.bootstrap_package_contentelements.texticon.icon.awesome.height: + label: 'Awesome Icon Height' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '80' + + plugin.bootstrap_package_contentelements.texticon.icon.awesome.width: + label: 'Awesome Icon Width' + category: BootstrapPackage.content-elements.text-and-icon + type: string + default: '80' + + # Timeline + plugin.bootstrap_package_contentelements.timeline.date.format: + label: 'Date Format' + category: BootstrapPackage.content-elements.timeline + type: string + default: '%B %e, %Y - %H:%M' + + # Uploads + plugin.bootstrap_package_contentelements.uploads.preview.height: + label: 'Preview Height' + category: BootstrapPackage.content-elements.uploads + type: string + default: '100c' + + plugin.bootstrap_package_contentelements.uploads.preview.width: + label: 'Preview Width' + category: BootstrapPackage.content-elements.uploads + type: string + default: '100c' diff --git a/Configuration/Sets/ContentElements/setup.typoscript b/Configuration/Sets/ContentElements/setup.typoscript new file mode 100644 index 000000000..8084cafd9 --- /dev/null +++ b/Configuration/Sets/ContentElements/setup.typoscript @@ -0,0 +1 @@ +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/setup.typoscript' diff --git a/Configuration/Sets/CookieConsent/config.yaml b/Configuration/Sets/CookieConsent/config.yaml new file mode 100644 index 000000000..106459422 --- /dev/null +++ b/Configuration/Sets/CookieConsent/config.yaml @@ -0,0 +1,3 @@ +name: bootstrap-package/cookie-consent +label: 'Bootstrap Package: Cookie Consent' +hidden: true diff --git a/Configuration/Sets/CookieConsent/settings.definitions.yaml b/Configuration/Sets/CookieConsent/settings.definitions.yaml new file mode 100644 index 000000000..2f17837c1 --- /dev/null +++ b/Configuration/Sets/CookieConsent/settings.definitions.yaml @@ -0,0 +1,99 @@ +categories: + BootstrapPackage: + label: 'Bootstrap Package' + BootstrapPackage.cookie-consent: + label: 'Cookie Consent' + parent: BootstrapPackage + +settings: + + page.theme.cookieconsent.enable: + label: 'Enable Cookie Consent' + description: 'For more information about this solution please head over to https://cookieconsent.insites.com/' + category: BootstrapPackage.cookie-consent + type: bool + default: true + + page.theme.cookieconsent.layout: + label: 'Layout' + category: BootstrapPackage.cookie-consent + type: string + enum: + 'basic': 'Basic' + 'basic-close': 'Basic Close' + 'basic-header': 'Basic Header' + default: 'basic-header' + + page.theme.cookieconsent.position: + label: 'Position' + description: 'If you specify "top" or "bottom", we assume that a full width "banner" is required. If however you specify a horizontal direction, we assume that a corner popup is required (which we call "floating").' + category: BootstrapPackage.cookie-consent + type: string + enum: + 'top': 'Banner Top' + 'bottom': 'Banner Bottom' + 'top-left': 'Floating Top Left' + 'top-right': 'Floating Top Right' + 'bottom-left': 'Floating Bottom Left' + 'bottom-right': 'Floating Bottom Right' + default: 'bottom' + + page.theme.cookieconsent.static: + label: 'Static Position' + description: 'The popup uses position fixed to stay in one place on the screen despite any scroll bars. This option makes the popup position static so it displays at the top of the page. A height animation has also been added by default so the popup doesn’t make the page jump, but gradually grows and fades in.' + category: BootstrapPackage.cookie-consent + type: bool + default: false + + page.theme.cookieconsent.content.href: + label: 'Privacy Police' + description: 'Insert a full Link to the privacy police page or a page uid from your current TYPO3 System.' + category: BootstrapPackage.cookie-consent + type: string + default: '' + + page.theme.cookieconsent.revokable: + label: 'Revokable' + description: 'If set true, revoke button is displayed every time. If false, revoke button is only displayed for advanced compliance options (opt-in and opt-out) and in countries that require revokable consent. The latter can be disabled by regionalLaw.' + category: BootstrapPackage.cookie-consent + type: bool + default: false + + page.theme.cookieconsent.location: + label: 'Location Detection' + description: 'Location is simply a tool for getting the two letter country code that the user is in.' + category: BootstrapPackage.cookie-consent + type: bool + default: false + + page.theme.cookieconsent.law.countryCode: + label: 'Country Code' + description: 'Rather than getting the country code from the location services, you can hard code a particular country into the tool.' + category: BootstrapPackage.cookie-consent + type: string + default: '' + + page.theme.cookieconsent.law.regionalLaw: + label: 'Regional Law' + description: 'If false, then we only enable the popup if the country has the cookie law. We ignore all other country specific rules.' + category: BootstrapPackage.cookie-consent + type: bool + default: true + + page.theme.cookieconsent.type: + label: 'Compliance' + description: 'The informal confirmation does not require any further adjustments to your JavaScript. The Opt-In and Opt-Out options are not out-of-the-box solutions, manual adjustments to your software are necessary. For your support we provide the events bk2k.cookie.enable, bk2k.cookie.disable and bk2k.cookie.revoke. These events allow you to let your application react to them and to set or remove cookies accordingly. The cookie that contains the current status is called cookieconsent_status.' + category: BootstrapPackage.cookie-consent + type: string + enum: + 'info': 'Informal' + 'opt-in': 'Opt-In' + 'opt-out': 'Opt-Out' + default: 'info' + + page.theme.cookieconsent.cookie.expiryDays: + label: 'Expiry Days' + description: 'The cookies expire date, specified in days (specify -1 for no expiry)' + category: BootstrapPackage.cookie-consent + type: number + default: 365 diff --git a/Configuration/Sets/CookieConsent/setup.typoscript b/Configuration/Sets/CookieConsent/setup.typoscript new file mode 100644 index 000000000..936a62b51 --- /dev/null +++ b/Configuration/Sets/CookieConsent/setup.typoscript @@ -0,0 +1 @@ +@import 'EXT:bootstrap_package/Configuration/TypoScript/CookieConsent/setup.typoscript' diff --git a/Configuration/Sets/Full/config.yaml b/Configuration/Sets/Full/config.yaml new file mode 100644 index 000000000..2e1d0ecc3 --- /dev/null +++ b/Configuration/Sets/Full/config.yaml @@ -0,0 +1,9 @@ +name: bootstrap-package/full +label: 'Bootstrap Package: Full Package' +dependencies: + - bootstrap-package/bootstrap-5 + - bootstrap-package/content-elements + - bootstrap-package/cookie-consent + - bootstrap-package/google-font + - bootstrap-package/google-tag-manager + - bootstrap-package/skiplink diff --git a/Configuration/Sets/Full/settings.definitions.yaml b/Configuration/Sets/Full/settings.definitions.yaml new file mode 100644 index 000000000..ed65a193d --- /dev/null +++ b/Configuration/Sets/Full/settings.definitions.yaml @@ -0,0 +1,758 @@ +categories: + BootstrapPackage: + label: 'Bootstrap Package' + BootstrapPackage.logo: + label: 'Logo' + parent: BootstrapPackage + BootstrapPackage.favicon: + label: 'Favicon' + parent: BootstrapPackage + BootstrapPackage.templates: + label: 'Templates' + parent: BootstrapPackage + BootstrapPackage.templates.page: + label: 'Pages' + parent: BootstrapPackage.templates + BootstrapPackage.templates.block: + label: 'Block' + parent: BootstrapPackage.templates + BootstrapPackage.templates.plugin: + label: 'Plugin' + parent: BootstrapPackage.templates + BootstrapPackage.navigation: + label: 'Navigation' + parent: BootstrapPackage + BootstrapPackage.navigation.main: + label: 'Main' + parent: BootstrapPackage.navigation + BootstrapPackage.navigation.dropdown: + label: 'Dropdown' + parent: BootstrapPackage.navigation + BootstrapPackage.navigation.sub: + label: 'Subnavigation' + parent: BootstrapPackage.navigation + BootstrapPackage.navigation.breadcrumb: + label: 'Breadcrumb' + parent: BootstrapPackage.navigation + BootstrapPackage.navigation.meta: + label: 'Meta' + parent: BootstrapPackage.navigation + BootstrapPackage.navigation.footer: + label: 'Footer' + parent: BootstrapPackage.navigation + BootstrapPackage.navigation.language: + label: 'Language' + parent: BootstrapPackage.navigation + BootstrapPackage.contact: + label: 'Contact' + parent: BootstrapPackage + BootstrapPackage.contact.data: + label: 'Data' + parent: BootstrapPackage.contact + BootstrapPackage.contact.button: + label: 'Button' + parent: BootstrapPackage.contact + BootstrapPackage.copyright: + label: 'Copyright' + parent: BootstrapPackage + BootstrapPackage.socialmedia: + label: 'Social Media' + parent: BootstrapPackage + BootstrapPackage.meta: + label: 'Meta' + parent: BootstrapPackage + BootstrapPackage.config: + label: 'Config' + parent: BootstrapPackage + BootstrapPackage.settings: + label: 'Settings' + parent: BootstrapPackage + +settings: + + # Logo + page.logo.file: + label: 'Logo' + description: 'Leave blank to use website title from template instead' + category: BootstrapPackage.logo + type: string + default: 'EXT:bootstrap_package/Resources/Public/Images/BootstrapPackage.svg' + + page.logo.fileInverted: + label: 'Logo Inverted' + description: 'Leave blank to use website title from template instead' + category: BootstrapPackage.logo + type: string + default: 'EXT:bootstrap_package/Resources/Public/Images/BootstrapPackageInverted.svg' + + page.logo.height: + label: 'Height' + category: BootstrapPackage.logo + type: number + default: 52 + + page.logo.width: + label: 'Width' + category: BootstrapPackage.logo + type: number + default: 180 + + page.logo.alt: + label: 'Alternative text' + description: 'Text of the alt attribute of the logo image (default: " logo"' + category: BootstrapPackage.logo + type: string + default: '' + + page.logo.linktitle: + label: 'Link title' + description: 'Title of the link attribute of the logo image' + category: BootstrapPackage.logo + type: string + default: '' + + # Favicon + page.favicon.file: + label: 'Favicon' + category: BootstrapPackage.favicon + type: string + default: 'EXT:bootstrap_package/Resources/Public/Icons/favicon.ico' + + # Navigation + page.theme.navigation.style: + label: 'Navigation Style' + category: BootstrapPackage.navigation.main + type: string + enum: + 'default': 'Default' + 'default-transition': 'Default Transition' + 'inverse': 'Inverse' + 'inverse-transition': 'Inverse Transition' + default: 'default' + + page.theme.navigation.type: + label: 'Navigation Style' + category: BootstrapPackage.navigation.main + type: string + enum: + '': 'Default' + 'top': 'Fixed' + default: '' + + page.theme.navigation.icon.enable: + label: 'Navigation Icon Enable' + category: BootstrapPackage.navigation.main + type: bool + default: true + + page.theme.navigation.icon.width: + label: 'Navigation Icon Width' + category: BootstrapPackage.navigation.main + type: int + default: 20 + + page.theme.navigation.icon.height: + label: 'Navigation Icon Height' + category: BootstrapPackage.navigation.main + type: int + default: 20 + + # Dropdown + page.theme.navigation.dropdown.icon.enable: + label: 'Dropdown Icon Enable' + category: BootstrapPackage.navigation.dropdown + type: bool + default: true + + page.theme.navigation.dropdown.icon.width: + label: 'Dropdown Icon Height' + category: BootstrapPackage.navigation.dropdown + type: int + default: 16 + + page.theme.navigation.dropdown.icon.height: + label: 'Dropdown Icon Height' + category: BootstrapPackage.navigation.dropdown + type: int + default: 16 + + # Subnavigation + page.theme.subnavigation.icon.enable: + label: 'SubNavigation Icon Enable' + category: BootstrapPackage.navigation.sub + type: bool + default: true + + page.theme.subnavigation.icon.width: + label: 'SubNavigation Icon Height' + category: BootstrapPackage.navigation.sub + type: int + default: 16 + + page.theme.subnavigation.icon.height: + label: 'SubNavigation Icon Height' + category: BootstrapPackage.navigation.sub + type: int + default: 16 + + # Breadcrumb + page.theme.breadcrumb.enable: + label: 'Enable' + category: BootstrapPackage.navigation.breadcrumb + type: bool + default: true + + page.theme.breadcrumb.enableLevel: + label: 'Show menu level if greater or equal to this value' + category: BootstrapPackage.navigation.breadcrumb + type: int + default: 2 + + page.theme.breadcrumb.icon.enable: + label: 'Breadcrumb Icon Enable' + category: BootstrapPackage.navigation.breadcrumb + type: bool + default: true + + page.theme.breadcrumb.icon.width: + label: 'Breadcrumb Icon Height' + category: BootstrapPackage.navigation.breadcrumb + type: int + default: 16 + + page.theme.breadcrumb.icon.height: + label: 'Breadcrumb Icon Height' + category: BootstrapPackage.navigation.breadcrumb + type: int + default: 16 + + # Meta + page.theme.meta.enable: + label: 'Enable' + category: BootstrapPackage.navigation.meta + type: bool + default: true + + page.theme.meta.navigationValue: + label: 'Values' + description: 'Comma separated list of page uids' + category: BootstrapPackage.navigation.meta + type: string + default: '' + + page.theme.meta.navigationType: + label: 'Type' + category: BootstrapPackage.navigation.meta + type: string + enum: + 'list': 'List' + 'directory': 'Directory' + default: 'list' + + page.theme.meta.includeNotInMenu: + label: 'Include items not in menu' + category: BootstrapPackage.navigation.meta + type: bool + default: true + + # Footer + page.theme.footernavigation.enable: + label: 'Enable' + category: BootstrapPackage.navigation.footer + type: bool + default: true + + page.theme.footernavigation.navigationValue: + label: 'Values' + description: 'Comma separated list of page uids' + category: BootstrapPackage.navigation.footer + type: string + default: '' + + page.theme.footernavigation.navigationType: + label: 'Type' + category: BootstrapPackage.navigation.footer + type: string + enum: + 'list': 'List' + 'directory': 'Directory' + default: 'list' + + page.theme.footernavigation.includeNotInMenu: + label: 'Include items not in menu' + category: BootstrapPackage.navigation.footer + type: bool + default: true + + page.theme.footernavigation.levels: + label: 'Levels' + category: BootstrapPackage.navigation.footer + type: int + default: 2 + + page.theme.footernavigation.icon.enable: + label: 'Footer Icon Enable' + category: BootstrapPackage.navigation.footer + type: bool + default: true + + page.theme.footernavigation.icon.width: + label: 'Footer Icon Height' + category: BootstrapPackage.navigation.footer + type: int + default: 16 + + page.theme.footernavigation.icon.height: + label: 'Footer Icon Height' + category: BootstrapPackage.navigation.footer + type: int + default: 16 + + # Language + page.theme.language.enable: + label: 'Enable' + category: BootstrapPackage.navigation.language + type: bool + default: true + + page.theme.language.languageValue: + label: 'Language Navigation' + description: 'Comma separated list of language uids or set to "auto" to load all enabled system languages' + category: BootstrapPackage.navigation.language + type: string + default: 'auto' + + # Contact + page.theme.contact.enable: + label: 'Enable' + category: BootstrapPackage.contact + type: bool + default: false + + page.theme.contact.label: + label: 'Label' + category: BootstrapPackage.contact + type: string + default: 'LLL:EXT:bootstrap_package/Resources/Private/Language/locallang.xlf:contact.label' + + # Contact Data + page.theme.contact.data.title: + label: 'Title' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.addressLine1: + label: 'Address Line 1' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.addressLine2: + label: 'Address Line 2' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.addressLine3: + label: 'Address Line 3' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.country: + label: 'Country' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.phone: + label: 'Phone' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.fax: + label: 'Fax' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.email: + label: 'Email' + category: BootstrapPackage.contact.data + type: string + default: '' + + page.theme.contact.data.www: + label: 'WWW' + category: BootstrapPackage.contact.data + type: string + default: '' + + # Contact Button + page.theme.contact.button.pageUid: + label: 'Page Uid' + category: BootstrapPackage.contact.button + type: int + default: 0 + + page.theme.contact.button.label: + label: 'Page Uid' + category: BootstrapPackage.contact.button + type: string + default: 'LLL:EXT:bootstrap_package/Resources/Private/Language/locallang.xlf:contact.button.label' + + page.theme.contact.button.colorClass: + label: 'Class' + category: BootstrapPackage.contact.button + type: string + enum: + 'primary': 'primary' + 'secondary': 'secondary' + default: 'primary' + + # Copyright + page.theme.copyright.enable: + label: 'Enable' + category: BootstrapPackage.copyright + type: bool + default: true + + page.theme.copyright.text: + label: 'Text' + category: BootstrapPackage.copyright + type: string + default: 'Running with TYPO3 and Bootstrap Package.' + + # Social Media + page.theme.socialmedia.enable: + label: 'Enable' + category: BootstrapPackage.socialmedia + type: bool + default: true + + page.theme.socialmedia.channels.facebook.label: + label: 'Facebook Label' + category: BootstrapPackage.socialmedia + type: string + default: 'Facebook' + + page.theme.socialmedia.channels.facebook.url: + label: 'Facebook Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.x.label: + label: 'X Label' + category: BootstrapPackage.socialmedia + type: string + default: 'X' + + page.theme.socialmedia.channels.x.url: + label: 'X Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.threads.label: + label: 'Threads Label' + category: BootstrapPackage.socialmedia + type: string + default: 'Threads' + + page.theme.socialmedia.channels.threads.url: + label: 'Threads Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.telegram.label: + label: 'Telegram Label' + category: BootstrapPackage.socialmedia + type: string + default: 'Telegram' + + page.theme.socialmedia.channels.telegram.url: + label: 'Telegram Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.instagram.label: + label: 'Instagram Label' + category: BootstrapPackage.socialmedia + type: string + default: 'Instagram' + + page.theme.socialmedia.channels.instagram.url: + label: 'Instagram Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.github.label: + label: 'GitHub Label' + category: BootstrapPackage.socialmedia + type: string + default: 'GitHub' + + page.theme.socialmedia.channels.github.url: + label: 'GitHub Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.linkedin.label: + label: 'LinkedIn Label' + category: BootstrapPackage.socialmedia + type: string + default: 'LinkedIn' + + page.theme.socialmedia.channels.linkedin.url: + label: 'LinkedIn Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.xing.label: + label: 'Xing Label' + category: BootstrapPackage.socialmedia + type: string + default: 'Xing' + + page.theme.socialmedia.channels.xing.url: + label: 'Xing Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.youtube.label: + label: 'YouTube Label' + category: BootstrapPackage.socialmedia + type: string + default: 'YouTube' + + page.theme.socialmedia.channels.youtube.url: + label: 'YouTube Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.vk.label: + label: 'VK Label' + category: BootstrapPackage.socialmedia + type: string + default: 'VK' + + page.theme.socialmedia.channels.vk.url: + label: 'VK Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.vimeo.label: + label: 'Vimeo Label' + category: BootstrapPackage.socialmedia + type: string + default: 'Vimeo' + + page.theme.socialmedia.channels.vimeo.url: + label: 'Vimeo Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + page.theme.socialmedia.channels.rss.label: + label: 'RSS Label' + category: BootstrapPackage.socialmedia + type: string + default: 'RSS' + + page.theme.socialmedia.channels.rss.url: + label: 'RSS Url' + description: 'Insert the full account url' + category: BootstrapPackage.socialmedia + type: string + default: '' + + # Template Page + page.fluidtemplate.layoutRootPath: + label: 'Layout Root Path' + category: BootstrapPackage.templates.page + type: string + default: 'EXT:bootstrap_package/Resources/Private/Layouts/Page/' + + page.fluidtemplate.partialRootPath: + label: 'Partial Root Path' + category: BootstrapPackage.templates.page + type: string + default: 'EXT:bootstrap_package/Resources/Private/Partials/Page/' + + page.fluidtemplate.templateRootPath: + label: 'Template Root Path' + category: BootstrapPackage.templates.page + type: string + default: 'EXT:bootstrap_package/Resources/Private/Partials/Page/' + + # Template Block + plugin.bootstrap_package_blocks.view.layoutRootPath: + label: 'Layout Root Path' + category: BootstrapPackage.templates.block + type: string + default: 'EXT:bootstrap_package/Resources/Private/Layouts/Blocks/' + + plugin.bootstrap_package_blocks.view.partialRootPath: + label: 'Partial Root Path' + category: BootstrapPackage.templates.block + type: string + default: 'EXT:bootstrap_package/Resources/Private/Partials/Blocks/' + + plugin.bootstrap_package_blocks.view.templateRootPath: + label: 'Template Root Path' + category: BootstrapPackage.templates.block + type: string + default: 'EXT:bootstrap_package/Resources/Private/Partials/Blocks/' + + # Template Plugin + plugin.bootstrap_package.view.layoutRootPath: + label: 'Layout Root Path' + category: BootstrapPackage.templates.plugin + type: string + default: 'EXT:bootstrap_package/Resources/Private/Layouts/' + + plugin.bootstrap_package.view.partialRootPath: + label: 'Partial Root Path' + category: BootstrapPackage.templates.plugin + type: string + default: 'EXT:bootstrap_package/Resources/Private/Partials/' + + plugin.bootstrap_package.view.templateRootPath: + label: 'Template Root Path' + category: BootstrapPackage.templates.plugin + type: string + default: 'EXT:bootstrap_package/Resources/Private/Partials/' + + # Settings + plugin.bootstrap_package.settings.cssSourceMapping: + label: 'CSS source mapping' + description: 'Create a CSS source map useful to debug CSS in browser developer tools. Note: CSS compression will be disabled.' + category: BootstrapPackage.settings + type: bool + default: false + + plugin.bootstrap_package.settings.overrideParserVariables: + label: 'Override Parser Variables' + description: 'If enabled the variables defined in your SCSS files will be overridden with the ones defined as Site Settings' + category: BootstrapPackage.settings + type: bool + default: true + + # Meta + page.meta.viewport: + label: 'viewport' + category: BootstrapPackage.meta + type: string + default: 'width=device-width, initial-scale=1, minimum-scale=1' + + page.meta.robots: + label: 'robots' + category: BootstrapPackage.meta + type: string + default: 'index,follow' + + page.meta.apple-mobile-web-app-capable: + label: 'apple-mobile-web-app-capable' + category: BootstrapPackage.meta + type: string + default: 'no' + + page.meta.compatible: + label: 'compatible' + category: BootstrapPackage.meta + type: string + default: 'IE=edge' + + page.meta.google: + label: 'google' + category: BootstrapPackage.meta + type: string + default: 'notranslate' + + page.meta.google-site-verification: + label: 'google-site-verification' + category: BootstrapPackage.meta + type: string + default: '' + + # Config + config.no_cache: + label: 'No Cache' + category: BootstrapPackage.config + type: bool + default: false + + config.removeDefaultJS: + label: 'Remove default JavaScript' + category: BootstrapPackage.config + type: string + enum: + '0': 'Do not remove' + '1': 'Remove' + 'external': 'Move to external file' + default: '0' + + config.compressJs: + label: 'Compress JavaScript' + category: BootstrapPackage.config + type: bool + default: true + + config.compressCss: + label: 'Compress CSS' + category: BootstrapPackage.config + type: bool + default: true + + config.concatenateJs: + label: 'Concatenate JavaScript' + category: BootstrapPackage.config + type: bool + default: true + + config.concatenateCss: + label: 'Concatenate CSS' + category: BootstrapPackage.config + type: bool + default: true + + config.admPanel: + label: 'Admin Panel' + category: BootstrapPackage.config + type: bool + default: true + + config.headerComment: + label: 'Header Comment' + category: BootstrapPackage.config + type: string + default: 'Based on the TYPO3 Bootstrap Package by Benjamin Kott - https://www.bootstrap-package.com/' + + config.sendCacheHeaders: + label: 'Send cache headers' + description: 'Allow appropriate caching by transparent proxies and browser clients' + category: BootstrapPackage.config + type: bool + default: true diff --git a/Configuration/Sets/Full/setup.typoscript b/Configuration/Sets/Full/setup.typoscript new file mode 100644 index 000000000..4d3e364fd --- /dev/null +++ b/Configuration/Sets/Full/setup.typoscript @@ -0,0 +1,8 @@ +# HELPER +@import 'EXT:bootstrap_package/Configuration/TypoScript/Helper/Block.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/Helper/PageClass.typoscript' + +# GENERAL +@import 'EXT:bootstrap_package/Configuration/TypoScript/General/page.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/General/plugin.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/General/config.typoscript' diff --git a/Configuration/Sets/GoogleFont/config.yaml b/Configuration/Sets/GoogleFont/config.yaml new file mode 100644 index 000000000..cb9dfc73d --- /dev/null +++ b/Configuration/Sets/GoogleFont/config.yaml @@ -0,0 +1,3 @@ +name: bootstrap-package/google-font +label: 'Bootstrap Package: Google Font' +hidden: true diff --git a/Configuration/Sets/GoogleFont/settings.definitions.yaml b/Configuration/Sets/GoogleFont/settings.definitions.yaml new file mode 100644 index 000000000..1ea2613ec --- /dev/null +++ b/Configuration/Sets/GoogleFont/settings.definitions.yaml @@ -0,0 +1,27 @@ +categories: + BootstrapPackage: + label: 'Bootstrap Package' + BootstrapPackage.google-font: + label: 'Google Font' + parent: BootstrapPackage + +settings: + + page.theme.googleFont.enable: + label: 'Enable' + category: BootstrapPackage.google-font + type: bool + default: true + + page.theme.googleFont.font: + label: 'Font' + category: BootstrapPackage.google-font + type: string + default: 'Source Sans Pro' + + page.theme.googleFont.weight: + label: 'Font Weights' + description: 'Comma separated list of font weights' + category: BootstrapPackage.google-font + type: string + default: '300,400,700' diff --git a/Configuration/Sets/GoogleFont/setup.typoscript b/Configuration/Sets/GoogleFont/setup.typoscript new file mode 100644 index 000000000..f6626d40b --- /dev/null +++ b/Configuration/Sets/GoogleFont/setup.typoscript @@ -0,0 +1 @@ +@import 'EXT:bootstrap_package/Configuration/TypoScript/GoogleTagManager/setup.typoscript' diff --git a/Configuration/Sets/GoogleTagManager/config.yaml b/Configuration/Sets/GoogleTagManager/config.yaml new file mode 100644 index 000000000..3d3302a49 --- /dev/null +++ b/Configuration/Sets/GoogleTagManager/config.yaml @@ -0,0 +1,3 @@ +name: bootstrap-package/google-tag-manager +label: 'Bootstrap Package: Google Tag Manager' +hidden: true diff --git a/Configuration/Sets/GoogleTagManager/settings.definitions.yaml b/Configuration/Sets/GoogleTagManager/settings.definitions.yaml new file mode 100644 index 000000000..fde8748b2 --- /dev/null +++ b/Configuration/Sets/GoogleTagManager/settings.definitions.yaml @@ -0,0 +1,15 @@ +categories: + BootstrapPackage: + label: 'Bootstrap Package' + BootstrapPackage.google-tag-manager: + label: 'Google Tag Manager' + parent: BootstrapPackage + +settings: + + page.tracking.google.tagManagerContainerId: + label: 'Container-ID' + description: 'Google Tag Manager Container ID' + category: BootstrapPackage.google-tag-manager + type: string + default: '' diff --git a/Configuration/Sets/GoogleTagManager/setup.typoscript b/Configuration/Sets/GoogleTagManager/setup.typoscript new file mode 100644 index 000000000..f6626d40b --- /dev/null +++ b/Configuration/Sets/GoogleTagManager/setup.typoscript @@ -0,0 +1 @@ +@import 'EXT:bootstrap_package/Configuration/TypoScript/GoogleTagManager/setup.typoscript' diff --git a/Configuration/Sets/Skiplink/config.yaml b/Configuration/Sets/Skiplink/config.yaml new file mode 100644 index 000000000..8462e9a08 --- /dev/null +++ b/Configuration/Sets/Skiplink/config.yaml @@ -0,0 +1,3 @@ +name: bootstrap-package/skiplink +label: 'Bootstrap Package: Skiplink' +hidden: true diff --git a/Configuration/Sets/Skiplink/setup.typoscript b/Configuration/Sets/Skiplink/setup.typoscript new file mode 100644 index 000000000..516b29ee4 --- /dev/null +++ b/Configuration/Sets/Skiplink/setup.typoscript @@ -0,0 +1 @@ +@import 'EXT:bootstrap_package/Configuration/TypoScript/Skiplink/setup.typoscript' diff --git a/Configuration/TypoScript/General/config.typoscript b/Configuration/TypoScript/General/config.typoscript new file mode 100644 index 000000000..e6593aac5 --- /dev/null +++ b/Configuration/TypoScript/General/config.typoscript @@ -0,0 +1,22 @@ +config { + absRefPrefix = auto + no_cache = {$config.no_cache} + pageTitleFirst = 1 + pageTitleSeparator = - + pageTitleSeparator.noTrimWrap = | | | + doctype = html5 + removeDefaultJS = {$config.removeDefaultJS} + admPanel = {$config.admPanel} + debug = 0 + sendCacheHeaders = {$config.sendCacheHeaders} + index_enable = 1 + index_externals = 1 + index_metatags = 1 + headerComment = {$config.headerComment} + + // Compression and Concatenation of CSS and JS Files + compressJs = {$config.compressJs} + compressCss = {$config.compressCss} + concatenateJs = {$config.concatenateJs} + concatenateCss = {$config.concatenateCss} +} diff --git a/Configuration/TypoScript/General/page.typoscript b/Configuration/TypoScript/General/page.typoscript new file mode 100644 index 000000000..de227139a --- /dev/null +++ b/Configuration/TypoScript/General/page.typoscript @@ -0,0 +1,324 @@ +page = PAGE +page { + typeNum = 0 + shortcutIcon = {$page.favicon.file} + + bodyTagCObject = COA + bodyTagCObject { + 10 = TEXT + 10.data = TSFE:id + 10.noTrimWrap = | id="p|"| + 20 =< lib.page.class + 20.stdWrap.noTrimWrap = | class="|"| + wrap = + } + + headerData { + // Flip ahead browsing for IE10/11 + // http://msdn.microsoft.com/en-us/library/ie/jj883726(v=vs.85).aspx + 10 = HMENU + 10 { + special = browse + special { + items = prev|next + } + 1 = TMENU + 1.NO { + allWrap = |*| + doNotLinkIt = 1 + stdWrap { + typolink { + parameter.data = field:uid + returnLast = url + } + } + } + } + } + + 10 = FLUIDTEMPLATE + 10 { + # Template names will be generated automatically by converting the applied + # backend_layout, there is no explicit mapping necessary anymore. + # + # BackendLayout Key + # subnavigation_right_2_columns -> SubnavigationRight2Columns.html + # + # Backend Record + # uid: 1 -> 1.html + # + # Database Entry + # value: -1 -> None.html + # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html + templateName = TEXT + templateName { + cObject = TEXT + cObject { + data = pagelayout + required = 1 + case = uppercamelcase + split { + token = pagets__ + cObjNum = 1 + 1.current = 1 + } + } + ifEmpty = Default + } + + templateRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Templates/Page/ + 1 = {$page.fluidtemplate.templateRootPath} + } + partialRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Partials/Page/ + 1 = {$page.fluidtemplate.partialRootPath} + } + layoutRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Layouts/Page/ + 1 = {$page.fluidtemplate.layoutRootPath} + } + + dataProcessing { + 1 = BK2K\BootstrapPackage\DataProcessing\ConstantsProcessor + 1 { + as = theme + key = page.theme + } + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + levels = 3 + includeSpacer = 1 + as = mainnavigation + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + if { + isTrue.stdWrap.cObject = COA + isTrue.stdWrap.cObject { + 10 = TEXT + 10.value = 1 + 10.if.isTrue = {$page.theme.navigation.icon.enable} + 20 = TEXT + 20.value = 1 + 20.if.isTrue = {$page.theme.navigation.dropdown.icon.enable} + } + } + } + } + } + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + entryLevel = 1 + levels = 2 + expandAll = 0 + includeSpacer = 1 + as = subnavigation + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + if { + isTrue = {$page.theme.subnavigation.icon.enable} + } + } + } + } + 30 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 30 { + special = rootline + special.range = 0|-1 + includeNotInMenu = 1 + as = breadcrumb + if { + value = {$page.theme.breadcrumb.enableLevel} + value { + insertData = 1 + prioriCalc = 1 + stdWrap.wrap = |-1 + } + isGreaterThan { + data = level + } + } + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + } + } + } + 40 = TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor + 40 { + languages = {$page.theme.language.languageValue} + as = languagenavigation + } + 50 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 50 { + special = {$page.theme.meta.navigationType} + special.value = {$page.theme.meta.navigationValue} + includeNotInMenu = {$page.theme.meta.includeNotInMenu} + as = metanavigation + if { + isTrue = {$page.theme.meta.navigationValue} + } + } + 1629126321 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 1629126321 { + special = {$page.theme.footernavigation.navigationType} + special.value = {$page.theme.footernavigation.navigationValue} + includeNotInMenu = {$page.theme.footernavigation.includeNotInMenu} + levels = {$page.theme.footernavigation.levels} + as = footernavigation + if { + isTrue = {$page.theme.footernavigation.navigationValue} + } + dataProcessing { + 1629202464 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1629202464 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + } + } + } + 1553883874 = BK2K\BootstrapPackage\DataProcessing\StaticFilesProcessor + 1553883874 { + files { + normal = {$page.logo.file} + inverted = {$page.logo.fileInverted} + } + as = logo + } + } + + settings { + logo { + height = {$page.logo.height} + width = {$page.logo.width} + linktitle = {$page.logo.linktitle} + } + } + + variables { + pageTitle = TEXT + pageTitle.data = page:title + siteTitle = TEXT + siteTitle.data = siteLanguage:websiteTitle//site:websiteTitle//site:identifier + rootPage = TEXT + rootPage.data = leveluid:0 + pagelayout = TEXT + pagelayout { + data = pagelayout + replacement.10 { + search = pagets__ + replace = + } + ifEmpty = default + } + logoAlt = COA + logoAlt { + 10 = TEXT + 10 { + data = siteLanguage:websiteTitle//site:websiteTitle//site:identifier + noTrimWrap = || logo| + if.isFalse = {$page.logo.alt} + } + 20 = TEXT + 20 { + value = {$page.logo.alt} + if.isTrue = {$page.logo.alt} + } + } + # BreadcrumbExtendedValue should be used to display the title of a + # single record. For example the title of a news record. + breadcrumbExtendedValue = COA + breadcrumbExtendedValue { + } + } + + stdWrap.replacement { + 1 { + search = http://###BACKEND_URL###/ + replace.typolink { + parameter = typo3/ + returnLast = url + } + } + 2 { + search = ###FRONTEND_URL### + replace.typolink { + parameter.data = leveluid:0 + returnLast = url + } + } + 3 { + search = ###CURRENTYEAR### + replace { + data = date:U + strftime = %Y + } + } + 4 { + search = ###SPACE### + replace { + char = 32 + } + } + } + } + + 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 + } + + # Google + google = {$page.meta.google} + google-site-verification = {$page.meta.google-site-verification} + } + + includeCSSLibs { + googlewebfont = https://fonts.googleapis.com/css?display=swap&family={$page.theme.googleFont.font}:{$page.theme.googleFont.weight} + googlewebfont { + external = 1 + disableCompression = 1 + excludeFromConcatenation = 1 + if { + isTrue = {$page.theme.googleFont.enable} + } + } + bootstrappackageicon = EXT:bootstrap_package/Resources/Public/Fonts/bootstrappackageicon.min.css + } + + includeJSFooterlibs { + #### Contrib + photoswipe_core = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe.umd.min.js + photoswipe_ui = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe-lightbox.umd.min.js + photoswipe_caption = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe-dynamic-caption-plugin.umd.min.js + + #### Custom Modules + bootstrap_accordion = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.accordion.min.js + bootstrap_popover = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.popover.min.js + bootstrap_stickyheader = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.stickyheader.min.js + bootstrap_smoothscroll = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.smoothscroll.min.js + bootstrap_lightbox = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.lightbox.min.js + bootstrap_navbar = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.navbar.min.js + } +} diff --git a/Configuration/TypoScript/General/plugin.typoscript b/Configuration/TypoScript/General/plugin.typoscript new file mode 100644 index 000000000..89904501a --- /dev/null +++ b/Configuration/TypoScript/General/plugin.typoscript @@ -0,0 +1,7 @@ +plugin.tx_bootstrappackage { + # BOOTSTRAP PACKAGE SETTINGS + settings { + overrideParserVariables = {$plugin.bootstrap_package.settings.overrideParserVariables} + cssSourceMapping = {$plugin.bootstrap_package.settings.cssSourceMapping} + } +} diff --git a/Configuration/TypoScript/GoogleFont/constants.typoscript b/Configuration/TypoScript/GoogleFont/constants.typoscript new file mode 100644 index 000000000..f5cdcddcf --- /dev/null +++ b/Configuration/TypoScript/GoogleFont/constants.typoscript @@ -0,0 +1,14 @@ +# CUSTOM SUBCATEGORIES +# customsubcategory=161=Font +page { + theme { + googleFont { + # cat=bootstrap package: google font/161/1_enable; type=boolean; label=Enable + enable = 1 + # cat=bootstrap package: google font/161/2_font; type=options[Lora=Lora, Merriweather=Merriweather, Nunito=Nunito, Raleway=Raleway, Roboto=Roboto, Source Sans Pro=Source Sans Pro, Quattrocento=Quattrocento, Ubuntu=Ubuntu]; label=Font + font = Source Sans Pro + # cat=bootstrap package: google font/161/3_weight; type=string; label=Font Weights: Comma separated list of font weights + weight = 300,400,700 + } + } +} diff --git a/Configuration/TypoScript/GoogleFont/setup.typoscript b/Configuration/TypoScript/GoogleFont/setup.typoscript new file mode 100644 index 000000000..43b537169 --- /dev/null +++ b/Configuration/TypoScript/GoogleFont/setup.typoscript @@ -0,0 +1,13 @@ +page { + includeCSSLibs { + googlewebfont = https://fonts.googleapis.com/css?display=swap&family={$page.theme.googleFont.font}:{$page.theme.googleFont.weight} + googlewebfont { + external = 1 + disableCompression = 1 + excludeFromConcatenation = 1 + if { + isTrue = {$page.theme.googleFont.enable} + } + } + } +} diff --git a/Configuration/TypoScript/constants.typoscript b/Configuration/TypoScript/constants.typoscript index b6191aa06..2b144c073 100644 --- a/Configuration/TypoScript/constants.typoscript +++ b/Configuration/TypoScript/constants.typoscript @@ -48,15 +48,6 @@ page { } theme { - googleFont { - # cat=bootstrap package: google font/161/1_enable; type=boolean; label=Enable - enable = 1 - # cat=bootstrap package: google font/161/2_font; type=options[Lora=Lora, Merriweather=Merriweather, Nunito=Nunito, Raleway=Raleway, Roboto=Roboto, Source Sans Pro=Source Sans Pro, Quattrocento=Quattrocento, Ubuntu=Ubuntu]; label=Font - font = Source Sans Pro - # cat=bootstrap package: google font/161/3_weight; type=string; label=Font Weights: Comma separated list of font weights - weight = 300,400,700 - } - navigation { # cat=bootstrap package: navigation/151/100; type=options[Default=default, Default Transition=default-transition, Inverse=inverse, Inverse Transition=inverse-transition]; label=Navigation Style style = default @@ -309,8 +300,6 @@ config { concatenateCss = 1 # cat=bootstrap package: config/150/170; type=boolean; label=Admin Panel admPanel = 1 - # cat=bootstrap package: config/150/180; type=options[None=,All=all,Cached=cached,Output=output]; label=Prefix local Anchors: See [http://docs.typo3.org/typo3cms/TyposcriptReference/Setup/Config/Index.html#prefixlocalanchors] for explanation. - prefixLocalAnchors = all # cat=bootstrap package: config/150/190; type=string; label=Header Comment headerComment = Based on the TYPO3 Bootstrap Package by Benjamin Kott - https://www.bootstrap-package.com/ # cat=bootstrap package: config/150/210; type=boolean; label=Send cache headers: Allow appropriate caching by transparent proxies and browser clients @@ -344,6 +333,7 @@ plugin.bootstrap_package.view { # COMPONENTS @import 'EXT:bootstrap_package/Configuration/TypoScript/CookieConsent/constants.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/GoogleFont/constants.typoscript' @import 'EXT:bootstrap_package/Configuration/TypoScript/GoogleTagManager/constants.typoscript' # FRAMEWORK diff --git a/Configuration/TypoScript/setup.typoscript b/Configuration/TypoScript/setup.typoscript index fa4a73df3..d78922a4e 100644 --- a/Configuration/TypoScript/setup.typoscript +++ b/Configuration/TypoScript/setup.typoscript @@ -2,377 +2,18 @@ @import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/setup.typoscript' @import 'EXT:bootstrap_package/Configuration/TypoScript/Extension/setup.typoscript' - # HELPER @import 'EXT:bootstrap_package/Configuration/TypoScript/Helper/Block.typoscript' @import 'EXT:bootstrap_package/Configuration/TypoScript/Helper/PageClass.typoscript' - -# FRAMEWORK -@import 'EXT:bootstrap_package/Configuration/TypoScript/Bootstrap5/setup.typoscript' - - -plugin.tx_bootstrappackage { - # BOOTSTRAP PACKAGE SETTINGS - settings { - overrideParserVariables = {$plugin.bootstrap_package.settings.overrideParserVariables} - cssSourceMapping = {$plugin.bootstrap_package.settings.cssSourceMapping} - } -} - - -page = PAGE -page { - typeNum = 0 - shortcutIcon = {$page.favicon.file} - - bodyTagCObject = COA - bodyTagCObject { - 10 = TEXT - 10.data = TSFE:id - 10.noTrimWrap = | id="p|"| - 20 =< lib.page.class - 20.stdWrap.noTrimWrap = | class="|"| - wrap = - } - - headerData { - // Flip ahead browsing for IE10/11 - // http://msdn.microsoft.com/en-us/library/ie/jj883726(v=vs.85).aspx - 10 = HMENU - 10 { - special = browse - special { - items = prev|next - } - 1 = TMENU - 1.NO { - allWrap = |*| - doNotLinkIt = 1 - stdWrap { - typolink { - parameter.data = field:uid - returnLast = url - } - } - } - } - } - - 10 = FLUIDTEMPLATE - 10 { - # Template names will be generated automatically by converting the applied - # backend_layout, there is no explicit mapping necessary anymore. - # - # BackendLayout Key - # subnavigation_right_2_columns -> SubnavigationRight2Columns.html - # - # Backend Record - # uid: 1 -> 1.html - # - # Database Entry - # value: -1 -> None.html - # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html - templateName = TEXT - templateName { - cObject = TEXT - cObject { - data = pagelayout - required = 1 - case = uppercamelcase - split { - token = pagets__ - cObjNum = 1 - 1.current = 1 - } - } - ifEmpty = Default - } - - templateRootPaths { - 0 = EXT:bootstrap_package/Resources/Private/Templates/Page/ - 1 = {$page.fluidtemplate.templateRootPath} - } - partialRootPaths { - 0 = EXT:bootstrap_package/Resources/Private/Partials/Page/ - 1 = {$page.fluidtemplate.partialRootPath} - } - layoutRootPaths { - 0 = EXT:bootstrap_package/Resources/Private/Layouts/Page/ - 1 = {$page.fluidtemplate.layoutRootPath} - } - - dataProcessing { - 1 = BK2K\BootstrapPackage\DataProcessing\ConstantsProcessor - 1 { - as = theme - key = page.theme - } - 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - 10 { - levels = 3 - includeSpacer = 1 - as = mainnavigation - dataProcessing { - 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor - 1628754217 { - iconSet.field = nav_icon_set - iconIdentifier.field = nav_icon_identifier - iconFileFieldName = nav_icon - as = icon - if { - isTrue.stdWrap.cObject = COA - isTrue.stdWrap.cObject { - 10 = TEXT - 10.value = 1 - 10.if.isTrue = {$page.theme.navigation.icon.enable} - 20 = TEXT - 20.value = 1 - 20.if.isTrue = {$page.theme.navigation.dropdown.icon.enable} - } - } - } - } - } - 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - 20 { - entryLevel = 1 - levels = 2 - expandAll = 0 - includeSpacer = 1 - as = subnavigation - dataProcessing { - 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor - 1628754217 { - iconSet.field = nav_icon_set - iconIdentifier.field = nav_icon_identifier - iconFileFieldName = nav_icon - as = icon - if { - isTrue = {$page.theme.subnavigation.icon.enable} - } - } - } - } - 30 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - 30 { - special = rootline - special.range = 0|-1 - includeNotInMenu = 1 - as = breadcrumb - if { - value = {$page.theme.breadcrumb.enableLevel} - value { - insertData = 1 - prioriCalc = 1 - stdWrap.wrap = |-1 - } - isGreaterThan { - data = level - } - } - dataProcessing { - 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor - 1628754217 { - iconSet.field = nav_icon_set - iconIdentifier.field = nav_icon_identifier - iconFileFieldName = nav_icon - as = icon - } - } - } - 40 = TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor - 40 { - languages = {$page.theme.language.languageValue} - as = languagenavigation - } - 50 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - 50 { - special = {$page.theme.meta.navigationType} - special.value = {$page.theme.meta.navigationValue} - includeNotInMenu = {$page.theme.meta.includeNotInMenu} - as = metanavigation - if { - isTrue = {$page.theme.meta.navigationValue} - } - } - 1629126321 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor - 1629126321 { - special = {$page.theme.footernavigation.navigationType} - special.value = {$page.theme.footernavigation.navigationValue} - includeNotInMenu = {$page.theme.footernavigation.includeNotInMenu} - levels = {$page.theme.footernavigation.levels} - as = footernavigation - if { - isTrue = {$page.theme.footernavigation.navigationValue} - } - dataProcessing { - 1629202464 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor - 1629202464 { - iconSet.field = nav_icon_set - iconIdentifier.field = nav_icon_identifier - iconFileFieldName = nav_icon - as = icon - } - } - } - 1553883874 = BK2K\BootstrapPackage\DataProcessing\StaticFilesProcessor - 1553883874 { - files { - normal = {$page.logo.file} - inverted = {$page.logo.fileInverted} - } - as = logo - } - } - - settings { - logo { - height = {$page.logo.height} - width = {$page.logo.width} - linktitle = {$page.logo.linktitle} - } - } - - variables { - pageTitle = TEXT - pageTitle.data = page:title - siteTitle = TEXT - siteTitle.data = siteLanguage:websiteTitle//site:websiteTitle//site:identifier - rootPage = TEXT - rootPage.data = leveluid:0 - pagelayout = TEXT - pagelayout { - data = pagelayout - replacement.10 { - search = pagets__ - replace = - } - ifEmpty = default - } - logoAlt = COA - logoAlt { - 10 = TEXT - 10 { - data = siteLanguage:websiteTitle//site:websiteTitle//site:identifier - noTrimWrap = || logo| - if.isFalse = {$page.logo.alt} - } - 20 = TEXT - 20 { - value = {$page.logo.alt} - if.isTrue = {$page.logo.alt} - } - } - # BreadcrumbExtendedValue should be used to display the title of a - # single record. For example the title of a news record. - breadcrumbExtendedValue = COA - breadcrumbExtendedValue { - } - } - - stdWrap.replacement { - 1 { - search = http://###BACKEND_URL###/ - replace.typolink { - parameter = typo3/ - returnLast = url - } - } - 2 { - search = ###FRONTEND_URL### - replace.typolink { - parameter.data = leveluid:0 - returnLast = url - } - } - 3 { - search = ###CURRENTYEAR### - replace { - data = date:U - strftime = %Y - } - } - 4 { - search = ###SPACE### - replace { - char = 32 - } - } - } - } - - 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 - } - - # Google - google = {$page.meta.google} - google-site-verification = {$page.meta.google-site-verification} - } - - includeCSSLibs { - googlewebfont = https://fonts.googleapis.com/css?display=swap&family={$page.theme.googleFont.font}:{$page.theme.googleFont.weight} - googlewebfont { - external = 1 - disableCompression = 1 - excludeFromConcatenation = 1 - if { - isTrue = {$page.theme.googleFont.enable} - } - } - bootstrappackageicon = EXT:bootstrap_package/Resources/Public/Fonts/bootstrappackageicon.min.css - } - - includeJSFooterlibs { - #### Contrib - photoswipe_core = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe.umd.min.js - photoswipe_ui = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe-lightbox.umd.min.js - photoswipe_caption = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe-dynamic-caption-plugin.umd.min.js - - #### Custom Modules - bootstrap_accordion = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.accordion.min.js - bootstrap_popover = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.popover.min.js - bootstrap_stickyheader = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.stickyheader.min.js - bootstrap_smoothscroll = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.smoothscroll.min.js - bootstrap_lightbox = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.lightbox.min.js - bootstrap_navbar = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.navbar.min.js - } -} - +# GENERAL +@import 'EXT:bootstrap_package/Configuration/TypoScript/General/page.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/General/plugin.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/General/config.typoscript' # COMPONENTS +@import 'EXT:bootstrap_package/Configuration/TypoScript/Bootstrap5/setup.typoscript' @import 'EXT:bootstrap_package/Configuration/TypoScript/CookieConsent/setup.typoscript' @import 'EXT:bootstrap_package/Configuration/TypoScript/Skiplink/setup.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/GoogleFont/setup.typoscript' @import 'EXT:bootstrap_package/Configuration/TypoScript/GoogleTagManager/setup.typoscript' - - -config { - absRefPrefix = auto - no_cache = {$config.no_cache} - pageTitleFirst = 1 - pageTitleSeparator = - - pageTitleSeparator.noTrimWrap = | | | - prefixLocalAnchors = {$config.prefixLocalAnchors} - doctype = html5 - removeDefaultJS = {$config.removeDefaultJS} - admPanel = {$config.admPanel} - debug = 0 - sendCacheHeaders = {$config.sendCacheHeaders} - index_enable = 1 - index_externals = 1 - index_metatags = 1 - headerComment = {$config.headerComment} - - // Compression and Concatenation of CSS and JS Files - compressJs = {$config.compressJs} - compressCss = {$config.compressCss} - concatenateJs = {$config.concatenateJs} - concatenateCss = {$config.concatenateCss} -} diff --git a/Documentation/Configuration/TypoScript/Index.rst b/Documentation/Configuration/TypoScript/Index.rst index 6a9a93fd4..1960ad9c7 100644 --- a/Documentation/Configuration/TypoScript/Index.rst +++ b/Documentation/Configuration/TypoScript/Index.rst @@ -239,8 +239,6 @@ config +-----------------------------------+---------------+-----------------------------------------------------------------------+ | admPanel | boolean | **1** | 0 | +-----------------------------------+---------------+-----------------------------------------------------------------------+ -| prefixLocalAnchors | options | EMPTY | **all** | cached | output | -+-----------------------------------+---------------+-----------------------------------------------------------------------+ | headerComment | string | Based on the TYPO3 Bootstrap Package | | | | by Benjamin Kott - http://www.bk2k.info | +-----------------------------------+---------------+-----------------------------------------------------------------------+