Skip to content
This repository has been archived by the owner on Nov 24, 2024. It is now read-only.

Commit

Permalink
Merge branch 'main' into backend
Browse files Browse the repository at this point in the history
  • Loading branch information
deminearchiver committed Nov 24, 2024
2 parents a8b4444 + c3ac1bc commit 2fbbf1a
Show file tree
Hide file tree
Showing 13 changed files with 601 additions and 266 deletions.
2 changes: 1 addition & 1 deletion apps/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"@fontsource-variable/roboto-flex": "^5.1.0",
"@fontsource/roboto": "^5.1.0",
"@mdx-js/react": "^3.1.0",
"@star4/react": "^0.1.7",
"@star4/react": "^0.1.8",
"@star4/vanilla-extract": "^0.0.14",
"@tanstack/react-query": "^5.61.0",
"@tanstack/react-query-devtools": "^5.61.0",
Expand Down
43 changes: 32 additions & 11 deletions apps/frontend/src/components/accordion/accordion.module.sass
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@
transition-timing-function: star4.easing(emphasized)

&__header
appearance: none
outline: none
border: none
// background-color: star4.color(surface-container-highest)
background: none
cursor: pointer

position: relative
width: 100%
display: flex
align-items: center
justify-content: space-between
Expand All @@ -39,6 +41,13 @@
color: star4.color(on-secondary-container)
--star4-component-ripple-hover-color: #{star4.color(on-secondary-container)}
--star4-component-ripple-pressed-color: #{star4.color(on-secondary-container)}
&__focus-ring
inset: 8px
border-radius: star4.shape(small)

transition-property: inset
transition-duration: star4.duration(long2)
transition-timing-function: star4.easing(emphasized)
&__headline
@include star4.typescale(title, medium)
font-family: var(--star4-typeface-brand)
Expand All @@ -47,16 +56,28 @@
transition-timing-function: star4.easing(emphasized)

&__icon
position: relative
display: flex
align-items: center
justify-content: center
// position: relative
// display: flex
// align-items: center
// justify-content: center
transform-origin: center
// transform-origin: center
// transition-property: transform
// transition-duration: star4.duration(long2)
// transition-timing-function: star4.easing(emphasized)
fill: none
stroke: currentcolor
stroke-width: 2px
width: 24
height: 24

& > path
transition-property: d
transition-duration: star4.duration(long2)
transition-timing-function: star4.easing(emphasized)

transition-property: transform
transition-duration: star4.duration(long2)
transition-timing-function: star4.easing(emphasized)

&__content-wrapper
position: relative
Expand Down Expand Up @@ -89,10 +110,10 @@
color: star4.color(on-surface)
--star4-component-ripple-hover-color: #{star4.color(on-surface)}
--star4-component-ripple-pressed-color: #{star4.color(on-surface)}
& .accordion__item__focus-ring
inset: 16px
& .accordion__item__headline
@include star4.typescale(title, large)
& .accordion__item__icon
transform: rotate(180deg)
& .accordion__item__content-wrapper
grid-template-rows: 1fr
opacity: 1
25 changes: 19 additions & 6 deletions apps/frontend/src/components/accordion/accordion.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createIdentifiableElement, MaterialSymbol, Ripple } from "@star4/react";
import { createIdentifiableElement, FocusRing, MaterialSymbol, Ripple } from "@star4/react";
import { Children, createContext, forwardRef, memo, useContext, useEffect, useRef, useState, type HTMLAttributes, type ReactNode } from "react"
import clsx from "clsx";

