@opexa/portal-components 0.0.49 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/client/hooks/index.d.ts +2 -0
  2. package/dist/client/hooks/index.js +2 -0
  3. package/dist/client/hooks/useAvailableQuestsQuery.d.ts +3 -0
  4. package/dist/client/hooks/useAvailableQuestsQuery.js +34 -0
  5. package/dist/client/hooks/useCheckInDailyCheckInQuestMutation.d.ts +2 -0
  6. package/dist/client/hooks/useCheckInDailyCheckInQuestMutation.js +29 -0
  7. package/dist/client/hooks/useGlobalStore.d.ts +3 -3
  8. package/dist/client/hooks/useGlobalStore.js +3 -3
  9. package/dist/components/Account/AccountTrigger.d.ts +6 -0
  10. package/dist/components/Account/AccountTrigger.js +13 -0
  11. package/dist/components/Account/index.d.ts +1 -0
  12. package/dist/components/Account/index.js +1 -0
  13. package/dist/components/DepositWithdrawal/Deposit/OnlineBankDeposit/OnlineBankDepositContext.d.ts +2 -2
  14. package/dist/components/DepositWithdrawal/Deposit/OnlineBankDeposit/useOnlineBankDeposit.d.ts +1 -1
  15. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit/QRPHDepositContext.d.ts +2 -2
  16. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit/useQRPHDeposit.d.ts +1 -1
  17. package/dist/components/DepositWithdrawal/DepositWithdrawalTrigger.js +3 -2
  18. package/dist/components/GameLaunch/GameLaunchTrigger.js +13 -10
  19. package/dist/components/Games/Game.js +1 -1
  20. package/dist/components/GamesSearch/GamesSearch.d.ts +4 -2
  21. package/dist/components/GamesSearch/GamesSearch.js +28 -21
  22. package/dist/components/GamesSearch/index.d.ts +0 -1
  23. package/dist/components/GamesSearch/index.js +0 -1
  24. package/dist/components/Messages/Messages.js +1 -1
  25. package/dist/components/Messages/MessagesTrigger.js +2 -2
  26. package/dist/components/Quests/CountdownTimer.d.ts +15 -0
  27. package/dist/components/Quests/CountdownTimer.js +33 -0
  28. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.d.ts +4 -1
  29. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.js +52 -37
  30. package/dist/components/Quests/Quests.js +25 -1
  31. package/dist/components/Quests/WageringQuest/WageringQuest.d.ts +4 -1
  32. package/dist/components/Quests/WageringQuest/WageringQuest.js +9 -7
  33. package/dist/components/Quests/WageringQuest/WageringQuestModal.d.ts +1 -0
  34. package/dist/components/Quests/WageringQuest/WageringQuestModal.js +1 -1
  35. package/dist/components/Search/Search.d.ts +6 -0
  36. package/dist/components/Search/Search.js +38 -0
  37. package/dist/components/Search/SearchTrigger.d.ts +5 -0
  38. package/dist/components/Search/SearchTrigger.js +14 -0
  39. package/dist/components/Search/index.d.ts +2 -0
  40. package/dist/components/Search/index.js +2 -0
  41. package/dist/components/SignIn/SignInTrigger.js +2 -2
  42. package/dist/components/SignUp/SignUpTrigger.js +2 -2
  43. package/dist/components/index.d.ts +1 -0
  44. package/dist/components/index.js +1 -0
  45. package/dist/styles/theme.css +24 -0
  46. package/dist/tsconfig.build.tsbuildinfo +1 -1
  47. package/dist/ui/Combobox/Combobox.d.ts +840 -798
  48. package/dist/ui/Combobox/combobox.recipe.d.ts +54 -51
  49. package/dist/ui/Combobox/combobox.recipe.js +59 -1
  50. package/dist/ui/Progress/Progress.d.ts +27 -27
  51. package/dist/ui/Progress/progress.recipe.d.ts +3 -3
  52. package/dist/ui/SegmentGroup/SegmentGroup.d.ts +18 -18
  53. package/dist/ui/SegmentGroup/segmentGroup.recipe.d.ts +3 -3
  54. package/dist/ui/Select/Select.d.ts +45 -45
  55. package/dist/ui/Select/select.recipe.d.ts +3 -3
  56. package/dist/ui/Table/Table.d.ts +21 -21
  57. package/dist/ui/Table/table.recipe.d.ts +3 -3
  58. package/dist/ui/Tabs/Tabs.d.ts +15 -15
  59. package/dist/ui/Tabs/tabs.recipe.d.ts +3 -3
  60. package/dist/utils/queryKeys.d.ts +2 -0
  61. package/dist/utils/queryKeys.js +6 -0
  62. package/package.json +2 -2
