diff --git a/.postcssrc.mjs b/.postcssrc.mjs index 13c848faa..e46bce2e4 100644 --- a/.postcssrc.mjs +++ b/.postcssrc.mjs @@ -4,24 +4,7 @@ export default function (ctx) { "postcss-import": { resolve: ctx.resolve, }, - "tailwindcss/nesting": true, - tailwindcss: ctx.tailwindcss, - "postcss-assets": { - cachebuster: false, - basePath: `${ctx.basePath}/`, - baseUrl: "/_Resources/Static/Packages", - loadPaths: ["**/Resources/Public/**/*"], - }, - "postcss-clip-path-polyfill": true, - autoprefixer: true, - cssnano: ctx.minify - ? { - preset: ["default", { discardComments: { removeAll: true }, svgo: false, calc: false }], - } - : false, - "postcss-reporter": { - clearReportedMessages: true, - }, + "@tailwindcss/postcss": {}, }, }; } diff --git a/.stylelintrc b/.stylelintrc index 3ed8e4d00..615aeb05c 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -1,24 +1,9 @@ { - "extends": "stylelint-config-standard", + "extends": "stylelint-config-tailwindcss", "ignoreFiles": [ "**/Public/**", "**/Private/Templates/**", "node_modules/**", "**/*.noLinter.*" - ], - "rules": { - "selector-class-pattern": "[a-z-_0-9]+", - "value-keyword-case": [ - "lower", - { "camelCaseSvgKeywords": true, "ignoreFunctions": ["theme"] } - ], - "function-no-unknown": [true, { "ignoreFunctions": ["theme", "resolve"] }], - "declaration-property-value-no-unknown": [true, { "ignoreProperties": { - "/.+/": "/theme([^)]+)/" - }}], - "at-rule-no-unknown": [ - true, - { "ignoreAtRules": ["tailwind", "apply", "layer", "screen"] } - ] - } + ] } diff --git a/DistributionPackages/Neos.Presentation/Readme.md b/DistributionPackages/Neos.Presentation/Readme.md index a93582a3b..4b736b4dc 100644 --- a/DistributionPackages/Neos.Presentation/Readme.md +++ b/DistributionPackages/Neos.Presentation/Readme.md @@ -2,34 +2,14 @@ This package contains presentational components for neos.io sites. -## Structure - -The package is structured in the following way: - -- `Resources/Private/Fusion` - - [Atoms](Resources/Private/Fusion/Atom) are basic elements that can be used to build more complex components. They should be styled with custom CSS classes by `@apply` and sometimes can contain custom JS/TS files. - - [Molecules](Resources/Private/Fusion/Molecule) are wrapper/container components that modify an existing content. They should be styled with inline Tailwind classes and can contain custom CSS classes and custom JS/TS files. - - [Organisms](Resources/Private/Fusion/Organism) are complex components that need custom CSS, JS/TS and are composed of multiple components. - - [Modules](Resources/Private/Fusion/Module) are components built from multiple atoms and molecules and **must not** contain custom CSS and JS/TS files. - If it does not make sense to use inline Tailwind and AlpineJS, then it probably makes sense to either extract a common used functionality to Atoms/Molecules or move the whole Module to Organisms. - - [Templates](Resources/Private/Fusion/Template) should be used to define the structure of a page. They should not contain any custom CSS and JS/TS files. - - [Styles](Resources/Private/Fusion/Styles) are used to define global styles. In [Typography.pcss](Resources/Private/Fusion/Styles/Typography.pcss) we define the global typography styles. - These are named `.display-STYLENAME` and have the same name as defined in Figma. - - [Scripts](Resources/Private/Fusion/Scripts) are used to define global scripts. - ## Guidelines -### Fusion -Neos Fusion prototypes of Atoms, Molecules and Organisms should be named without prefix: -e.g **Button** = `Neos.Presentation:Button` - -Modules & Templates should be named with prefix: -e.g **Teaser** = `Neos.Presentation:Module.Teaser` - ### CSS + We primarily use [TailwindCSS](https://tailwindcss.com/) and [PostCSS](https://postcss.org/) for styling. It should cover at least 80% of the styling needs. -Only use custom CSS for advanced/complex stylings where you can `@apply` Tailwind classes to your custom CSS. +Only use custom CSS for advanced/complex stylings. ### JS/TS -We use inline [AlpineJS](https://alpinejs.dev/) for simple interactions and Alpine.data() for more complex interactions. + +We use inline [AlpineJS](https://alpinejs.dev/) for simple interactions and Alpine.data() for more complex interactions. diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Main.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Main.pcss new file mode 100644 index 000000000..9fed9e82e --- /dev/null +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Main.pcss @@ -0,0 +1,5 @@ +@import "tailwindcss" source(none); +@import url("./Styles/*.pcss"); +@import url("../Fusion/**/*.pcss"); +@plugin "tailwindcss-hocus"; +@source "../**/*.{fusion,js,ts,html}"; diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Main.ts b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Main.ts similarity index 100% rename from DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Main.ts rename to DistributionPackages/Neos.Presentation/Resources/Private/Assets/Main.ts diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/anchor.ts b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/anchor.ts similarity index 100% rename from DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/anchor.ts rename to DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/anchor.ts diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/directives.ts b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/directives.ts similarity index 100% rename from DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/directives.ts rename to DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/directives.ts diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/index.ts b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/index.ts new file mode 100644 index 000000000..a3f1e796e --- /dev/null +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/index.ts @@ -0,0 +1,38 @@ +import Alpine from 'alpinejs'; +import anchor from './anchor'; +import './magics'; +import './directives'; +import focus from '@alpinejs/focus'; +import intersect from '@alpinejs/intersect'; +import collapse from '@alpinejs/collapse'; +import clipboard from '@ryangjchandler/alpine-clipboard'; +import typewriter from '@marcreichel/alpine-typewriter'; +import disclosure from './ui/disclosure'; +import '../../Fusion/Presentation/LogoBar'; +import '../../Fusion/Organism/ImageCollage'; +import '../../Fusion/Organism/Navigation/Navigation.js'; + +Alpine.data('exclusiveDisclosure', function (id: string | number) { + return { + id, + get expanded() { + return this.active === this.id; + }, + set expanded(id) { + this.active = id ? this.id : null; + }, + init() { + Alpine.bind(this.$root, this.root); + }, + root: { + ['x-model']: 'expanded', + }, + }; +}); + +Alpine.plugin([anchor, clipboard, collapse, focus, intersect, typewriter, disclosure]); + +// @ts-ignore: Set Alpine as a global variable +window.Alpine = Alpine; + +export { Alpine }; diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/magics.ts b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/magics.ts similarity index 100% rename from DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/magics.ts rename to DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/magics.ts diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/raf.ts b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/raf.ts similarity index 100% rename from DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Scripts/raf.ts rename to DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/raf.ts diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/ui/disclosure.ts b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/ui/disclosure.ts new file mode 100644 index 000000000..7abb53b15 --- /dev/null +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Scripts/ui/disclosure.ts @@ -0,0 +1,89 @@ +export default function (Alpine) { + Alpine.directive('disclosure', (el, directive) => { + if (!directive.value) handleRoot(el, Alpine); + else if (directive.value === 'panel') handlePanel(el, Alpine); + else if (directive.value === 'button') handleButton(el, Alpine); + }).before('bind'); + + Alpine.magic('disclosure', (el) => { + let $data = Alpine.$data(el); + + return { + get isOpen() { + return $data.__isOpen; + }, + close() { + $data.__close(); + }, + }; + }); +} + +function handleRoot(el, Alpine) { + Alpine.bind(el, { + 'x-modelable': '__isOpen', + 'x-data'() { + return { + // The panel will call this... + // We can't do this inside a microtask in x-init because, when default-open is set to "true", + // It will cause the panel to transition in for the first time, instead of showing instantly... + __determineDefaultOpenState() { + let defaultIsOpen = Boolean(Alpine.bound(this.$el, 'default-open', false)); + + if (defaultIsOpen) this.__isOpen = defaultIsOpen; + }, + __isOpen: false, + __close() { + this.__isOpen = false; + }, + __toggle() { + this.__isOpen = !this.__isOpen; + }, + }; + }, + 'x-id'() { + return ['alpine-disclosure-panel']; + }, + }); +} + +function handleButton(el, Alpine) { + Alpine.bind(el, { + 'x-init'() { + if (this.$el.tagName.toLowerCase() === 'button' && !this.$el.hasAttribute('type')) this.$el.type = 'button'; + }, + '@click'() { + this.$data.__isOpen = !this.$data.__isOpen; + }, + ':aria-expanded'() { + return this.$data.__isOpen; + }, + ':aria-controls'() { + return this.$data.$id('alpine-disclosure-panel'); + }, + '@keydown.space.prevent.stop'() { + this.$data.__toggle(); + }, + '@keydown.enter.prevent.stop'() { + this.$data.__toggle(); + }, + // Required for firefox, event.preventDefault() in handleKeyDown for + // the Space key doesn't cancel the handleKeyUp, which in turn + // triggers a *click*. + '@keyup.space.prevent'() {}, + }); +} + +function handlePanel(el, Alpine) { + Alpine.bind(el, { + 'x-init'() { + this.$data.__determineDefaultOpenState(); + }, + 'x-show'() { + return this.$data.__isOpen; + }, + ':id'() { + return this.$data.$id('alpine-disclosure-panel'); + }, + }); +} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Styles/Animations.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Animations.pcss similarity index 67% rename from DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Styles/Animations.pcss rename to DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Animations.pcss index 1929ccadc..374d53ab9 100644 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Styles/Animations.pcss +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Animations.pcss @@ -1,3 +1,29 @@ +@theme { + --animate-infinite-scroll: infinite-scroll 20s linear infinite; + + @keyframes infinite-scroll { + from { + transform: translateX(0); + } + to { + transform: translateX(-100%); + } + } +} + +@utility animation-pause { + animation-play-state: paused; +} + +@utility animation-play { + animation-play-state: running; +} + +@utility animation-state-finish { + animation-play-state: paused; + animation-direction: reverse; +} + @media (prefers-reduced-motion: no-preference) { :root { --anim-opacity: none; diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Base.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Base.pcss new file mode 100644 index 000000000..93cf1bdda --- /dev/null +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Base.pcss @@ -0,0 +1,11 @@ +@theme { + --breakpoint-xxs: 23.5rem; /* 376px */ + --breakpoint-xs: 30rem; /* 480px */ +} + +@layer base { + [x-cloak] { + pointer-events: none !important; + visibility: hidden !important; + } +} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Colors.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Colors.pcss new file mode 100644 index 000000000..25bc075bc --- /dev/null +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Colors.pcss @@ -0,0 +1,33 @@ +@theme { + --color-*: initial; + + --color-blue: #0114C2; + --color-blue-dark: #26224C; + --color-blue-light: #00CFFD; + --color-green: #35BA34; + --color-green-dark: #1D751D; + --color-purple: #8A3FFC; + --color-purple-dark: #602CB0; + --color-yellow: #F1C21B; + --color-yellow-dark: #B08C0E; + + --color-orange: #FF832B; + --color-red: #FA4D56; + + --color-black: #000; + --color-white: #fff; + + --color-transparent: transparent; + --color-current: currentColor; + + --color-neutral-90: #161616; + --color-neutral-80: #363636; + --color-neutral-70: #545454; + --color-neutral-60: #676767; + --color-neutral-50: #8F8F8F; + --color-neutral-40: #AFAFAF; + --color-neutral-30: #D4D4D4; + --color-neutral-20: #E5E5E5; + --color-neutral-10: #F0F0F0; + --color-neutral-05: #F8F8F8; +} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Styles/Counter.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Counter.pcss similarity index 100% rename from DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Styles/Counter.pcss rename to DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Counter.pcss diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Font.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Font.pcss new file mode 100644 index 000000000..03fea02a6 --- /dev/null +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Font.pcss @@ -0,0 +1,58 @@ +@layer base { + @font-face { + font-family: "Bricolage Grotesque"; + font-style: normal; + font-weight: 200 800; + font-stretch: 75% 100%; + font-display: swap; + src: url("../Assets/Fonts/v8_latin-ext_200-800_normal_75-100.woff2") format("woff2"); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; + } + + @font-face { + font-family: "Bricolage Grotesque"; + font-style: normal; + font-weight: 200 800; + font-stretch: 75% 100%; + font-display: swap; + src: url("../Assets/Fonts/v8_latin_200-800_normal_75-100.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } +} + +@theme { + --font-sans: "Bricolage Grotesque"; + + --text-xxs: 0.625rem; /* 10px */ + --text-xxs--line-height: calc(1 / 0.625); + --text-xs: 0.75rem; /* 12px */ + --text-xs--line-height: calc(1 / 0.75); + --text-sm: 0.875rem; /* 14px */ + --text-sm--line-height: calc(1.25 / 0.875); + --text-base: 1rem; /* 16px */ + --text-base--line-height: calc(1.5 / 1); + --text-md: 1.125rem; /* 18px */ + --text-md--line-height: calc(1.75 / 1.125); + --text-lg: 1.25rem; /* 20px */ + --text-lg--line-height: calc(1.75 / 1.25); + --text-xl: 1.375rem; /* 22px */ + --text-xl--line-height: calc(1.75 / 1.375); + --text-2xl: 1.5rem; /* 24px */ + --text-2xl--line-height: calc(2 / 1.5); + --text-3xl: 1.75rem; /* 28px */ + --text-3xl--line-height: calc(2.25 / 1.75); + --text-4xl: 2rem; /* 32px */ + --text-4xl--line-height: calc(2.5 / 2); + --text-5xl: 2.25rem; /* 36px */ + --text-5xl--line-height: calc(2.5 / 2.25); + --text-6xl: 2.5rem; /* 40px */ + --text-6xl--line-height: 1; + --text-7xl: 2.8125rem; /* 45px */ + --text-7xl--line-height: 1; + --text-8xl: 3.5625rem; /* 57px */ + --text-8xl--line-height: 1; + --text-9xl: 4rem; /* 64px */ + --text-9xl--line-height: 1; + --text-10xl: 4.5rem; /* 57px */ + --text-10xl--line-height: 1; +} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Typography.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Typography.pcss new file mode 100644 index 000000000..be347ce25 --- /dev/null +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Assets/Styles/Typography.pcss @@ -0,0 +1,187 @@ +@layer components { + :where( + .display-headline-xl, + .display-headline-lg, + .display-headline-md, + .display-headline-sm, + .display-title-lg, + .display-title-md, + .display-title-sm, + .display-lead, + .display-body-lg, + .display-body-md, + .display-body-sm, + .display-label-lg, + .display-label-md, + .display-label-sm, + .display-cta-xl, + .display-cta-lg, + .display-cta-sm + ) { + font-weight: var(--font-weight); + text-wrap: var(--text-wrap, pretty); + + :where(strong, b) { + font-weight: var(--font-weight-strong); + } + } + + .display-headline-xl, + .display-headline-lg, + .display-headline-md, + .display-headline-sm, + .display-title-lg, + .display-title-md, + .display-title-sm, + .display-cta-xl, + .display-cta-lg, + .display-cta-sm { + --font-weight: 500; + --font-weight-strong: 800; + --text-wrap: balance; + } + + .display-lead, + .display-body-lg, + .display-body-md, + .display-body-sm, + .display-label-md, + .display-label-sm { + --font-weight: 400; + --font-weight-strong: 700; + } + + .display-label-md { + --font-weight: 600; + --font-weight-strong: 600; + } + + :where(.display-headline-xl, .display-headline-lg, .display-headline-md, .display-headline-sm, .display-title-lg, .display-title-md, .display-title-sm, .display-lead) { + --font-size: var(--font-size-mobile); + --line-height: var(--line-height-mobile); + + font-size: var(--font-size); + line-height: var(--line-height); + + @media (width >= theme(--breakpoint-md)) { + --font-size: var(--font-size-tablet, var(--font-size-mobile)); + --line-height-mobile: var(--line-height-tablet, var(--line-height-mobile)); + } + + @media (width >= theme(--breakpoint-lg)) { + --font-size: var(--font-size-desktop, var(--font-size-tablet, var(--font-size-mobile))); + --line-height-mobile: var(--line-height-desktop, var(--line-height-tablet, var(--line-height-mobile))); + } + } + + .display-headline-xl { + --font-size-mobile: var(--text-6xl); + --line-height-mobile: var(--text-6xl--line-height); + --font-size-tablet: var(--text-8xl); + --line-height-tablet: var(--text-8xl--line-height); + --font-size-desktop: var(--text-10xl); + --line-height-desktop: var(--text-10xl--line-height); + } + + .display-headline-lg { + --font-size-mobile: var(--text-5xl); + --line-height-mobile: var(--text-5xl--line-height); + --font-size-tablet: var(--text-7xl); + --line-height-tablet: var(--text-7xl--line-height); + --font-size-desktop: var(--text-9xl); + --line-height-desktop: var(--text-9xl--line-height); + } + + .display-headline-md { + --font-size-mobile: var(--text-4xl); + --line-height-mobile: var(--text-4xl--line-height); + --font-size-tablet: var(--text-6xl); + --line-height-tablet: var(--text-6xl--line-height); + --font-size-desktop: var(--text-8xl); + --line-height-desktop: var(--text-8xl--line-height); + } + + .display-headline-sm { + --font-size-mobile: var(--text-3xl); + --line-height-mobile: var(--text-3xl--line-height); + --font-size-tablet: var(--text-4xl); + --line-height-tablet: var(--text-4xl--line-height); + --font-size-desktop: var(--text-7xl); + --line-height-desktop: var(--text-7xl--line-height); + } + + .display-title-lg { + --font-size-mobile: var(--text-2xl); + --line-height-mobile: var(--text-2xl--line-height); + --font-size-tablet: var(--text-3xl); + --line-height-tablet: var(--text-3xl--line-height); + --font-size-desktop: var(--text-4xl); + --line-height-desktop: var(--text-4xl--line-height); + } + + .display-title-md { + --font-size-mobile: var(--text-lg); + --line-height-mobile: var(--text-lg--line-height); + --font-size-tablet: var(--text-xl); + --line-height-tablet: var(--text-xl--line-height); + } + + .display-title-sm { + --font-size-mobile: var(--text-base); + --line-height-mobile: var(--text-base--line-height); + --font-size-desktop: var(--text-lg); + --line-height-desktop: var(--text-lg--line-height); + } + + .display-lead { + --font-size-mobile: var(--text-base); + --line-height-mobile: var(--text-base--line-height); + --font-size-tablet: var(--text-lg); + --line-height-tablet: var(--text-lg--line-height); + } + + .display-body-lg { + font-size: var(--text-base); + line-height: var(--text-base--line-height); + } + + .display-body-md { + font-size: var(--text-sm); + line-height: var(--text-sm--line-height); + } + + .display-body-sm { + font-size: var(--text-xs); + line-height: var(--text-xs--line-height); + } + + .display-label-lg { + font-size: var(--text-sm); + line-height: var(--text-sm--line-height); + } + + .display-label-md { + font-size: var(--text-xs); + line-height: var(--text-xs--line-height); + } + + .display-label-sm { + font-size: var(--text-xxs); + line-height: var(--text-xxs--line-height); + } + + .display-cta-xl { + font-size: var(--text-lg); + line-height: var(--text-lg--line-height); + } + + .display-cta-lg { + font-size: var(--text-base); + line-height: var(--text-base--line-height); + } + + .display-cta-sm { + font-size: var(--text-sm); + line-height: var(--text-sm--line-height); + } +} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/AnimatedArrow.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/AnimatedArrow.fusion deleted file mode 100644 index 666366507..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/AnimatedArrow.fusion +++ /dev/null @@ -1,42 +0,0 @@ -prototype(Neos.Presentation:Atom.AnimatedArrow) < prototype(Neos.Fusion:Component) { - @styleguide { - title = 'Animated Arrow' - props { - style = 'width: 90px;margin: 100px auto' - class = 'group' - } - } - - @propTypes { - style = PropTypes:String - class = PropTypes:Union { - string = PropTypes:String - array = PropTypes:Array { - type = PropTypes:String - } - } - lineClass = PropTypes:Union { - string = PropTypes:String - array = PropTypes:Array { - type = PropTypes:String - } - } - } - - class = 'w-4' - lineClass = 'transition-transform ease-[steps(5)] scale-x-0 group-hover:scale-x-100 duration-500 origin-right' - - renderer = afx` - - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Icon.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Icon.fusion deleted file mode 100644 index ba44ac39e..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Icon.fusion +++ /dev/null @@ -1,45 +0,0 @@ -prototype(Neos.Presentation:Icon) < prototype(Neos.Fusion:Component) { - - @propTypes { - inline = ${PropTypes.boolean} - name = ${PropTypes.string} - fallbackName = ${PropTypes.string} - class = ${PropTypes.string} - } - - name = null - name.@process.clean = ${String.trim(String.toLowerCase(value))} - - fallbackName = null - fallbackName.@process.clean = ${String.trim(String.toLowerCase(value))} - - inline = null - - class = null - - renderer = Neos.Fusion:Augmenter { - data-icon-name = ${props.name} - data-icon-name.@if.hasName = ${props.name} - - class = ${props.class} - - content = Neos.Fusion:Case { - inlineExists { - condition = ${!!props.inline} - renderer = ${props.inline} - } - nameExists { - condition = ${File.exists('resource://Neos.Presentation/Public/Assets/Icons/' + props.name + '.svg')} - renderer = ${StaticResource.content('Neos.Presentation', 'Public/Assets/Icons/' + props.name + '.svg')} - } - fallbackNameExists { - condition = ${File.exists('resource://Neos.Presentation/Public/Assets/Icons/' + props.fallbackName + '.svg')} - renderer = ${StaticResource.content('Neos.Presentation', 'Public/Assets/Icons/' + props.fallbackName + '.svg')} - } - error { - condition = true - renderer = ${StaticResource.content('Neos.Presentation', 'Public/Assets/Icons/iconnotfound.svg')} - } - } - } -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Button.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Button.fusion deleted file mode 100644 index 1becf3448..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Button.fusion +++ /dev/null @@ -1,76 +0,0 @@ -prototype(Neos.Presentation:Button) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = 'Button' - props { - text = 'Button Text' - } - useCases { - link.props { - text = 'Button as Link' - variant = 'link' - } - icon.props { - text = 'Button with Icon' - icon = 'animatedArrow' - } - } - } - - @propTypes { - variant = ${PropTypes.oneOf(['button', 'link'])} - text = ${PropTypes.string.isRequired} - href = ${PropTypes.anyOf(PropTypes.string)} - icon = ${PropTypes.anyOf(PropTypes.string, PropTypes.any)} - srOnlyLabel = ${PropTypes.boolean} - } - - text = null - variant = 'button' - icon = null - srOnlyLabel = false - - attributes = Neos.Fusion:DataStructure - class = null - - @private { - labelText = ${props.srOnlyLabel ? '' + props.text + '' : props.text} - icon = Neos.Fusion:Case { - animatedArrow { - condition = ${props.icon == 'animatedArrow'} - renderer = Neos.Presentation:Atom.AnimatedArrow - } - string { - condition = ${Type.isString(props.icon)} - renderer = ${props.icon} - } - icon { - condition = ${props.icon} - renderer = Neos.Presentation:Icon { - @apply.props = ${props.icon} - class = "w-5" - } - } - } - } - - renderer = Neos.Fusion:Tag { - tagName = 'button' - attributes { - @apply.attributes = ${props.attributes} - class = ${Carbon.String.classNames( - 'n-button n-interactive', - { - 'n-interactive--button': props.variant == 'button', - 'n-interactive--link': props.variant == 'link', - 'group': props.icon == 'animatedArrow' - }, - props.class - )} - } - content = afx` - {private.labelText} - {private.icon} - ` - } -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Interactive.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Interactive.pcss deleted file mode 100644 index 251d4de99..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Interactive.pcss +++ /dev/null @@ -1,23 +0,0 @@ -.n-interactive { - @apply inline-flex justify-center items-center gap-2; -} - -.n-interactive--button { - @apply px-6 py-4; - @apply text-white bg-green hover:bg-green-dark; - - &[disabled] { - @apply text-white bg-gray hover:bg-gray; - } -} - -.n-interactive--link { - @apply pt-3 pb-1 border-b; - @apply text-black hover:text-lightblue; - @apply border-darkblue hover:border-lightblue; - - &[disabled] { - @apply text-gray hover:text-gray; - @apply border-gray hover:border-gray; - } -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Link.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Link.fusion deleted file mode 100644 index 4ed00ed04..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Interactive/Link.fusion +++ /dev/null @@ -1,80 +0,0 @@ -prototype(Neos.Presentation:Link) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = 'Link' - props { - text = 'Link Text' - href = '#link' - } - useCases { - button.props { - text = 'Link as Button' - href = '#link' - variant = 'button' - } - icon.props { - text = 'Link with Icon' - href = '#link' - icon = 'animatedArrow' - } - } - } - - @propTypes { - variant = ${PropTypes.oneOf(['button', 'link'])} - text = ${PropTypes.string.isRequired} - href = ${PropTypes.anyOf(PropTypes.string)} - icon = ${PropTypes.anyOf(PropTypes.string, PropTypes.any)} - srOnlyLabel = ${PropTypes.boolean} - } - - text = null - variant = 'link' - icon = null - srOnlyLabel = false - - attributes = Neos.Fusion:DataStructure - class = null - - @private { - labelText = ${props.srOnlyLabel ? '' + props.text + '' : props.text} - icon = Neos.Fusion:Case { - animatedArrow { - condition = ${props.icon == 'animatedArrow'} - renderer = Neos.Presentation:Atom.AnimatedArrow - } - string { - condition = ${Type.isString(props.icon)} - renderer = ${props.icon} - } - icon { - condition = ${props.icon} - renderer = Neos.Presentation:Icon { - @apply.props = ${props.icon} - class = "w-5" - } - } - } - } - - renderer = Neos.Fusion:Tag { - tagName = 'a' - attributes { - @apply.attributes = ${props.attributes} - class = ${Carbon.String.classNames( - 'n-link n-interactive', - { - 'n-interactive--button': props.variant == 'button', - 'n-interactive--link': props.variant == 'link', - 'group': props.icon == 'animatedArrow' - }, - props.class - )} - href = ${props.href} - } - content = afx` - {private.labelText} - {private.icon} - ` - } -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Readme.md b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Readme.md deleted file mode 100644 index 5d393d3eb..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Readme.md +++ /dev/null @@ -1,6 +0,0 @@ -## Atoms - -Atoms are the smallest building blocks of the design system. -They are the basic elements that can be used to build more complex components. - -They do not define margin outside. They have to be very flexible and should only be touched with the global scope in mind. diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/SquareIcon.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/SquareIcon.fusion deleted file mode 100644 index 6e2a4a44b..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/SquareIcon.fusion +++ /dev/null @@ -1,36 +0,0 @@ -prototype(Neos.Presentation:SquareIcon) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = 'Square Icon' - props { - text = 'Forever Open Source' - iconName = 'heart' - color = 'purple' - } - } - - @propTypes { - text = PropTypes:String - iconName = PropTypes:String - color = PropTypes:String - class = PropTypes:String - } - - @private.backgroundColorClass = Neos.Fusion:Match { - @subject = ${props.color} - @default = 'bg-accent-lightblue' - yellow = 'bg-accent-yellow' - purple = 'bg-accent-purple' - } - - text = null - iconName = null - color = null - - renderer = afx` -
- -
{props.text}
-
- ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Headline.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Headline.fusion deleted file mode 100644 index a7bcb0b18..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Headline.fusion +++ /dev/null @@ -1,23 +0,0 @@ -prototype(Neos.Presentation:Headline) < prototype(Neos.Presentation:Paragraph) { - - @styleguide { - title = "Headline" - props { - text = 'Headline Text' - tagName = 'h2' - display = 'tagname' - } - } - - @propTypes { - text = ${PropTypes.string} - tagName = ${PropTypes.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p'])} - display = ${PropTypes.anyOf(PropTypes.string, PropTypes.integer, PropTypes.oneOf(['tagname', '', null]))} - } - - text = '' - tagName = 'h2' - display = 'tagname' - - renderer.attributes.class.@process.component = ${['n-headline', value]} -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Paragraph.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Paragraph.fusion deleted file mode 100644 index 92c6175af..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Paragraph.fusion +++ /dev/null @@ -1,41 +0,0 @@ -prototype(Neos.Presentation:Paragraph) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = "Paragraph" - props { - text = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.' - } - } - - @propTypes { - text = ${PropTypes.string} - tagName = ${PropTypes.oneOf(['p'])} - // see for all options the `display-*` classnames in resource://Neos.Presentation/Private/Fusion/Styles/Typography.pcss - display = ${PropTypes.anyOf(PropTypes.string, PropTypes.oneOf(['tagname', '', null]))} - } - - text = '' - tagName = 'p' - - // By default we use the defined tagname - display = 'tagname' - display.@process.fallback = ${!Type.isString(value) && !Type.isInteger(value) ? 'tagname' : value} - - class = '' - - renderer = Neos.Fusion:Tag { - tagName = ${props.tagName} - attributes = Neos.Fusion:DataStructure { - @apply.attributes = ${props.attributes} - class = ${Carbon.String.classNames( - 'display-' + props.display, - props.class - )} - style = ${props.style} - } - - content = ${props.content || props.text} - } - - renderer.attributes.class.@process.component = ${'n-paragraph ' + value} -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Readme.md b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Readme.md deleted file mode 100644 index c4a7571ae..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Atom/Text/Readme.md +++ /dev/null @@ -1 +0,0 @@ -Text styling is defined in Typography.pcss. The text styling is responsive ands its definition name can be read in figma devmode. diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Main.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Main.pcss deleted file mode 100644 index 63d656048..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Main.pcss +++ /dev/null @@ -1,11 +0,0 @@ -@import url("tailwindcss/base"); -@import url("tailwindcss/components"); - -/* Add here the imports from subfolders */ -@import url("Atom/**/*.pcss"); -@import url("Molecule/**/*.pcss"); - -/* Modules should not contain any custom CSS or JS/TS and instead use inline Tailwind and Alpinejs */ -@import url("Organism/**/*.pcss"); -@import url("Styles/*.pcss"); -@import url("tailwindcss/utilities"); diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Footer.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Footer.fusion index ba0125252..31ef1e56b 100644 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Footer.fusion +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Footer.fusion @@ -99,21 +99,21 @@ prototype(Neos.Presentation:Module.Footer) < prototype(Neos.Fusion:Component) { } renderer = afx` - +
-
+
-
- +
+
{link.title} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/List/List.Fragment.Item.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/List/List.Fragment.Item.fusion deleted file mode 100644 index 4e324b9c5..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/List/List.Fragment.Item.fusion +++ /dev/null @@ -1,56 +0,0 @@ -prototype(Neos.Presentation:List.Fragment.Item) < prototype(Neos.Fusion:Component) { - - @propTypes { - image = PropTypes:DataStructure { - imageSource = PropTypes:InstanceOf { - type = '\\Sitegeist\\Kaleidoscope\\Domain\\ImageSourceInterface' - } - alternativeText = PropTypes:String - } - link = PropTypes:String - label = PropTypes:String - category = PropTypes:DataStructure { - label = PropTypes:String - color = PropTypes:String - } - } - - @private { - hasImage = ${!!props.image.imageSource} - } - - renderer = afx` -
  • - - - {props.label} - - - - {props.category.label} - -
  • - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/PersonCards.Card.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/PersonCards.Card.fusion deleted file mode 100644 index 196c166bd..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/PersonCards.Card.fusion +++ /dev/null @@ -1,25 +0,0 @@ -prototype(Neos.Presentation:Module.PersonCards.Card) < prototype(Neos.Fusion:Component) { - - name = null - email = null - image = null - variant = null - - renderer = afx` -
  • -
    - - - -
    - - - - Email - - {props.email} - - -
  • - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/PersonCards.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/PersonCards.fusion deleted file mode 100644 index 6719b170c..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/PersonCards.fusion +++ /dev/null @@ -1,66 +0,0 @@ -prototype(Neos.Presentation:Module.PersonCards) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = "Person Cards" - props { - headline.text = 'Ready for Neos CMS?' - cards = Neos.Fusion:DataStructure { - 0 { - name = "Karsten Dambekalns" - email = "karsten@neos.io" - variant = "blue" - image.imageSource = Sitegeist.Kaleidoscope:UriImageSource { - uri = 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?auto=format&fit=facearea&facepad=5&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D' - } - } - 1 { - name = "Anke Häslich" - email = "anke@neos.io" - variant = "purple" - image.imageSource = Sitegeist.Kaleidoscope:UriImageSource { - uri = 'https://images.unsplash.com/photo-1517841905240-472988babdf9?auto=format&crop=faces&fp-y=0.8&fp-z=2&w=1024&h=1024&q=80' - } - } - 2 { - name = "Christian Müller" - email = "christian@neos.io" - variant = "green" - image.imageSource = Sitegeist.Kaleidoscope:UriImageSource { - uri = 'https://images.unsplash.com/photo-1521119989659-a83eee488004?auto=format&crop=faces&fp-y=0.8&fp-z=2&w=1024&h=1024&q=80' - } - } - } - } - } - - @propTypes { - headline = PropTypes:FromPrototype { - prototypeName = "Neos.Presentation:Headline" - } - cards = PropTypes:Array { - type = PropTypes:DataStructure { - name = PropTypes:String - email = PropTypes:String - image.imageSource = ${PropTypes.instanceOf('\\Sitegeist\\Kaleidoscope\\Domain\\ImageSourceInterface')} - } - } - } - - headline = null - cards = null - - renderer = afx` - - - - - -
      - - - -
    -
    -
    - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Teaser.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Teaser.fusion index e6a486332..f7e739f5b 100644 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Teaser.fusion +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/Teaser.fusion @@ -6,7 +6,7 @@ prototype(Neos.Presentation:Module.Teaser) < prototype(Neos.Fusion:Component) { headline.text = 'Ready for Neos CMS?' primaryLink.text = 'Try Neos now' primaryLink.icon = Neos.Presentation:Icon { - name = 'animated-arrow' + name = 'animatedArrow' class = 'h-6' } secondaryLink.text = 'View features' @@ -25,10 +25,10 @@ prototype(Neos.Presentation:Module.Teaser) < prototype(Neos.Fusion:Component) { prototypeName = "Neos.Presentation:Paragraph" } primaryLink = PropTypes:FromPrototype { - prototypeName = "Neos.Presentation:Link" + prototypeName = "Neos.Presentation:Button" } secondaryLink = PropTypes:FromPrototype { - prototypeName = "Neos.Presentation:Link" + prototypeName = "Neos.Presentation:Button" } } @@ -42,11 +42,11 @@ prototype(Neos.Presentation:Module.Teaser) < prototype(Neos.Fusion:Component) {
    - -
    diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/TextAndImage.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/TextAndImage.fusion index 2bb237d5d..9ee3e81bb 100644 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/TextAndImage.fusion +++ b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Module/TextAndImage.fusion @@ -6,7 +6,7 @@ prototype(Neos.Presentation:Module.TextAndImage) < prototype(Neos.Fusion:Compone headline.text = 'Meet the Community' description.text = 'The Neos Team consists of many independent individuals who are actively contributing to Neos. Each has their own focus and specialty. Together with the Neos community they push the project forward. This includes the organisation of Neos events, contributing code, writing documentation, managing the websites & services used by the community and much more.' image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource - button.text = 'More information' + button.content = 'More information' } } diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Background/Background.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Background/Background.fusion deleted file mode 100644 index 80cb4c7e1..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Background/Background.fusion +++ /dev/null @@ -1,55 +0,0 @@ -prototype(Neos.Presentation:Background) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = "Background" - props { - variant = null - content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda atque cumque, dignissimos ea eos error in iure laboriosam libero mollitia nam nemo omnis, perferendis quisquam recusandae reiciendis repudiandae unde ut!' - } - propSets { - gradient { - variant = 'gradient' - content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda atque cumque, dignissimos ea eos error in iure laboriosam libero mollitia nam nemo omnis, perferendis quisquam recusandae reiciendis repudiandae unde ut!' - } - } - } - - @propTypes { - variant = ${PropTypes.oneOf(['gradient', 'brand', 'accent-purple', 'accent-blue', 'accent-lightblue', 'accent-green', 'accent-yellow', 'accent-orange', 'accent-red'])} - tagName = ${PropTypes.string} - style = ${PropTypes.any} - class = ${PropTypes.any} - } - - variant = null - - tagName = 'div' - style = null - class = null - - content = null - - renderer = afx` - - {props.content} - - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Background/Background.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Background/Background.pcss deleted file mode 100644 index 3f95290fc..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Background/Background.pcss +++ /dev/null @@ -1,55 +0,0 @@ -.n-background { - @apply flow-root; -} - -.n-background--gradient { - @apply bg-gradient-to-r gradient-blue text-white; -} - -.n-background--brand { - @apply bg-darkblue text-white; - --n-fg: var(--color-white); - --n-bg: var(--color-darkblue); -} - -.n-background--accent-purple { - @apply bg-accent-purple text-white; - --n-fg: var(--color-white); - --n-bg: var(--color-accent-purple); -} - -.n-background--accent-blue { - @apply bg-accent-blue text-white; - --n-fg: var(--color-white); - --n-bg: var(--color-accent-blue); -} - -.n-background--accent-lightblue { - @apply bg-accent-lightblue text-darkblue; - --n-fg: var(--color-darkblue); - --n-bg: var(--color-accent-lightblue); -} - -.n-background--accent-green { - @apply bg-accent-green text-darkblue; - --n-fg: var(--color-black); - --n-bg: var(--color-accent-green); -} - -.n-background--accent-yellow { - @apply bg-accent-yellow text-black; - --n-fg: var(--color-black); - --n-bg: var(--color-accent-yellow); -} - -.n-background--accent-orange { - @apply bg-accent-orange text-black; - --n-fg: var(--color-black); - --n-bg: var(--color-accent-orange); -} - -.n-background--accent-red { - @apply bg-accent-red text-white; - --n-fg: var(--color-white); - --n-bg: var(--color-accent-red); -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.Box.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.Box.fusion deleted file mode 100644 index 969764b60..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.Box.fusion +++ /dev/null @@ -1,99 +0,0 @@ -prototype(Neos.Presentation:BentoBoxes.Box) < prototype(Neos.Fusion:Component) { - - @propTypes { - background = PropTypes:Enum { - 1 = 'gradient' - 2 = 'brand' - 3 = 'accent-purple' - 4 = 'accent-blue' - 5 = 'accent-lightblue' - 6 = 'accent-green' - 7 = 'accent-yellow' - 8 = 'accent-orange' - 9 = 'accent-red' - } - link = PropTypes:String - assetAlign = PropTypes:String - heading = PropTypes:FromPrototype { - prototypeName = 'Neos.Presentation:Headline' - } - linkLabel = PropTypes:String - video = PropTypes:FromPrototype { - prototypeName = 'Neos.Presentation:InlineVideo' - } - image = PropTypes:DataStructure { - imageSource = PropTypes:InstanceOf { - type = '\\Sitegeist\\Kaleidoscope\\Domain\\ImageSourceInterface' - } - } - } - - background = null - link = '' - assetAlign = '' - heading = Neos.Fusion:DataStructure { - text = '' - tagName = 'h2' - } - linkLabel = '' - video = Neos.Fusion:DataStructure { - sources = null - assets = null - } - image = Neos.Fusion:DataStructure { - imageSource = null - } - - @private { - linkClass = ${Carbon.String.classNames( - 'pl-6 sm:pl-8 lg:pl-14 pr-6 2xl:pr-20 pt-8 2xl:pt-14 grow-0 before:absolute before:inset-0 before:z-10', - { - 'pb-8 2xl:pb-14': props.assetAlign == 'center' || !props.link, - 'pb-8 2xl:pb-0': props.assetAlign == 'right' && props.link - } - )} - - assetWrapperClass = ${Carbon.String.classNames( - 'grow flex items-end', - { - 'justify-center px-8 lg:px-14': props.assetAlign == 'center', - 'justify-end pl-8 sm:pl-14': props.assetAlign == 'right' - } - )} - } - - renderer = afx` -
    - - - - - - {props.linkLabel} - - - -
    -
    - - - -
    -
    -
    -
    - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.fusion deleted file mode 100644 index 2eaee3f3f..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.fusion +++ /dev/null @@ -1,159 +0,0 @@ -prototype(Neos.Presentation:BentoBoxes) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = 'Bento Boxes' - props { - heading = Neos.Fusion:DataStructure { - text = 'Tools that transform your digital journey' - tagName = 'h2' - } - text = 'Take control of HTML, CSS, and JavaScript in a visual canvas. Webflow generates clean, semantic code that’s ready.' - boxes = Neos.Fusion:DataStructure { - 1 = Neos.Fusion:DataStructure { - heading = Neos.Fusion:DataStructure { - text = 'Enterprise Features like Role Management and Media Center' - tagName = 'h2' - } - background = 'brand' - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource { - height = 480 - width = 360 - } - assetAlign = 'center' - } - 2 = Neos.Fusion:DataStructure { - heading = Neos.Fusion:DataStructure { - text = 'What you see, is what you get. Our True Inline Editor.' - tagName = 'h2' - } - background = 'accent-blue' - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource { - width = 712 - height = 400 - } - assetAlign = 'right' - } - 3 = Neos.Fusion:DataStructure { - heading = Neos.Fusion:DataStructure { - text = 'Multi-language and Multi-site Functionality' - tagName = 'h2' - } - link = '#' - linkLabel = 'Mehr erfahren' - background = 'accent-lightblue' - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource { - width = 360 - height = 240 - } - assetAlign = 'center' - } - 4 = Neos.Fusion:DataStructure { - heading = Neos.Fusion:DataStructure { - text = 'SEO Optimization Tools for the best performance' - tagName = 'h2' - } - background = 'brand' - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource { - width = 600 - height = 300 - } - assetAlign = 'right' - } - } - } - } - - @propTypes { - heading = PropTypes:DataStructure { - text = PropTypes:String - tagName = PropTypes:Enum { - 1 = 'h1' - 2 = 'h2' - 3 = 'h3' - 4 = 'h4' - 5 = 'h5' - 6 = 'h6' - p = 'p' - } - } - text = PropTypes:String - boxes = PropTypes:Array { - type = PropTypes:DataStructure { - heading = PropTypes:FromPrototype { - prototypeName = 'Neos.Presentation:Headline' - } - link = PropTypes:String - linkLabel = PropTypes:String - background = PropTypes:Enum { - 1 = 'gradient' - 2 = 'brand' - 3 = 'accent-purple' - 4 = 'accent-blue' - 5 = 'accent-lightblue' - 6 = 'accent-green' - 7 = 'accent-yellow' - 8 = 'accent-orange' - 9 = 'accent-red' - } - image = PropTypes:DataStructure { - imageSource = PropTypes:InstanceOf { - type = '\\Sitegeist\\Kaleidoscope\\Domain\\ImageSourceInterface' - } - } - video = PropTypes:FromPrototype { - prototypeName = 'Neos.Presentation:InlineVideo' - } - assetAlign = PropTypes:Enum { - 1 = 'center' - 2 = 'right' - } - } - } - } - - heading = Neos.Fusion:DataStructure { - text = '' - tagName = 'h2' - } - text = '' - boxes = ${[]} - - @private { - boxes = ${Carbon.Array.chunk(props.boxes, 2)} - - headlineClass = ${Carbon.String.classNames( - 'bento-boxes__heading p-0 2xl:pr-[40%] text-darkblue text-5xl sm:text-5xl mdl:text-7xl 2xl:text-9xl', - { 'pb-10 mdl:pb-0': props.text } - )} - - wrapperClass = ${Carbon.String.classNames( - 'flex flex-col gap-6 mdl:gap-10', - { 'pt-14 mdl:pt-20 2xl:pt-10': props.text || props.heading.text } - )} - } - - renderer = afx` - -
    - - -
    - -
    - -
    - - - -
    -
    -
    -
    - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.pcss deleted file mode 100644 index d7d91bf98..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/BentoBoxes/BentoBoxes.pcss +++ /dev/null @@ -1,125 +0,0 @@ -.bento-boxes { - --bento-boxes-gap-width: 0; - - .n-background--accent-lightblue { - @apply text-white; - } - - @screen md { - --bento-boxes-gap-width: 2.5rem; - } - - .bento-boxes__heading { - @apply w-full 2xl:w-full; - - @screen md { - width: 40%; - } - - @screen 2xl { - @apply w-full; - } - } - - .bento-boxes__lead { - @apply w-full 2xl:w-full; - - @screen md { - width: 50%; - } - - @screen 2xl { - @apply w-full; - } - } - - .bento-boxes__row { - .bento-boxes__box-wrapper { - --bento-boxes-column-width: 100%; - @apply p-0 w-full; - - @screen md { - --bento-boxes-column-width: 50%; - width: var(--bento-boxes-column-width); - } - - .n-paragraph svg { - @apply inline-block; - } - - &:hover .n-paragraph svg > path:first-child { - @apply scale-x-100; - } - } - - @screen md { - &:first-child .bento-boxes__box-wrapper { - @apply pt-20; - - &:first-child { - @apply pt-0; - } - } - - &:last-child .bento-boxes__box-wrapper { - @apply pb-10; - - &:last-child { - @apply pb-0; - } - } - - &:nth-child(2n) .bento-boxes__box-wrapper { - &:first-child { - --bento-boxes-column-width: 60%; - } - - &:last-child { - --bento-boxes-column-width: 40%; - } - } - - &:nth-child(2n + 1) .bento-boxes__box-wrapper { - &:first-child { - --bento-boxes-column-width: 40%; - } - - &:last-child { - --bento-boxes-column-width: 60%; - } - } - } - - @screen 2xl { - &:nth-child(2n) .bento-boxes__box-wrapper { - &:first-child { - --bento-boxes-column-width: 50%; - } - - &:last-child { - --bento-boxes-column-width: 50%; - } - } - - &:nth-child(4n + 1) .bento-boxes__box-wrapper { - &:first-child { - --bento-boxes-column-width: 40%; - } - - &:last-child { - --bento-boxes-column-width: 60%; - } - } - - &:nth-child(4n + 3) .bento-boxes__box-wrapper { - &:first-child { - --bento-boxes-column-width: 60%; - } - - &:last-child { - --bento-boxes-column-width: 40%; - } - } - } - } -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/HighlightBoxes/HighlightBoxes.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/HighlightBoxes/HighlightBoxes.fusion deleted file mode 100644 index 6a21743ec..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/HighlightBoxes/HighlightBoxes.fusion +++ /dev/null @@ -1,130 +0,0 @@ -prototype(Neos.Presentation:HighlightBoxes) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = 'Highlight Boxes' - props { - cols = 3 - heading = 'Tools that transform your digital journey' - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource { - baseWidth = 1920 - baseHeight = 1080 - } - boxes = Neos.Fusion:DataStructure { - 1 = Neos.Fusion:DataStructure { - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource - icon = 'heart' - tag = 'Enterprise' - heading = 'Enterprise Features like Role Management and Media Center' - description = 'Manage your team and media assets with ease. Our role management system allows you to define roles and permissions for your team members.' - link = '#' - linkLabel = 'Learn more about roles and permissions' - linkTargetBlank = true - } - 2 = Neos.Fusion:DataStructure { - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource - icon = 'email' - tag = 'Editor' - heading = 'What you see, is what you get. Our True Inline Editor.' - description = 'Our True Inline Editor allows you to edit your content directly on the page. No more guessing how your content will look like.' - } - 3 = Neos.Fusion:DataStructure { - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource - icon = 'circle' - heading = 'Customize your content with our powerful NodeTypes.' - link = '#' - linkLabel = 'Learn more about content elements' - } - 4 = Neos.Fusion:DataStructure { - image.imageSource = Sitegeist.Kaleidoscope:DummyImageSource - icon = 'clock' - heading = 'Track your success with our Analytics Dashboard.' - description = 'Our Analytics Dashboard gives you insights into your content performance. Track your success and optimize your content.' - link = '#' - linkLabel = 'Learn more about analytics' - } - } - } - } - - @propTypes { - inBackend = PropTypes:Bool - cols = ${PropTypes.oneOf([2, 3, 4])} - displayType = ${PropTypes.oneOf(['icon', 'imageCircle', 'imageHeader'])} - heading = PropTypes:String - hasBackgroundImage = PropTypes:Bool - image = PropTypes:DataStructure { - imageSource = PropTypes:InstanceOf { - type = '\\Sitegeist\\Kaleidoscope\\Domain\\ImageSourceInterface' - } - } - boxes = PropTypes:Array { - type = PropTypes:FromPrototype { - prototypeName = 'Neos.Presentation:HighlightBoxes.Box' - } - } - } - - inBackend = false - cols = 2 - displayType = 'icon' - hasBackgroundImage = false - - @private { - backgroundImage = ${props.hasBackgroundImage && props.image && props.image.imageSource ? 'background-image:url(' + props.image.imageSource + ');' : null} - colClass = Neos.Fusion:Match { - @subject = ${props.cols} - @default = '' - 3 = 'md:grid-cols-3' - 4 = 'lg:grid-cols-4' - } - imageWidth = Neos.Fusion:Case { - noImage { - condition = ${props.displayType == 'icon'} - renderer = null - } - isImageCircle { - condition = ${props.displayType == 'imageCircle'} - renderer = 128 - } - cols2 { - condition = ${props.cols == 2} - renderer = 576 - } - cols3 { - condition = ${props.cols == 3} - renderer = 373 - } - default { - condition = true - renderer = 272 - } - } - content = afx` - -
    - - - -
    - ` - } - - renderer = afx` - - - - - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/LogoBar/LogoBar.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/LogoBar/LogoBar.fusion deleted file mode 100644 index 4d4cfa152..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/LogoBar/LogoBar.fusion +++ /dev/null @@ -1,50 +0,0 @@ -prototype(Neos.Presentation:LogoBar) < prototype(Neos.Fusion:Component) { - - @styleguide { - title = 'Logo-Bar' - props { - assets = Neos.Fusion:Map { - items = ${['solarwatt.svg', 'heineken.svg', 'swisscom.svg', 't3n.png']} - itemRenderer = Neos.Fusion:DataStructure { - src = ${StaticResource.uri('Neos.Presentation', 'Public/Assets/Styleguide/Logos/' + item)} - alternativeText = ${'Logo ' + item} - } - } - } - } - - @propTypes { - assets = PropTypes:Array { - type = PropTypes:DataStructure { - src = PropTypes:String - alternativeText = PropTypes:String - } - } - grayscale = PropTypes:Bool - } - - assets = null - grayscale = false - - @private { - numberOfAssets = ${Type.isArray(props.assets) ? Array.length(props.assets) : 0} - duplications = ${private.numberOfAssets > 3 ? 3 : 0} - } - - renderer = afx` -
    -
      - -
    • {item.alternativeText}
    • -
      -
    -
    - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/PostGrid/PostGrid.Teaser.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/PostGrid/PostGrid.Teaser.fusion deleted file mode 100644 index 539744c45..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/PostGrid/PostGrid.Teaser.fusion +++ /dev/null @@ -1,68 +0,0 @@ -prototype(Neos.Presentation:PostGrid.Teaser) < prototype(Neos.Fusion:Component) { - - @propTypes { - title = PropTypes:String - teaser = PropTypes:String - date = PropTypes:InstanceOf { - type = '\DateTimeInterface' - } - url = PropTypes:String - linkText = PropTypes:String - isFeature = PropTypes:Bool - image = PropTypes:FromPrototype { - prototypeName = Sitegeist.Kaleidoscope:Image - } - } - - isFeature = false - - @private { - accentColors = ${['purple', 'blue', 'lightblue', 'green', 'yellow', 'orange', 'red']} - background = ${props.isFeature ? 'accent-' + Array.random(private.accentColors) : 'gradient'} - } - - renderer = afx` -
  • - - -
  • - ` -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Readme.md b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Readme.md deleted file mode 100644 index 3f1e00622..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -## Molecules - -Molecules are containers that can be used flexibly in Modules and work together with the Atoms. diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Spacing/Spacing.pcss b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Spacing/Spacing.pcss deleted file mode 100644 index 245df36ae..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/Spacing/Spacing.pcss +++ /dev/null @@ -1,50 +0,0 @@ -.n-spacing--size { - @apply w-full max-w-screen-2xl mx-auto; -} - -:root { - --n-spacing--x: theme('spacing.3'); - - @screen xxs { - --n-spacing--x: theme('spacing.6'); - } - - @screen md { - --n-spacing--x: theme('spacing.9'); - } - - @screen lg { - --n-spacing--x: theme('spacing.16'); - } - - @screen 2xl { - --n-spacing--x: theme('spacing.20'); - } -} - -.n-spacing--x { - @apply px-spacing-x; -} - -:root { - --n-spacing--y-small: theme('spacing.3'); - --n-spacing--y: theme('spacing.6'); - - @screen xxs { - --n-spacing--y-small: theme('spacing.6'); - --n-spacing--y: theme('spacing.12'); - } - - @screen md { - --n-spacing--y-small: theme('spacing.10'); - --n-spacing--y: theme('spacing.20'); - } -} - -.n-spacing--y { - @apply my-spacing-y; -} - -.n-spacing--y-small { - @apply my-spacing-y-small; -} diff --git a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/StepByStepHighlight/StepByStepHighlight.Step.fusion b/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/StepByStepHighlight/StepByStepHighlight.Step.fusion deleted file mode 100644 index a0b16cff6..000000000 --- a/DistributionPackages/Neos.Presentation/Resources/Private/Fusion/Molecule/StepByStepHighlight/StepByStepHighlight.Step.fusion +++ /dev/null @@ -1,42 +0,0 @@ -prototype(Neos.Presentation:StepByStepHighlight.Step) < prototype(Neos.Fusion:Component) { - - @propTypes { - inBackend = PropTypes:Bool - index = PropTypes:Int - heading = PropTypes:String - text = PropTypes:String - image = PropTypes:FromPrototype { - prototypeName = Sitegeist.Kaleidoscope:Image - } - } - - inBackend = false - index = 0 - - renderer = afx` -
    - - - - -
    -