Expand Down Expand Up @@ -119,7 +119,7 @@ const AccordionItemComponent = forwardRef<AccordionItem.Element, AccordionItem.P
forwardedRef,
) {
const ref = useRef<HTMLDivElement>(null);
const headerRef = useRef<HTMLDivElement>(null);
const headerRef = useRef<HTMLButtonElement>(null);

const { isFirst, isLast } = useAccordionItem();

Expand All @@ -137,18 +137,31 @@ const AccordionItemComponent = forwardRef<AccordionItem.Element, AccordionItem.P
)
}
aria-expanded={expanded}>
<div
<button
ref={headerRef}
className={styles["accordion__item__header"]}
onClick={() => setExpanded(prev => !prev)}>
<Ripple for={headerRef} />
<FocusRing for={headerRef} className={styles["accordion__item__focus-ring"]} />
<h3 className={styles["accordion__item__headline"]}>
{headline}
</h3>
<div className={styles["accordion__item__icon"]}>
{/* <div className={styles["accordion__item__icon"]}>
<MaterialSymbol name="expand_more" />
</div>
</div>
</div> */}
<svg
className={styles["accordion__item__icon"]}
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width={24}
height={24}>
<path d={
expanded
? "M 6.7 8.7 L 12 14 L 17.3 8.7"
: "M 6.7 14.7 L 12 9.4 L 17.3 14.7"
} />
</svg>
</button>
<div className={styles["accordion__item__content-wrapper"]}>
<div className={styles["accordion__item__content"]}>
<div className={styles["accordion__item__padding"]}>
Expand Down
183 changes: 183 additions & 0 deletions apps/frontend/src/components/glossary/glossary-old.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
import { ActionButton, ArrowForward, Button, createIdentifiableElement, IconButton, Lenis, ListItem, MaterialSymbol, Popover, usePresence } from "@star4/react";
import { memo, useCallback, useEffect, useState, type CSSProperties, type UIEventHandler } from "react";
import clsx from "clsx";

import styles from "./glossary.module.sass";
import { Header } from "../header";
import { Card } from "../card";
import { THEME } from "~/theme";
import { Accordion } from "../accordion";

import Budget from "./budget.mdx";
import FinancePlan from "./finance-plan.mdx";
import Economy from "./economy.mdx";
import IncomeExpenses from "./income-expenses.mdx";
import Investments from "./investments.mdx";
import Loans from "./loans.mdx";
import Rate from "./rate.mdx";

export namespace Glossary {
export type Props = {}
}