@@ -2,15 +2,17 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
4
  import { ClockStopWatchIcon, InfoCircleIcon } from '../../../icons/index.js';
5
- import { Button } from '../../../ui/index.js';
6
5
  import { WageringQuestModal } from './WageringQuestModal.js';
7
- export default function WageringQuest() {
6
+ import CountdownTimer from '../CountdownTimer.js';
7
+ import { twMerge } from 'tailwind-merge';
8
+ export default function WageringQuest({ quest }) {
8
9
  const [showRules, setShowRules] = useState(false);
9
- const totalBet = 200;
10
- const targetBet = 500;
11
- const progressPercent = (totalBet / targetBet) * 100;
12
- return (_jsxs(_Fragment, { children: [_jsx(WageringQuestModal, { modalState: {
10
+ const [isExpired, setIsExpired] = useState(false);
11
+ const { progressPercentage, turnover, targetTurnover, name, description, endDateTime, bonus, status, } = quest;
12
+ return (_jsxs(_Fragment, { children: [_jsx(WageringQuestModal, { questName: name, modalState: {
13
13
  isOpen: showRules,
14
14
  setIsOpen: setShowRules,
15
- } }), _jsxs("div", { className: "border-border-primary bg-bg-tertiary flex h-full w-full min-w-[343px] flex-col space-y-6 rounded-2xl border px-4 pb-6 pt-5", children: [_jsxs("div", { className: "flex flex-col space-y-2", children: [_jsxs("div", { className: "flex max-h-7.5 items-start justify-between", children: [_jsxs("div", { className: "border-utility-brand-200 bg-utility-brand-50 rounded-xs flex items-center space-x-1 border py-1 pl-2 pr-2.5", children: [_jsx(ClockStopWatchIcon, { className: "text-brand-400" }), _jsx("p", { className: "text-utility-brand-700 text-sm font-medium", children: "6d:10h:11m:10s" })] }), _jsx("div", { role: "button", className: "rounded-xs bg-bg-primary border-border-secondary cursor-pointer border p-2", onClick: () => setShowRules((prev) => !prev), children: _jsx(InfoCircleIcon, { className: "text-text-disabled" }) })] }), _jsx("p", { className: "text-xl font-semibold", children: "Slots - total bet of \u20B1500" }), _jsx("p", { className: "text-text-secondary-700 text-wrap text-sm font-normal", children: "Play any slot game and place a total of \u20B1500 in bets to claim your reward!" })] }), _jsxs("div", { className: "flex w-full flex-col space-y-2", children: [_jsxs("div", { className: "text-text-primary-brand group flex items-center justify-between", children: [_jsxs("p", { children: ["Progress ", progressPercent, "%"] }), _jsxs("p", { children: [totalBet, _jsxs("span", { className: "text-text-quarterary-brand", children: ["/", targetBet] })] })] }), _jsx("div", { className: "bg-bg-primary h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-utility-brand-600 h-full rounded-full transition-all duration-300", style: { width: `${progressPercent}%` } }) })] }), _jsx("div", { className: "flex h-full items-end", children: _jsx(Button, { variant: "solid", className: "bg-button-secondary-bg border-bg-primary-hover border text-white", children: _jsxs("p", { children: ["Complete to get ", _jsx("span", { className: "text-brand-400", children: "\u20B150" }), " bonus!"] }) }) })] })] }));
15
+ } }), _jsxs("div", { className: "border-border-primary bg-bg-tertiary flex h-full w-full min-w-[343px] flex-col space-y-6 rounded-2xl border px-4 pb-6 pt-5", children: [_jsxs("div", { className: "flex flex-col space-y-2", children: [_jsxs("div", { className: "flex max-h-7.5 items-start justify-between", children: [_jsx(CountdownTimer, { endDateTime: endDateTime, renderAction: (timeLeft) => (_jsxs("div", { className: "border-utility-brand-200 bg-utility-brand-50 rounded-xs flex items-center space-x-1 border py-1 pl-2 pr-2.5", children: [_jsx(ClockStopWatchIcon, { className: "text-brand-400" }), _jsxs("p", { className: "text-utility-brand-700 text-sm font-medium", children: [timeLeft.days, "d:", timeLeft.hours, "h:", timeLeft.minutes, "m:", timeLeft.seconds, "s"] })] })), onEnd: () => setIsExpired(true) }), _jsx("div", { role: "button", className: "bg-bg-primary border-border-secondary cursor-pointer rounded-md border p-2", onClick: () => setShowRules((prev) => !prev), children: _jsx(InfoCircleIcon, { className: "text-text-disabled" }) })] }), _jsx("p", { className: "text-xl font-semibold", children: name }), _jsx("p", { className: "text-text-secondary-700 text-wrap text-sm font-normal", dangerouslySetInnerHTML: { __html: description } })] }), _jsxs("div", { className: "flex w-full flex-col space-y-2", children: [_jsxs("div", { className: "text-text-primary-brand group flex items-center justify-between", children: [_jsxs("p", { children: ["Progress ", parseInt(progressPercentage).toFixed(2), "%"] }), _jsxs("p", { children: [turnover, _jsxs("span", { className: "text-text-quarterary-brand", children: ["/", targetTurnover, " PHP"] })] })] }), _jsx("div", { className: "bg-bg-primary h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-utility-brand-600 h-full rounded-full transition-all duration-300", style: { width: `${progressPercentage}%` } }) })] }), _jsx("div", { className: "flex h-full items-end", children: _jsx("div", { className: "bg-button-secondary-bg border-bg-primary-hover w-full rounded-md border px-3.5 py-2.5 text-center text-white", children: _jsxs("p", { className: twMerge(isExpired || status === 'COMPLETED' || status === 'FAILED'
16
+ ? ['opacity-50 grayscale']
17
+ : ''), children: ["Complete to get ", _jsxs("span", { className: "text-brand-400", children: ["\u20B1", bonus] }), ' ', "bonus!"] }) }) })] })] }));
16
18
  }
