From 636fda45f2a08e5da273c06c86aeb0f39960ae65 Mon Sep 17 00:00:00 2001 From: Maximilian Harz Date: Tue, 24 Jun 2025 13:50:19 +0200 Subject: [PATCH] Replace styleguide components --- maintenance/app.vue | 83 +++++- .../components/BaseCard/BaseCard.story.js | 79 +++++ maintenance/components/BaseCard/BaseCard.vue | 133 +++++++++ maintenance/components/maintenance.vue | 80 ----- .../lib/styleguide/components/index.ts | 6 - .../components/layout/Flex/Flex.vue | 94 ------ .../components/layout/Flex/FlexItem.vue | 107 ------- .../components/layout/Flex/style.scss | 12 - .../components/layout/Space/Space.vue | 119 -------- .../components/layout/Space/style.scss | 9 - .../components/typography/Logo/Logo.vue | 55 ++++ .../components/typography/Logo/style.scss | 20 ++ maintenance/lib/styleguide/index.ts | 3 +- maintenance/lib/styleguide/mixins/index.ts | 3 - .../lib/styleguide/mixins/media-query.ts | 62 ---- maintenance/media-queries.scss | 5 + maintenance/nuxt.config.ts | 2 +- maintenance/style.css | 280 ++++++++++++++++++ 18 files changed, 642 insertions(+), 510 deletions(-) create mode 100644 maintenance/components/BaseCard/BaseCard.story.js create mode 100644 maintenance/components/BaseCard/BaseCard.vue delete mode 100644 maintenance/components/maintenance.vue delete mode 100644 maintenance/lib/styleguide/components/layout/Flex/Flex.vue delete mode 100644 maintenance/lib/styleguide/components/layout/Flex/FlexItem.vue delete mode 100644 maintenance/lib/styleguide/components/layout/Flex/style.scss delete mode 100644 maintenance/lib/styleguide/components/layout/Space/Space.vue delete mode 100644 maintenance/lib/styleguide/components/layout/Space/style.scss create mode 100644 maintenance/lib/styleguide/components/typography/Logo/Logo.vue create mode 100644 maintenance/lib/styleguide/components/typography/Logo/style.scss delete mode 100644 maintenance/lib/styleguide/mixins/index.ts delete mode 100644 maintenance/lib/styleguide/mixins/media-query.ts create mode 100644 maintenance/media-queries.scss create mode 100644 maintenance/style.css diff --git a/maintenance/app.vue b/maintenance/app.vue index 1e0d6f1c6..e8812b8d7 100644 --- a/maintenance/app.vue +++ b/maintenance/app.vue @@ -1,20 +1,73 @@ - - + diff --git a/maintenance/components/BaseCard/BaseCard.story.js b/maintenance/components/BaseCard/BaseCard.story.js new file mode 100644 index 000000000..928aba5e6 --- /dev/null +++ b/maintenance/components/BaseCard/BaseCard.story.js @@ -0,0 +1,79 @@ +import { storiesOf } from '@storybook/vue' +import helpers from '~/storybook/helpers' +import logos from '~/constants/logos.js' +import BaseCard from './BaseCard.vue' + +storiesOf('Generic/BaseCard', module) + .addDecorator(helpers.layout) + + .add('default', () => ({ + components: { BaseCard }, + template: ` + +

I am a card heading

+

And I am a paragraph.

+
+ `, + })) + + .add('with slot: hero image', () => ({ + components: { BaseCard }, + template: ` + + +

I am a card heading

+

And I am a paragraph.

+
+ `, + })) + + .add('with slot: image column', () => ({ + components: { BaseCard }, + template: ` + + +

I am a card heading

+

And I am a paragraph.

+
+ `, + })) + + .add('with slot: topMenu', () => ({ + components: { BaseCard }, + template: ` + + +

I am a card heading

+

And I am a paragraph.

+ +
+ `, + })) + + .add('with highlight prop', () => ({ + components: { BaseCard }, + template: ` + +

I am a card heading

+

And I am a paragraph.

+
+ `, + })) + + .add('with wideContent prop', () => ({ + components: { BaseCard }, + template: ` + +

I am a card heading

+

And I am a paragraph.

+
+ `, + })) diff --git a/maintenance/components/BaseCard/BaseCard.vue b/maintenance/components/BaseCard/BaseCard.vue new file mode 100644 index 000000000..5d3131a02 --- /dev/null +++ b/maintenance/components/BaseCard/BaseCard.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/maintenance/components/maintenance.vue b/maintenance/components/maintenance.vue deleted file mode 100644 index 42180b722..000000000 --- a/maintenance/components/maintenance.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - - diff --git a/maintenance/lib/styleguide/components/index.ts b/maintenance/lib/styleguide/components/index.ts index a7def42b6..d70af3a0e 100644 --- a/maintenance/lib/styleguide/components/index.ts +++ b/maintenance/lib/styleguide/components/index.ts @@ -10,15 +10,12 @@ import Radio from './data-input/Radio/Radio.vue' import Select from './data-input/Select/Select.vue' import Container from './layout/Container/Container.vue' import Card from './layout/Card/Card.vue' -import Flex from './layout/Flex/Flex.vue' -import FlexItem from './layout/Flex/FlexItem.vue' import Grid from './layout/Grid/Grid.vue' import Modal from './layout/Modal/Modal.vue' import Page from './layout/Page/Page.vue' import PageTitle from './layout/PageTitle/PageTitle.vue' import Placeholder from './layout/Placeholder/Placeholder.vue' import Section from './layout/Section/Section.vue' -import Space from './layout/Space/Space.vue' import Spinner from './layout/Spinner/Spinner.vue' import Button from './navigation/Button/Button.vue' import Menu from './navigation/Menu/Menu.vue' @@ -43,15 +40,12 @@ export { Select, Container, Card, - Flex, - FlexItem, Grid, Modal, Page, PageTitle, Placeholder, Section, - Space, Spinner, Button, Menu, diff --git a/maintenance/lib/styleguide/components/layout/Flex/Flex.vue b/maintenance/lib/styleguide/components/layout/Flex/Flex.vue deleted file mode 100644 index 24699075b..000000000 --- a/maintenance/lib/styleguide/components/layout/Flex/Flex.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - diff --git a/maintenance/lib/styleguide/components/layout/Flex/FlexItem.vue b/maintenance/lib/styleguide/components/layout/Flex/FlexItem.vue deleted file mode 100644 index 6326d241b..000000000 --- a/maintenance/lib/styleguide/components/layout/Flex/FlexItem.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - diff --git a/maintenance/lib/styleguide/components/layout/Flex/style.scss b/maintenance/lib/styleguide/components/layout/Flex/style.scss deleted file mode 100644 index a32e770bb..000000000 --- a/maintenance/lib/styleguide/components/layout/Flex/style.scss +++ /dev/null @@ -1,12 +0,0 @@ -@use "@@/styles/shared" as *; - -.ds-flex { - @include reset; - display: flex; - flex-wrap: wrap; -} - -.ds-flex-item { - @include reset; - @include layout-flex-fix; -} diff --git a/maintenance/lib/styleguide/components/layout/Space/Space.vue b/maintenance/lib/styleguide/components/layout/Space/Space.vue deleted file mode 100644 index eb104c33f..000000000 --- a/maintenance/lib/styleguide/components/layout/Space/Space.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - diff --git a/maintenance/lib/styleguide/components/layout/Space/style.scss b/maintenance/lib/styleguide/components/layout/Space/style.scss deleted file mode 100644 index 282e700ff..000000000 --- a/maintenance/lib/styleguide/components/layout/Space/style.scss +++ /dev/null @@ -1,9 +0,0 @@ -@use "@@/styles/shared" as *; - -.ds-space { - @include reset; -} - -.ds-space-centered { - text-align: center; -} diff --git a/maintenance/lib/styleguide/components/typography/Logo/Logo.vue b/maintenance/lib/styleguide/components/typography/Logo/Logo.vue new file mode 100644 index 000000000..5e773259d --- /dev/null +++ b/maintenance/lib/styleguide/components/typography/Logo/Logo.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/maintenance/lib/styleguide/components/typography/Logo/style.scss b/maintenance/lib/styleguide/components/typography/Logo/style.scss new file mode 100644 index 000000000..83892282f --- /dev/null +++ b/maintenance/lib/styleguide/components/typography/Logo/style.scss @@ -0,0 +1,20 @@ +@use "@@/styles/shared" as *; +@use "@@/styles/tokens/tokens" as *; + +.ds-logo { + @include reset; + display: inline-flex; + justify-content: center; + align-items: center; + color: $text-color-primary; +} + +.ds-logo-inverse { + color: $text-color-primary-inverse; +} + +.ds-logo-svg { + width: 130px; + height: auto; + fill: currentColor; +} diff --git a/maintenance/lib/styleguide/index.ts b/maintenance/lib/styleguide/index.ts index ce31c20c3..f0b89b7c2 100644 --- a/maintenance/lib/styleguide/index.ts +++ b/maintenance/lib/styleguide/index.ts @@ -1,9 +1,8 @@ import '@@/styles/main.scss' import * as utils from './utils' -import * as mixins from './mixins' export * from './components' -export { utils, mixins } +export { utils } diff --git a/maintenance/lib/styleguide/mixins/index.ts b/maintenance/lib/styleguide/mixins/index.ts deleted file mode 100644 index 97f270f60..000000000 --- a/maintenance/lib/styleguide/mixins/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import mediaQuery from './media-query' - -export { mediaQuery } diff --git a/maintenance/lib/styleguide/mixins/media-query.ts b/maintenance/lib/styleguide/mixins/media-query.ts deleted file mode 100644 index 96b78acad..000000000 --- a/maintenance/lib/styleguide/mixins/media-query.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { tokenMap } from '@@/styles/tokens' - -const windowSize = { - width: null, - height: null, -} - -function updateWindowSize() { - windowSize.width = - document.documentElement.clientWidth || document.body.clientWidth - - windowSize.height = - document.documentElement.clientHeight || document.body.clientHeight -} - -let init = false - -function initListener() { - if (init) { - return - } - try { - if (window && typeof window !== 'undefined') { - window.addEventListener('resize', updateWindowSize) - updateWindowSize() - } - init = true - } catch (err) { - init = true - return false - } -} - -/** - * @mixin - */ -export default { - data() { - return { - mediaQueryWindowSize: windowSize, - } - }, - methods: { - mediaQuery(arg) { - initListener() - if (arg === null || typeof arg !== 'object') { - return arg - } - let result = arg.base - Object.keys(tokenMap.mediaSize) - .reverse() - .some((key) => { - const width = tokenMap.mediaSize[key].value - if (width <= this.mediaQueryWindowSize.width && arg[key]) { - result = arg[key] - return true - } - }) - return result - }, - }, -} diff --git a/maintenance/media-queries.scss b/maintenance/media-queries.scss new file mode 100644 index 000000000..527f25128 --- /dev/null +++ b/maintenance/media-queries.scss @@ -0,0 +1,5 @@ +$x-small: '(screen and (min-width: 480px))'; +$small: '(screen and (min-width: 600px))'; +$medium: '(screen and (min-width: 768px))'; +$large: '(screen and (min-width: 1024px))'; +$x-large: '(screen and (min-width: 1200px))'; diff --git a/maintenance/nuxt.config.ts b/maintenance/nuxt.config.ts index b2e00995d..d404ac44a 100644 --- a/maintenance/nuxt.config.ts +++ b/maintenance/nuxt.config.ts @@ -30,7 +30,7 @@ export default defineNuxtConfig({ plugins: [viteTsConfigPaths()], resolve: { alias: { - '@@': resolve(__dirname, './src'), + '@@': resolve(__dirname, './lib/styleguide'), } }, build: { diff --git a/maintenance/style.css b/maintenance/style.css new file mode 100644 index 000000000..fe5850ad3 --- /dev/null +++ b/maintenance/style.css @@ -0,0 +1,280 @@ +:root { + /* Color Brand */ + --color-primary: rgb(23, 181, 63); + --color-primary-light: rgb(96, 214, 98); + --color-primary-dark: rgb(25, 122, 49); + --color-primary-active: rgb(25, 194, 67); + --color-primary-inverse: rgb(241, 253, 244); + --color-secondary: rgb(0, 142, 230); + --color-secondary-active: rgb(10, 161, 255); + --color-secondary-inverse: rgb(240, 249, 255); + --color-success: rgb(23, 181, 63); + --color-success-active: rgb(26, 203, 71); + --color-success-inverse: rgb(241, 253, 244); + --color-danger: rgb(219, 57, 36); + --color-danger-light: rgb(242, 97, 65); + --color-danger-dark: rgb(158, 43, 28); + --color-danger-active: rgb(224, 81, 62); + --color-danger-inverse: rgb(253, 243, 242); + --color-warning: rgb(230, 121, 25); + --color-warning-active: rgb(233, 137, 53); + --color-warning-inverse: rgb(253, 247, 241); + --color-yellow: rgb(245, 196, 0); + --color-yellow-active: rgb(255, 206, 10); + --color-yellow-inverse: rgb(255, 252, 240); + + /* Color Neutral */ + --color-neutral-0: rgb(25, 23, 28); + --color-neutral-10: rgb(40, 37, 45); + --color-neutral-20: rgb(75, 69, 84); + --color-neutral-30: rgb(100, 92, 112); + --color-neutral-40: rgb(112, 103, 126); + --color-neutral-50: rgb(151, 143, 163); + --color-neutral-60: rgb(177, 171, 186); + --color-neutral-70: rgb(203, 199, 209); + --color-neutral-80: rgb(229, 227, 232); + --color-neutral-85: rgb(239, 238, 241); + --color-neutral-90: rgb(245, 244, 246); + --color-neutral-95: rgb(250, 249, 250); + --color-neutral-100: rgb(255, 255, 255); + + /* Color Text */ + --text-color-base: rgb(75, 69, 84); + --text-color-soft: rgb(112, 103, 126); + --text-color-softer: rgb(177, 171, 186); + --text-color-disabled: rgb(177, 171, 186); + --text-color-inverse: rgb(250, 249, 250); + --text-color-link: rgb(23, 181, 63); + --text-color-link-active: rgb(25, 194, 67); + --text-color-primary: rgb(23, 181, 63); + --text-color-primary-inverse: rgb(241, 253, 244); + --text-color-secondary: rgb(0, 142, 230); + --text-color-secondary-inverse: rgb(240, 249, 255); + --text-color-success: rgb(23, 181, 63); + --text-color-success-inverse: rgb(241, 253, 244); + --text-color-warning: rgb(230, 121, 25); + --text-color-warning-inverse: rgb(253, 247, 241); + --text-color-danger: rgb(219, 57, 36); + --text-color-danger-inverse: rgb(253, 243, 242); + + /* Color Background */ + --background-color-base: rgb(255, 255, 255); + --background-color-soft: rgb(250, 249, 250); + --background-color-softer: rgb(245, 244, 246); + --background-color-softer-active: rgb(250, 249, 250); + --background-color-softest: rgb(239, 238, 241); + --background-color-softest-active: rgb(245, 244, 246); + --background-color-inverse: rgb(25, 23, 28); + --background-color-inverse-soft: rgb(40, 37, 45); + --background-color-inverse-softer: rgb(75, 69, 84); + --background-color-inverse-softer-active: rgb(100, 92, 112); + --background-color-disabled: rgb(245, 244, 246); + --background-color-primary: rgb(23, 181, 63); + --background-color-primary-active: rgb(25, 194, 67); + --background-color-primary-inverse: rgb(241, 253, 244); + --background-color-secondary: rgb(0, 142, 230); + --background-color-secondary-active: rgb(10, 161, 255); + --background-color-secondary-inverse: rgb(240, 249, 255); + --background-color-third: rgb(126, 82, 204); + --background-color-third-active: rgb(160, 103, 255); + --background-color-third-inverse: rgb(239, 230, 255); + --background-color-success: rgb(23, 181, 63); + --background-color-success-active: rgb(26, 203, 71); + --background-color-success-inverse: rgb(241, 253, 244); + --background-color-warning: rgb(230, 121, 25); + --background-color-warning-active: rgb(233, 137, 53); + --background-color-warning-inverse: rgb(253, 247, 241); + --background-color-danger: rgb(219, 57, 36); + --background-color-danger-active: rgb(224, 81, 62); + --background-color-danger-inverse: rgb(253, 243, 242); + + /* Color Border */ + --border-color-base: rgb(177, 171, 186); + --border-color-soft: rgb(203, 199, 209); + --border-color-softer: rgb(229, 227, 232); + --border-color-softest: rgb(245, 244, 246); + --border-color-active: rgb(23, 181, 63); + --border-color-primary: rgb(23, 181, 63); + --border-color-success: rgb(23, 181, 63); + --border-color-warning: rgb(230, 121, 25); + --border-color-danger: rgb(219, 57, 36); + + /* Border Size */ + --border-size-base: 1px; + --border-size-large: 3px; + --border-size-x-large: 6px; + + /* Border Radius */ + --border-radius-x-large: 5px; + --border-radius-large: 4px; + --border-radius-base: 4px; + --border-radius-small: 2px; + --border-radius-rounded: 2em; + --border-radius-circle: 50%; + + /* Font Size */ + --font-size-xxxx-large: 3rem; + --font-size-xxx-large: 2.5rem; + --font-size-xx-large: 2rem; + --font-size-x-large: 1.5rem; + --font-size-large: 1.25rem; + --font-size-base: 1rem; + --font-size-body: 15px; + --font-size-small: 0.8rem; + --font-size-x-small: 0.7rem; + --font-size-xx-small: 0.6rem; + + /* Font Space */ + --font-space-xxxx-large: 2em; + --font-space-xxx-large: 1.5em; + --font-space-xx-large: 1.2em; + --font-space-x-large: 1em; + --font-space-large: 0.6em; + --font-space-base: 0.5em; + --font-space-small: 0.4em; + --font-space-x-small: 0.3em; + --font-space-xx-small: 0.2em; + --font-space-xxx-small: 0.1em; + + /* Font Family */ + --font-family-heading: 'LatoWeb', sans-serif; + --font-family-text: 'LatoWeb', sans-serif; + --font-family-serif: 'Gentium Basic', serif; + --font-family-code: inconsolata, monospace; + + /* Font Weight */ + --font-weight-regular: normal; + --font-weight-bold: 600; + + /* Line Height */ + --line-height-large: 1.5rem; + --line-height-base: 1.3rem; + --line-height-small: 1.1rem; + --line-height-smaller: 1.0rem; + + /* Letter Spacing */ + --letter-spacing-x-large: 0.1em; + --letter-spacing-large: 0.05em; + --letter-spacing-base: 0; + --letter-spacing-small: -0.01em; + --letter-spacing-x-small: -0.015em; + + /* Opacity */ + --opacity-base: 1; + --opacity-soft: 0.7; + --opacity-disabled: 0.5; + + /* Space */ + --space-xxx-large: 128px; + --space-xx-large: 64px; + --space-x-large: 48px; + --space-large: 32px; + --space-base: 24px; + --space-small: 16px; + --space-x-small: 8px; + --space-xx-small: 4px; + --space-xxx-small: 2px; + --space-none: 0; + + /* Size Height */ + --size-height-base: 42px; + --size-height-large: 50px; + --size-height-xlarge: 60px; + --size-height-footer: 64px; + --size-height-connections: 315px; + --size-tappable-square: 44px; + --size-ribbon: 6px; + + /* Size Width */ + --size-width-filter-sidebar: 85px; + --size-width-paginate: 200px; + --size-max-width-filter-menu: 1026px; + + /* Size Avatar */ + --size-avatar-small: 34px; + --size-avatar-base: 44px; + --size-avatar-large: 114px; + + /* Size Buttons */ + --size-button-large: 50px; + --size-button-base: 36px; + --size-button-small: 26px; + + /* Size Images */ + --size-image-max-height: 2000px; + --size-image-cropper-max-height: 600px; + --size-image-cropper-min-height: 400px; + --size-image-uploader-min-height: 250px; + + /* Size Icons */ + --size-icon-base: 16px; + --size-icon-large: 60px; + + /* Shadow */ + --box-shadow-x-large: 0 15px 30px 0 rgba(0,0,0,.11),0 5px 15px 0 rgba(0,0,0,.08); + --box-shadow-large: 0 10px 20px 0 rgba(0,0,0,.11),0 3px 10px 0 rgba(0,0,0,.08); + --box-shadow-base: 0px 12px 26px -4px rgba(0, 0, 0, .1); + --box-shadow-small: 0px 8px 18px -2px rgba(0, 0, 0, .1); + --box-shadow-x-small: 0px 0px 3px 0px rgba(0, 0, 0, .1); + --box-shadow-active: 0 0 6px 1px rgba(20, 100, 160, 0.5); + --box-shadow-inset: inset 0 0 20px 1px rgba(0,0,0,.15); + --box-shadow-small-inset: inset 0 0 0 1px rgba(0,0,0,.05); + + /* Effects */ + --blur-radius: 22px; + + /* Animation Duration */ + --duration-short: 0.08s; + --duration-base: 0.5s; + --duration-long: 0.75s; + --duration-x-long: 1s; + --duration-xx-long: 2s; + + /* Animation Ease */ + --ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94); + --ease-out-sharp: cubic-bezier(0.165, 0.84, 0.44, 1); + --ease-out-bounce: cubic-bezier(.87,-.41,.19,1.44); + --ease-in: cubic-bezier(0.55, 0.085, 0.68, 0.53); + --ease-in-sharp: cubic-bezier(0.895, 0.03, 0.685, 0.22); + + /* Z-Index */ + --z-index-modal: 9999; + --z-index-overlay: 9000; + --z-index-dropdown: 8888; + --z-index-page-submenu: 2500; + --z-index-page-header: 2000; + --z-index-page-sidebar: 1500; + --z-index-sticky-float: 150; + --z-index-sticky: 100; + --z-index-post-teaser-link: 5; + --z-index-surface: 1; + + /* Custom Tokens (Footer, Header, etc.) */ + --color-header-background: var(--color-neutral-100); + --color-footer-background: var(--color-neutral-100); + --color-footer-link: var(--color-primary); + --color-locale-menu: var(--text-color-soft); + --color-donation-bar: var(--color-primary); + --color-donation-bar-light: var(--color-primary-light); + --color-toast-red: var(--color-danger); + --color-toast-orange: var(--color-warning); + --color-toast-yellow: var(--color-yellow); + --color-toast-blue: var(--color-secondary); + --color-toast-green: var(--color-success); + --color-ribbon-event: var(--background-color-third); + --color-ribbon-event-active: var(--background-color-third-active); + --color-ribbon-article: var(--background-color-secondary); + --color-ribbon-article-active: var(--background-color-secondary-active); + + /* Chat Tokens */ + --chat-message-bg-me: var(--color-primary-light); + --chat-message-color: var(--text-color-base); + --chat-message-bg-others: var(--color-neutral-80); + --chat-sidemenu-bg: var(--color-secondary-active); + --chat-new-message-color: var(--color-secondary-active); + --chat-message-timestamp: var(--text-color-soft); + --chat-message-checkmark-seen: var(--text-color-secondary); + --chat-message-checkmark: var(--text-color-soft); + --chat-room-color-counter-badge: var(--text-color-inverse); + --chat-room-background-counter-badge: var(--color-secondary); +}