const GlossaryComponent = function Glossary(
{}: Glossary.Props,
) {
const [isOpen, setIsOpen] = useState(false);

const { isMounted, isEntering, isExiting, isAnimating, isVisible } = usePresence({
source: isOpen,
transitionDuration: [800, 200],
});

useEffect(
() => {
const isScrollLocked = isMounted && !isAnimating
document.body.toggleAttribute(
"data-scroll-lock",
isScrollLocked,
);
},
[isMounted, isAnimating],
);

const [isScrolledUnder, setIsScrolledUnder] = useState(false);
const onScroll: UIEventHandler<HTMLElement> = useCallback(
(event) => {
const scrollY = event.currentTarget.scrollTop;
const newIsScrolledUnder = scrollY > 0;
setIsScrolledUnder(newIsScrolledUnder);
},
[],
);
return (
<>
{/* <IconButton
onClick={() => setIsOpen(true)}
variant="filledTonal"
icon={<MaterialSymbol name="book" />} /> */}
<Button
onClick={() => setIsOpen(true)}
variant="filledTonal"
icon={<MaterialSymbol name="book" />}
label="Глоссарий" />
<Popover open={isMounted}>
<div
className={clsx(
styles["backdrop"],
isEntering && styles["backdrop--entering"],
isExiting && styles["backdrop--exiting"],
isVisible && styles["backdrop--visible"],
)} />
<div
className={clsx(
styles["shade"],
isEntering && styles["shade--entering"],
isExiting && styles["shade--exiting"],
isVisible && styles["shade--visible"],
)}>
<Lenis.Wrapper
className={
clsx(
styles["shade__scroller"],
isAnimating && styles["shade__scroller--animating"],
)
}
onScroll={onScroll}>
<Lenis.Content>
<Header
className={
clsx(
styles["shade__header"],
isScrolledUnder && styles["shade__header--scrolled-under"],
)
}
scrolledUnder={isScrolledUnder}
leading={
<IconButton onClick={() => setIsOpen(false)} icon={<MaterialSymbol name="close" />} />
}
headline="Глоссарий"
trailing={
<IconButton icon={<MaterialSymbol name="search" />} />
} />
<div className={styles["glossary__content"]}>
{/* <div className={styles["glossary__icons-card"]}>
<ListItem
multiline
leading={<MaterialSymbol name="payments" />}
headline="Твой баланс"
supportingText={
<span style={{ textWrap: "pretty" }}>
Игра заканчивается, если он станет отрицательным
</span>
} />
<ListItem
multiline
leading={<MaterialSymbol name="currency_ruble" />}
headline="Ежедневная прибыль"
supportingText={
<span style={{ textWrap: "pretty" }}>
Стоит денег, но значительно снижает траты на лечение!
</span>
} />
<ListItem
multiline
leading={<MaterialSymbol name="medical_information" />}
headline="Медицинская страховка"
supportingText={
<span style={{ textWrap: "pretty" }}>
Стоит денег, но значительно снижает траты на лечение!
</span>
} />
<ListItem
multiline
leading={<MaterialSymbol name="tram" />}
headline="Используемый вид транспорта"
supportingText={
<span style={{ textWrap: "pretty" }}>
Выбор за тобой: низкая стоимость проезда либо комфорт
</span>
} />
</div> */}
<Accordion>
<Accordion.Item headline="Бюджет">
<Budget />
</Accordion.Item>
<Accordion.Item headline="Финансовый план">
<FinancePlan />
</Accordion.Item>
<Accordion.Item headline="Экономия средств">
<Economy />
</Accordion.Item>
<Accordion.Item headline="Личные доходы и расходы">
<IncomeExpenses />
</Accordion.Item>
<Accordion.Item headline="Инвестиции">
<Investments />
</Accordion.Item>
<Accordion.Item headline="Кредиты, займы, ссуда">
<Loans />
</Accordion.Item>
<Accordion.Item headline="Кредитная ставка, процент">
<Rate />
</Accordion.Item>
</Accordion>
</div>
<div className={styles["glossary__action"]}>
<ActionButton
onClick={() => setIsOpen(false)}
icon={<ArrowForward />}
label="Продолжить!" />
</div>
</Lenis.Content>
</Lenis.Wrapper>
</div>
</Popover>
</>
);
}

export const Glossary = Object.assign(
memo(GlossaryComponent),
createIdentifiableElement<Glossary.Props>("IS_GLOSSARY"),
);
34 changes: 25 additions & 9 deletions apps/frontend/src/components/glossary/glossary.module.sass
Original file line number Diff line number Diff line change
Expand Up @@ -115,22 +115,31 @@ $shade-color: star4.color(surface-container)
&--animating
overflow-y: hidden

&__header
&#{&}
background-color: $shade-color
&--scrolled-under
&#{&}
background-color: star4.color(surface-container-highest)
// &__header
// &#{&}
// background-color: $shade-color
// &--scrolled-under
// &#{&}
// background-color: star4.color(surface)



.glossary
&__wrapper
display: flex
flex-direction: column
align-items: stretch
justify-content: center
height: 100%
min-height: 100vh
min-height: 100dvh
&__content
max-width: 840px
min-height: 70vh
margin-inline: auto
flex-grow: 1
padding-inline: 16px
padding-block: 16px

@include star4.layout(compact, medium)
padding-inline: 16px
Expand All @@ -149,12 +158,19 @@ $shade-color: star4.color(surface-container)
bottom: 0
display: flex
aling-items: center
justify-content: center
justify-content: flex-end
padding-inline: 16px
padding-block: 16px
background-color: star4.color(surface-container)
background-color: star4.color(surface)

@include star4.layout(compact, medium)
padding-inline: 16px
@include star4.layout(expanded, extra-large)
padding-inline: 24px

transition-property: background-color
transition-duration: star4.duration(short4)
transition-timing-function: linear

&--scrolled-under
background-color: star4.color(surface-container)
Loading

0 comments on commit 2fbbf1a

Please sign in to comment.