@@ -1,4 +1,5 @@
1
1
  interface Props {
2
+ questName: string;
2
3
  modalState: {
3
4
  isOpen: boolean;
4
5
  setIsOpen: (isOpen: boolean) => void;
@@ -4,5 +4,5 @@ import { Portal } from '@ark-ui/react';
4
4
  import { XIcon } from '../../../icons/index.js';
5
5
  import { Button, Dialog } from '../../../ui/index.js';
6
6
  export function WageringQuestModal(props) {
7
- return (_jsx(Dialog.Root, { lazyMount: true, unmountOnExit: true, open: props.modalState.isOpen, onOpenChange: ({ open }) => props.modalState.setIsOpen(open), closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+1)]" }), _jsx(Dialog.Positioner, { className: "!z-[calc(var(--z-dialog)+2)] flex items-center justify-center", children: _jsxs(Dialog.Content, { className: "min-h-auto mx-auto max-w-[343px] rounded-xl px-4 pb-0 pt-5", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsxs("div", { className: "flex flex-col space-y-5", children: [_jsx("p", { className: "text-text-primary-900 text-[18px] font-semibold", children: "Slots - total bet Rules" }), _jsxs("ul", { className: "text-text-tertiary-600 group list-disc text-wrap pl-4 text-sm font-normal", children: [_jsx("li", { children: "Earn extra rewards just by playing Slots, every bet counts, win or lose!" }), _jsx("li", { children: "Reach the wagering requirement in bets to complete the quest and claim your reward." })] })] }), _jsx("div", { className: "pb-4 pt-6", children: _jsx(Button, { onClick: () => props.modalState.setIsOpen(false), children: "Ok" }) })] }) })] }) }));
7
+ return (_jsx(Dialog.Root, { lazyMount: true, unmountOnExit: true, open: props.modalState.isOpen, onOpenChange: ({ open }) => props.modalState.setIsOpen(open), closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+1)]" }), _jsx(Dialog.Positioner, { className: "!z-[calc(var(--z-dialog)+2)] flex items-center justify-center", children: _jsxs(Dialog.Content, { className: "min-h-auto mx-auto max-w-[343px] rounded-xl px-4 pb-0 pt-5", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsxs("div", { className: "flex flex-col space-y-5", children: [_jsx("p", { className: "text-text-primary-900 text-[18px] font-semibold", children: props.questName }), _jsxs("ul", { className: "text-text-tertiary-600 group list-disc text-wrap pl-4 text-sm font-normal", children: [_jsx("li", { children: "Earn extra rewards just by playing Slots, every bet counts, win or lose!" }), _jsx("li", { children: "Reach the wagering requirement in bets to complete the quest and claim your reward." })] })] }), _jsx("div", { className: "pb-4 pt-6", children: _jsx(Button, { onClick: () => props.modalState.setIsOpen(false), children: "Ok" }) })] }) })] }) }));
8
8
  }
@@ -0,0 +1,6 @@
1
+ import { type ImageProps } from 'next/image';
2
+ interface SearchProps {
3
+ logo: ImageProps['src'];
4
+ }
5
+ export declare function Search(props: SearchProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Portal } from '@ark-ui/react';
4
+ import Image, {} from 'next/image';
5
+ import { useRef, useState } from 'react';
6
+ import { useShallow } from 'zustand/shallow';
7
+ import { useGamesQuery, useGlobalStore } from '../../client/hooks/index.js';
8
+ import { SearchLgIcon, XIcon } from '../../icons/index.js';
9
+ import providerHacksaw from '../../images/hacksaw-gaming.png';
10
+ import { Button, Dialog, Field, IconButton, Presence } from '../../ui/index.js';
11
+ import { GameLaunchTrigger } from '../GameLaunch/index.js';
12
+ export function Search(props) {
13
+ const globalStore = useGlobalStore(useShallow((ctx) => ({
14
+ search: ctx.search,
15
+ })));
16
+ const inputRef = useRef(null);
17
+ const [search, setSearch] = useState('');
18
+ const gamesQuery = useGamesQuery({
19
+ first: 18,
20
+ search,
21
+ }, {
22
+ enabled: search.length >= 3,
23
+ });
24
+ const games = gamesQuery.data?.pages
25
+ .map((page) => page.edges.map((edge) => edge.node))
26
+ .flat() ?? [];
27
+ return (_jsx(Dialog.Root, { open: globalStore.search.open, onOpenChange: (details) => globalStore.search.setOpen(details.open), lazyMount: true, unmountOnExit: true, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { children: _jsxs(Dialog.Content, { className: "bg-bg-primary lg:min-h-auto mx-auto min-h-full w-full pt-xl lg:mt-[132px] lg:max-w-[1136px] lg:bg-unset lg:pt-0", children: [_jsx(Dialog.Context, { children: (api) => (_jsxs("div", { className: "flex items-center justify-between px-4 lg:hidden", children: [_jsx(Image, { src: props.logo, alt: "", width: 200, height: 40, className: "h-8 w-auto" }), _jsx(IconButton, { size: "sm", colorScheme: "gray", onClick: () => api.setOpen(false), children: _jsx(XIcon, { className: "text-text-quinary size-6" }) })] })) }), _jsx("div", { className: "flex justify-end", children: _jsx(Dialog.Context, { children: (api) => (_jsx("button", { type: "button", onClick: () => api.setOpen(false), className: "hidden size-9 items-center justify-center rounded-md bg-white/20 lg:flex", children: _jsx(XIcon, { className: "size-5 text-white" }) })) }) }), _jsx("div", { className: "mt-2xl px-4 lg:mt-xl lg:px-0", children: _jsxs("div", { className: "relative", children: [_jsx(SearchLgIcon, { className: "text-text-quinary pointer-events-none absolute left-3.5 top-1/2 size-5 -translate-y-1/2" }), _jsx(Field.Input, { ref: inputRef, type: "search", value: search, onChange: (e) => {
28
+ setSearch(e.target.value);
29
+ }, className: "pl-10 pr-16", placeholder: "Search", autoComplete: "off" }), _jsx(Presence, { present: search.length > 0, asChild: true, lazyMount: true, children: _jsx("button", { type: "button", className: "text-text-secondary-700 absolute right-3.5 top-1/2 -translate-y-1/2 font-semibold", onClick: () => {
30
+ setSearch('');
31
+ inputRef.current?.focus();
32
+ }, children: "Clear" }) })] }) }), _jsx("div", { className: "lg:bg-bg-primary lg:border-border-primary mt-2xl p-xl pb-3xl lg:mt-2 lg:rounded-xl lg:border", children: search.length <= 0 ? (_jsx(Alert, { message: "Search for your favorite game or provider." })) : search.length >= 1 && search.length <= 2 ? (_jsx(Alert, { message: "Search requires at least 3 characters." })) : (_jsxs(_Fragment, { children: [games.length <= 0 && _jsx(Alert, { message: "No results found" }), games.length > 0 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "text-lg font-semibold", children: "Providers" }), _jsx("div", { className: "mb-3xl mt-3.5 grid grid-cols-3 gap-1.5 lg:grid-cols-9 lg:gap-3.5", children: _jsx("div", { className: "bg-gray-800 flex h-14 w-full items-center rounded-md", children: _jsx(Image, { src: providerHacksaw, alt: "", width: 100, height: 50, className: "mx-auto h-auto w-full" }) }) }), _jsx("h2", { className: "text-lg font-semibold", children: "Games" }), _jsx("div", { className: "mt-3.5 grid grid-cols-3 gap-1.5 lg:grid-cols-9 lg:gap-3.5", children: games.map((game) => (_jsxs(GameLaunchTrigger, { game: game, className: "block w-full shadow-sm", onClick: () => {
33
+ globalStore.search.setOpen(false);
34
+ }, children: [_jsx(Image, { src: game.image, alt: "", width: 200, height: 200, priority: true, className: "aspect-square w-full rounded-t-md object-cover" }), _jsx("span", { className: "bg-bg-tertiary text-text-primary-brand block w-full truncate rounded-b-md px-2 py-2.5 text-center text-xs font-semibold", children: game.name })] }, game.id))) }), _jsx(Presence, { present: gamesQuery.hasNextPage, children: _jsx(Button, { variant: "outline", className: "mx-auto mt-12 w-fit", onClick: () => gamesQuery.fetchNextPage(), children: "Load More" }) })] }))] })) })] }) })] }) }));
35
+ }
36
+ function Alert({ message }) {
37
+ return (_jsxs("div", { className: "py-lg", role: "alert", "aria-live": "polite", children: [_jsx("div", { className: "bg-bg-secondary shadow-xs border-border-primary mx-auto flex size-12 items-center justify-center rounded-lg border", children: _jsx(SearchLgIcon, { className: "text-text-secondary-700 size-6" }) }), _jsx("p", { className: "text-text-secondary-700 mt-4 text-center", children: message })] }));
38
+ }
@@ -0,0 +1,5 @@
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ export interface SearchTriggerProps extends ComponentPropsWithRef<'button'> {
3
+ asChild?: boolean;
4
+ }
5
+ export declare function SearchTrigger(props: SearchTriggerProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ark } from '@ark-ui/react';
4
+ import { useShallow } from 'zustand/shallow';
5
+ import { useGlobalStore } from '../../client/hooks/index.js';
6
+ export function SearchTrigger(props) {
7
+ const globalStore = useGlobalStore(useShallow((ctx) => ({
8
+ search: ctx.search,
9
+ })));
10
+ return (_jsx(ark.button, { type: "button", "aria-label": "Search", "data-state": globalStore.search.open ? 'open' : 'closed', ...props, onClick: (e) => {
11
+ globalStore.search.setOpen(!globalStore.search.open);
12
+ return props.onClick?.(e);
13
+ } }));
14
+ }
@@ -0,0 +1,2 @@
1
+ export * from './Search';
2
+ export * from './SearchTrigger';
@@ -0,0 +1,2 @@
1
+ export * from './Search.js';
2
+ export * from './SearchTrigger.js';
@@ -7,8 +7,8 @@ export function SignInTrigger(props) {
7
7
  const globalStore = useGlobalStore(useShallow((ctx) => ({
8
8
  signIn: ctx.signIn,
9
9
  })));
10
- return (_jsx(ark.button, { type: "button", ...props, onClick: (e) => {
10
+ return (_jsx(ark.button, { type: "button", "aria-label": "Sign in", "data-state": globalStore.signIn.open ? 'open' : 'closed', ...props, onClick: (e) => {
11
11
  globalStore.signIn.setOpen(!globalStore.signIn.open);
12
12
  return props.onClick?.(e);
13
- }, "data-state": globalStore.signIn.open ? 'open' : 'closed' }));
13
+ } }));
14
14
  }
