diff --git a/app/assets/styles/button.css b/app/assets/styles/button.css index c247d2c..ebc7ca1 100755 --- a/app/assets/styles/button.css +++ b/app/assets/styles/button.css @@ -4,6 +4,7 @@ --color: var(--color-white); --background-hover: var(--color-main-dark); + position: relative; display: flex; justify-content: center; align-items: center; diff --git a/app/assets/styles/buttonGroup.css b/app/assets/styles/buttonGroup.css new file mode 100644 index 0000000..9c47667 --- /dev/null +++ b/app/assets/styles/buttonGroup.css @@ -0,0 +1,32 @@ +.ButtonGroup { + display: flex; + + & button { + --color: var(--color-white-transparent); + --background: var(--color-main); + all: unset; + display: flex; + align-items: center; + justify-content: center; + gap: .5rem; + padding: .5rem; + flex-grow: 1; + background: var(--background); + color: var(--color); + cursor: pointer; + transition: var(--transition-default); + + &.active { + --color: var(--color-white); + --background: var(--color-main-dark); + } + + &:first-child { + border-radius: var(--radius-default) 0 0 var(--radius-default); + } + + &:last-child { + border-radius: 0 var(--radius-default) var(--radius-default) 0; + } + } +} \ No newline at end of file diff --git a/app/assets/styles/footer.css b/app/assets/styles/footer.css new file mode 100644 index 0000000..23c47e5 --- /dev/null +++ b/app/assets/styles/footer.css @@ -0,0 +1,40 @@ +.Footer { + background: var(--color-main-dark); + padding: 1rem; + + & h4 { + color: var(--color-white); + text-align: center; + margin-bottom: 1rem; + } + + & .bottom { + display: flex; + gap: 1rem; + justify-content: space-between; + color: var(--color-white-transparent); + } + + & .socials { + font-size: 1.5rem; + justify-content: center; + margin-bottom: 2rem; + } + + & .data-links { + justify-content: flex-end; + font-size: .8rem; + } + + & ul { + list-style: none; + display: flex; + align-items: center; + gap: 1rem; + + & a { + color: var(--color-white); + text-decoration: none; + } + } +} \ No newline at end of file diff --git a/app/assets/styles/general.css b/app/assets/styles/general.css index ad3b46c..594a8d1 100755 --- a/app/assets/styles/general.css +++ b/app/assets/styles/general.css @@ -4,16 +4,21 @@ --transition-default: 150ms; --color-white: white; + --color-white-transparent: rgba(255, 255, 255, 0.67); --color-red: #cc0001; --color-blue-light: #61a7fd; --color-blue: #2e86de; --color-blue-dark: #1b4b7f; --color-grey: #c7c7c7; + --color-orange: #DE9C2F; + --color-main: var(--color-blue); --color-main-light: var(--color-blue-light); --color-main-dark: var(--color-blue-dark); + --color-accent: var(--color-orange); + --box-shadow-upper: 0 -3px 6px rgba(0,0,0,0.16), 0 -3px 6px rgba(0,0,0,0.23); --box-shadow-z2: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); --box-shadow-inset: inset 0 3px 6px rgba(0,0,0,0.16), inset 0 3px 6px rgba(0,0,0,0.23); @@ -32,6 +37,43 @@ body { font-family: sans-serif; } +.dot { + --size: 10px; + width: var(--size); + height: var(--size); + top: 5px; + right: 25%; + border-radius: 50%; + background-color: var(--color-accent); + display: inline-block; + margin-right: 0.5rem; + position: absolute; + box-shadow: var(--box-shadow-z2); + scale: 0; + transition: var(--transition-default); + + &.visible { + scale: 1; + animation: pulse 1s infinite; + } +} + +@keyframes pulse { + 0% { + transform: scale(0.95); + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.7); + } + 70% { + transform: scale(1); + box-shadow: 0 0 0 10px rgba(255, 255, 255, 0); + } + + 100% { + transform: scale(0.95); + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); + } +} + .card { overflow: hidden; border-radius: var(--radius-default); @@ -44,6 +86,10 @@ body { min-height: 100dvh; } +.filter-bar { + margin-bottom: 1rem; +} + .pc-wrapper { gap: 1rem; margin-bottom: 1rem; diff --git a/app/components/Pp/ButtonGroup.vue b/app/components/Pp/ButtonGroup.vue new file mode 100644 index 0000000..322b6f7 --- /dev/null +++ b/app/components/Pp/ButtonGroup.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/Pp/Footer.vue b/app/components/Pp/Footer.vue index 324de62..4d57be6 100755 --- a/app/components/Pp/Footer.vue +++ b/app/components/Pp/Footer.vue @@ -1,7 +1,46 @@ diff --git a/app/components/Pp/Header.vue b/app/components/Pp/Header.vue index 51dfeb6..acaabf8 100755 --- a/app/components/Pp/Header.vue +++ b/app/components/Pp/Header.vue @@ -1,11 +1,11 @@ \ No newline at end of file diff --git a/app/components/Pp/PriceCard.vue b/app/components/Pp/PriceCard.vue index 2104633..0b495bb 100755 --- a/app/components/Pp/PriceCard.vue +++ b/app/components/Pp/PriceCard.vue @@ -53,7 +53,7 @@ Entfernen - + Scan @@ -72,46 +72,44 @@ type Props = { const { card } = defineProps() const emit = defineEmits(['remove', 'update']) -onMounted(() => { - calculate() - if (card.price) folded.value = true -}) - const root = ref() const folded = ref(false) const deleting = ref(false) -const ppr = ref(0) -const pps = ref(0) -const ppl = ref(0) +const ppr = ref(card.ppr) +const pps = ref(card.pps) +const ppl = ref(card.ppl) const intl = Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', }) -const update = () => { - emit('update', card) -} - const calculate = () => { if (!card.price || !card.roles) return ppr.value = card.price / card.roles - if (!card.sheets) return + if (!card.sheets) { + update() + return + } pps.value = (ppr.value / card.sheets) * 10 - if(!card.layers) return + if(!card.layers) { + update() + return + } ppl.value = (pps.value / card.layers) * 10 update() } -const deleteCard = async () => { - root.value?.addEventListener('transitionend', () => { - emit('remove') - }) +const update = () => emit('update', { ...card, ppr: ppr.value, pps: pps.value, ppl: ppl.value }) +const deleteCard = async () => { + root.value?.addEventListener('transitionend', () => emit('remove')) deleting.value = true } + +onMounted(() => folded.value = !!card.price) diff --git a/app/pages/index.vue b/app/pages/index.vue index 8c7f550..cc1abb7 100755 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -1,17 +1,32 @@