@@ -7,8 +7,8 @@ export function SignUpTrigger(props) {
7
7
  const globalStore = useGlobalStore(useShallow((ctx) => ({
8
8
  signUp: ctx.signUp,
9
9
  })));
10
- return (_jsx(ark.button, { type: "button", ...props, onClick: (e) => {
10
+ return (_jsx(ark.button, { type: "button", "aria-label": "Sign up", "data-state": globalStore.signUp.open ? 'open' : 'closed', ...props, onClick: (e) => {
11
11
  globalStore.signUp.setOpen(!globalStore.signUp.open);
12
12
  return props.onClick?.(e);
13
- }, "data-state": globalStore.signUp.open ? 'open' : 'closed' }));
13
+ } }));
14
14
  }
@@ -23,6 +23,7 @@ export * from './Promo';
23
23
  export * from './Promos';
24
24
  export * from './Protected';
25
25
  export * from './Quests';
26
+ export * from './Search';
26
27
  export * from './SignIn';
27
28
  export * from './SignUp';
28
29
  export * from './TopWins';
@@ -23,6 +23,7 @@ export * from './Promo/index.js';
23
23
  export * from './Promos/index.js';
24
24
  export * from './Protected/index.js';
25
25
  export * from './Quests/index.js';
26
+ export * from './Search/index.js';
26
27
  export * from './SignIn/index.js';
27
28
  export * from './SignUp/index.js';
28
29
  export * from './TopWins/index.js';
@@ -360,6 +360,8 @@
360
360
  cubic-bezier(0.3, 0, 0.8, 0.15);
361
361
  --animate-slide-in-down: slide-in-down 400ms cubic-bezier(0.05, 0.7, 0.1, 1);
362
362
  --animate-slide-out-down: slide-out-down 250ms cubic-bezier(0.3, 0, 0.8, 0.15);
363
+ --animate-scale-in: scale-in 400ms cubic-bezier(0.05, 0.7, 0.1, 1);
364
+ --animate-scale-out: scale-out 250ms cubic-bezier(0.3, 0, 0.8, 0.15);
363
365
  --animate-marquee: marquee 10s linear infinite forwards;
364
366
 
365
367
  @keyframes fade-in {
@@ -624,6 +626,28 @@
624
626
  }
625
627
  }
626
628
 
629
+ @keyframes scale-in {
630
+ from {
631
+ transform: scale(0.85);
632
+ opacity: 0;
633
+ }
634
+ to {
635
+ transform: scale(1);
636
+ opacity: 1;
637
+ }
638
+ }
639
+
640
+ @keyframes scale-out {
641
+ from {
642
+ transform: scale(1);
643
+ opacity: 1;
644
+ }
645
+ to {
646
+ transform: scale(0.85);
647
+ opacity: 0;
648
+ }
649
+ }
650
+
627
651
  @keyframes marquee {
628
652
  to {
629
653
  transform: translateX(-100%);