Use tailwindcss

Seto Elkahfi committed Apr 21, 2024 at 14:49 UTC 24e9483e15bcbdbd52a94a46a7f38cc355c17614
73 files changed +3888 -621
.gitignore
+1
@@ -203,6 +203,7 @@ target/
203 !.vscode/launch.json
204 !.vscode/extensions.json
205 !.vscode/*.code-snippets
206 +*.code-workspace
207
208 # Local History for Visual Studio Code
209 .history/
.nvmrc new
+1
@@ -0,0 +1 @@
1 +18.17.0
BUILD
+4 -4
@@ -4,11 +4,11 @@ load("@npm//@tauri-apps/cli:index.bzl", "tauri")
4 next(
5 name = "next-build",
6 data = glob([
7 - "pages/**",
7 + "app/**",
8 "public/**",
9 - "styles/**",
9 ]) + [
10 "tsconfig.json",
11 + "tailwind.config.js",
12 ],
13 templated_args = ["build"],
14 )
@@ -16,11 +16,11 @@ next(
16 next(
17 name = "next-dev",
18 data = glob([
19 - "pages/**",
19 + "app/**",
20 "public/**",
21 - "styles/**",
21 ]) + [
22 "tsconfig.json",
23 + "tailwind.config.js",
24 ],
25 templated_args = ["dev"],
26 )
README.md
+6 -1
@@ -1,6 +1,11 @@
1 # tauri-on-bazel
2
3 -A small repository to demonstrate how to build a [Tauri](https://tauri.app/) v1.5 project that is using [NextJS](https://nextjs.org/) v14 + Typescript as a frontend framework with [Bazel](https://bazel.build/) v6.
3 +> {fast, correct} + {optimized, secure} = {tauri-on-bazel}
4 +
5 +A small repository to demonstrate how to build a [Tauri](https://tauri.app/) v1.5 project that is using [NextJS](https://nextjs.org/) v14 + Typescript + Tailwindcss as a frontend framework with [Bazel](https://bazel.build/) v6.
6 +
7 +![Screenshot 0 of Tauri on Bazel with NextJS, TypeScript, and Tailwindcss.](/screenshots/0.png?raw=true "Screenshot 0 of Tauri on Bazel with NextJS, TypeScript, and Tailwindcss.")
8 +![Screenshot 1 of Tauri on Bazel with NextJS, TypeScript, and Tailwindcss.](/screenshots/1.png?raw=true "Screenshot 1 of Tauri on Bazel with NextJS, TypeScript, and Tailwindcss.")
9
10 ## Before running it
11
app/_lib/hooks/use-enter-submit.tsx new
+23
@@ -0,0 +1,23 @@
1 +import { useRef, type RefObject } from 'react'
2 +
3 +export function useEnterSubmit(): {
4 + formRef: RefObject<HTMLFormElement>
5 + onKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void
6 +} {
7 + const formRef = useRef<HTMLFormElement>(null)
8 +
9 + const handleKeyDown = (
10 + event: React.KeyboardEvent<HTMLTextAreaElement>
11 + ): void => {
12 + if (
13 + event.key === 'Enter' &&
14 + !event.shiftKey &&
15 + !event.nativeEvent.isComposing
16 + ) {
17 + formRef.current?.requestSubmit()
18 + event.preventDefault()
19 + }
20 + }
21 +
22 + return { formRef, onKeyDown: handleKeyDown }
23 +}
app/_lib/hooks/use-local-storage.ts new
+24
@@ -0,0 +1,24 @@
1 +import { useEffect, useState } from 'react'
2 +
3 +export const useLocalStorage = <T>(
4 + key: string,
5 + initialValue: T
6 +): [T, (value: T) => void] => {
7 + const [storedValue, setStoredValue] = useState(initialValue)
8 +
9 + useEffect(() => {
10 + // Retrieve from localStorage
11 + const item = window.localStorage.getItem(key)
12 + if (item) {
13 + setStoredValue(JSON.parse(item))
14 + }
15 + }, [key])
16 +
17 + const setValue = (value: T) => {
18 + // Save state
19 + setStoredValue(value)
20 + // Save to localStorage
21 + window.localStorage.setItem(key, JSON.stringify(value))
22 + }
23 + return [storedValue, setValue]
24 +}
app/_lib/menus.ts new
+20
@@ -0,0 +1,20 @@
1 +export type Item = {
2 + name: string;
3 + slug: string;
4 + description?: string;
5 +};
6 +
7 +export const menus: { items: Item[] }[] = [
8 + {
9 + items: [
10 + {
11 + name: 'Play',
12 + slug: 'play',
13 + },
14 + {
15 + name: 'Chat 🤖',
16 + slug: 'chat',
17 + },
18 + ],
19 + },
20 +];
app/_lib/utils.ts new
+43
@@ -0,0 +1,43 @@
1 +import { clsx, type ClassValue } from 'clsx'
2 +import { customAlphabet } from 'nanoid'
3 +import { twMerge } from 'tailwind-merge'
4 +
5 +export function cn(...inputs: ClassValue[]) {
6 + return twMerge(clsx(inputs))
7 +}
8 +
9 +export const nanoid = customAlphabet(
10 + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
11 + 7
12 +) // 7-character random string
13 +
14 +export async function fetcher<JSON = any>(
15 + input: RequestInfo,
16 + init?: RequestInit
17 +): Promise<JSON> {
18 + const res = await fetch(input, init)
19 +
20 + if (!res.ok) {
21 + const json = await res.json()
22 + if (json.error) {
23 + const error = new Error(json.error) as Error & {
24 + status: number
25 + }
26 + error.status = res.status
27 + throw error
28 + } else {
29 + throw new Error('An unexpected error occurred')
30 + }
31 + }
32 +
33 + return res.json()
34 +}
35 +
36 +export function formatDate(input: string | number | Date): string {
37 + const date = new Date(input)
38 + return date.toLocaleDateString('en-US', {
39 + month: 'long',
40 + day: 'numeric',
41 + year: 'numeric'
42 + })
43 +}
app/_ui/address-bar.tsx new
+79
@@ -0,0 +1,79 @@
1 +'use client';
2 +
3 +import React, { Suspense } from 'react';
4 +import { usePathname, useSearchParams } from 'next/navigation';
5 +import { HomeIcon } from '@heroicons/react/solid';
6 +
7 +function Params() {
8 + const searchParams = useSearchParams()!;
9 +
10 + return searchParams.toString().length !== 0 ? (
11 + <div className="px-2 text-gray-500">
12 + <span>?</span>
13 + {Array.from(searchParams.entries()).map(([key, value], index) => {
14 + return (
15 + <React.Fragment key={key}>
16 + {index !== 0 ? <span>&</span> : null}
17 + <span className="px-1">
18 + <span
19 + key={key}
20 + className="animate-[highlight_1s_ease-in-out_1] text-gray-100"
21 + >
22 + {key}
23 + </span>
24 + <span>=</span>
25 + <span
26 + key={value}
27 + className="animate-[highlight_1s_ease-in-out_1] text-gray-100"
28 + >
29 + {value}
30 + </span>
31 + </span>
32 + </React.Fragment>
33 + );
34 + })}
35 + </div>
36 + ) : null;
37 +}
38 +
39 +export function AddressBar() {
40 + const pathname = usePathname();
41 + console.log('pathname', pathname);
42 + return (
43 + <div className="flex items-center gap-x-2 p-3.5 lg:px-5 lg:py-3">
44 + <div className="text-gray-600">
45 + <HomeIcon width={16} />
46 + </div>
47 + <div className="flex gap-x-1 text-sm font-medium">
48 + {pathname ? (
49 + <>
50 + <span className="text-gray-600">/</span>
51 + {pathname
52 + .split('/')
53 + .slice(1)
54 + .map((segment) => {
55 + return (
56 + <React.Fragment key={segment}>
57 + <span>
58 + <span
59 + key={segment}
60 + className="animate-[highlight_1s_ease-in-out_1] rounded-full px-1.5 py-0.5 text-gray-100"
61 + >
62 + {segment}
63 + </span>
64 + </span>
65 +
66 + <span className="text-gray-600">/</span>
67 + </React.Fragment>
68 + );
69 + })}
70 + </>
71 + ) : null}
72 +
73 + <Suspense>
74 + <Params />
75 + </Suspense>
76 + </div>
77 + </div>
78 + );
79 +}
app/_ui/boundary.tsx new
+82
@@ -0,0 +1,82 @@
1 +import clsx from 'clsx';
2 +import React from 'react';
3 +
4 +const Label = ({
5 + children,
6 + animateRerendering,
7 + color,
8 +}: {
9 + children: React.ReactNode;
10 + animateRerendering?: boolean;
11 + color?: 'default' | 'pink' | 'blue' | 'violet' | 'cyan' | 'orange';
12 +}) => {
13 + return (
14 + <div
15 + className={clsx('rounded-full px-1.5 shadow-[0_0_1px_3px_black]', {
16 + 'bg-gray-800 text-gray-300': color === 'default',
17 + 'bg-vercel-pink text-white': color === 'pink',
18 + 'bg-vercel-blue text-white': color === 'blue',
19 + 'bg-vercel-cyan text-white': color === 'cyan',
20 + 'bg-vercel-violet text-violet-100': color === 'violet',
21 + 'bg-vercel-orange text-white': color === 'orange',
22 + 'animate-[highlight_1s_ease-in-out_1]': animateRerendering,
23 + })}
24 + >
25 + {children}
26 + </div>
27 + );
28 +};
29 +export const Boundary = ({
30 + children,
31 + labels = ['children'],
32 + size = 'default',
33 + color = 'default',
34 + animateRerendering = true,
35 +}: {
36 + children: React.ReactNode;
37 + labels?: string[];
38 + size?: 'small' | 'default';
39 + color?: 'default' | 'pink' | 'blue' | 'violet' | 'cyan' | 'orange';
40 + animateRerendering?: boolean;
41 +}) => {
42 + return (
43 + <div
44 + className={clsx('relative rounded-lg border border-dashed', {
45 + 'p-3 lg:p-5': size === 'small',
46 + 'p-4 lg:p-9': size === 'default',
47 + 'border-gray-700': color === 'default',
48 + 'border-vercel-pink': color === 'pink',
49 + 'border-vercel-blue': color === 'blue',
50 + 'border-vercel-cyan': color === 'cyan',
51 + 'border-vercel-violet': color === 'violet',
52 + 'border-vercel-orange': color === 'orange',
53 + 'text-vercel-pink animate-[rerender_1s_ease-in-out_1]':
54 + animateRerendering,
55 + })}
56 + >
57 + <div
58 + className={clsx(
59 + 'absolute -top-2.5 flex gap-x-1 text-[9px] uppercase leading-4 tracking-widest',
60 + {
61 + 'left-3 lg:left-5': size === 'small',
62 + 'left-4 lg:left-9': size === 'default',
63 + },
64 + )}
65 + >
66 + {labels.map((label) => {
67 + return (
68 + <Label
69 + key={label}
70 + color={color}
71 + animateRerendering={animateRerendering}
72 + >
73 + {label}
74 + </Label>
75 + );
76 + })}
77 + </div>
78 +
79 + {children}
80 + </div>
81 + );
82 +};
app/_ui/click-counter.tsx new
+16
@@ -0,0 +1,16 @@
1 +'use client';
2 +
3 +import React from 'react';
4 +
5 +export function ClickCounter() {
6 + const [count, setCount] = React.useState(0);
7 +
8 + return (
9 + <button
10 + onClick={() => setCount(count + 1)}
11 + className="whitespace-nowrap rounded-lg bg-gray-700 px-3 py-1 text-sm font-medium tabular-nums text-gray-100 hover:bg-gray-500 hover:text-white"
12 + >
13 + {count} Clicks
14 + </button>
15 + );
16 +}
app/_ui/components/button.tsx new
+57
@@ -0,0 +1,57 @@
1 +import * as React from 'react'
2 +import { Slot } from '@radix-ui/react-slot'
3 +import { cva, type VariantProps } from 'class-variance-authority'
4 +import { cn } from '@/app/_lib/utils'
5 +
6 +
7 +const buttonVariants = cva(
8 + 'inline-flex items-center justify-center rounded-md text-sm font-medium shadow ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
9 + {
10 + variants: {
11 + variant: {
12 + default:
13 + 'bg-primary text-primary-foreground shadow-md hover:bg-primary/90',
14 + destructive:
15 + 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
16 + outline:
17 + 'border border-input hover:bg-accent hover:text-accent-foreground',
18 + secondary:
19 + 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
20 + ghost: 'shadow-none hover:bg-accent hover:text-accent-foreground',
21 + link: 'text-primary underline-offset-4 shadow-none hover:underline'
22 + },
23 + size: {
24 + default: 'h-8 px-4 py-2',
25 + sm: 'h-8 rounded-md px-3',
26 + lg: 'h-11 rounded-md px-8',
27 + icon: 'size-8 p-0'
28 + }
29 + },
30 + defaultVariants: {
31 + variant: 'default',
32 + size: 'default'
33 + }
34 + }
35 +)
36 +
37 +export interface ButtonProps
38 + extends React.ButtonHTMLAttributes<HTMLButtonElement>,
39 + VariantProps<typeof buttonVariants> {
40 + asChild?: boolean
41 +}
42 +
43 +const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
44 + ({ className, variant, size, asChild = false, ...props }, ref) => {
45 + const Comp = asChild ? Slot : 'button'
46 + return (
47 + <Comp
48 + className={cn(buttonVariants({ variant, size, className }))}
49 + ref={ref}
50 + {...props}
51 + />
52 + )
53 + }
54 +)
55 +Button.displayName = 'Button'
56 +
57 +export { Button, buttonVariants }
app/_ui/components/chat-panel.tsx new
+57
@@ -0,0 +1,57 @@
1 +'use client'
2 +
3 +import * as React from 'react'
4 +import { type UseChatHelpers } from 'ai/react'
5 +
6 +import { PromptForm } from './prompt-form'
7 +
8 +export interface ChatPanelProps
9 + extends Pick<
10 + UseChatHelpers,
11 + | 'append'
12 + | 'isLoading'
13 + | 'reload'
14 + | 'messages'
15 + | 'stop'
16 + | 'input'
17 + | 'setInput'
18 + > {
19 + id?: string
20 + title?: string
21 +}
22 +
23 +export function ChatPanel({
24 + id,
25 + title,
26 + isLoading,
27 + stop,
28 + append,
29 + reload,
30 + input,
31 + setInput,
32 + messages
33 +}: ChatPanelProps) {
34 + const [shareDialogOpen, setShareDialogOpen] = React.useState(false)
35 +
36 + return (
37 + <div className="fixed inset-x-0 bottom-0 w-full bg-gradient-to-b from-muted/30 from-0% to-muted/30 to-50% animate-in duration-300 ease-in-out dark:from-background/10 dark:from-10% dark:to-background/80 peer-[[data-state=open]]:group-[]:lg:pl-[250px] peer-[[data-state=open]]:group-[]:xl:pl-[300px]">
38 + <div className="mx-auto sm:max-w-2xl sm:px-4">
39 + <div className="flex items-center justify-center h-12"></div>
40 + <div className="px-4 py-2 space-y-4 border-t shadow-lg bg-background sm:rounded-t-xl sm:border md:py-4">
41 + <PromptForm
42 + onSubmit={async value => {
43 + await append({
44 + id,
45 + content: value,
46 + role: 'user'
47 + })
48 + }}
49 + input={input}
50 + setInput={setInput}
51 + isLoading={isLoading}
52 + />
53 + </div>
54 + </div>
55 + </div>
56 + )
57 +}
app/_ui/components/empty-screen.tsx new
+56
@@ -0,0 +1,56 @@
1 +import { UseChatHelpers } from 'ai/react'
2 +
3 +import { Button } from './button'
4 +import { ExternalLink } from './external-link'
5 +import { IconArrowRight } from './icons'
6 +
7 +const exampleMessages = [
8 + {
9 + heading: 'Explain technical concepts',
10 + message: `What is a "serverless function"?`
11 + },
12 + {
13 + heading: 'Summarize an article',
14 + message: 'Summarize the following article for a 2nd grader: \n'
15 + },
16 + {
17 + heading: 'Draft an email',
18 + message: `Draft an email to my boss about the following: \n`
19 + }
20 +]
21 +
22 +export function EmptyScreen({ setInput }: Pick<UseChatHelpers, 'setInput'>) {
23 + return (
24 + <div className="mx-auto max-w-2xl px-4">
25 + <div className="rounded-lg border bg-background p-8">
26 + <h1 className="mb-2 text-lg font-semibold">
27 + Welcome to Next.js AI Chatbot!
28 + </h1>
29 + <p className="mb-2 leading-normal text-muted-foreground">
30 + This is an open source AI chatbot app template built with{' '}
31 + <ExternalLink href="https://nextjs.org">Next.js</ExternalLink> and{' '}
32 + <ExternalLink href="https://vercel.com/storage/kv">
33 + Vercel KV
34 + </ExternalLink>
35 + .
36 + </p>
37 + <p className="leading-normal text-muted-foreground">
38 + You can start a conversation here or try the following examples:
39 + </p>
40 + <div className="mt-4 flex flex-col items-start space-y-2">
41 + {exampleMessages.map((message, index) => (
42 + <Button
43 + key={index}
44 + variant="link"
45 + className="h-auto p-0 text-base"
46 + onClick={() => setInput(message.message)}
47 + >
48 + <IconArrowRight className="mr-2 text-muted-foreground" />
49 + {message.heading}
50 + </Button>
51 + ))}
52 + </div>
53 + </div>
54 + </div>
55 + )
56 +}
app/_ui/components/external-link.tsx new
+29
@@ -0,0 +1,29 @@
1 +export function ExternalLink({
2 + href,
3 + children
4 +}: {
5 + href: string
6 + children: React.ReactNode
7 +}) {
8 + return (
9 + <a
10 + href={href}
11 + target="_blank"
12 + className="inline-flex flex-1 justify-center gap-1 leading-4 hover:underline"
13 + >
14 + <span>{children}</span>
15 + <svg
16 + aria-hidden="true"
17 + height="7"
18 + viewBox="0 0 6 6"
19 + width="7"
20 + className="opacity-70"
21 + >
22 + <path
23 + d="M1.25215 5.54731L0.622742 4.9179L3.78169 1.75597H1.3834L1.38936 0.890915H5.27615V4.78069H4.40513L4.41109 2.38538L1.25215 5.54731Z"
24 + fill="currentColor"
25 + ></path>
26 + </svg>
27 + </a>
28 + )
29 +}
app/_ui/components/icons.tsx new
+506
@@ -0,0 +1,506 @@
1 +'use client'
2 +
3 +import { cn } from '@/app/_lib/utils'
4 +import * as React from 'react'
5 +
6 +function IconNextChat({
7 + className,
8 + inverted,
9 + ...props
10 +}: React.ComponentProps<'svg'> & { inverted?: boolean }) {
11 + const id = React.useId()
12 +
13 + return (
14 + <svg
15 + viewBox="0 0 17 17"
16 + fill="none"
17 + xmlns="http://www.w3.org/2000/svg"
18 + className={cn('size-4', className)}
19 + {...props}
20 + >
21 + <defs>
22 + <linearGradient
23 + id={`gradient-${id}-1`}
24 + x1="10.6889"
25 + y1="10.3556"
26 + x2="13.8445"
27 + y2="14.2667"
28 + gradientUnits="userSpaceOnUse"
29 + >
30 + <stop stopColor={inverted ? 'white' : 'black'} />
31 + <stop
32 + offset={1}
33 + stopColor={inverted ? 'white' : 'black'}
34 + stopOpacity={0}
35 + />
36 + </linearGradient>
37 + <linearGradient
38 + id={`gradient-${id}-2`}
39 + x1="11.7555"
40 + y1="4.8"
41 + x2="11.7376"
42 + y2="9.50002"
43 + gradientUnits="userSpaceOnUse"
44 + >
45 + <stop stopColor={inverted ? 'white' : 'black'} />
46 + <stop
47 + offset={1}
48 + stopColor={inverted ? 'white' : 'black'}
49 + stopOpacity={0}
50 + />
51 + </linearGradient>
52 + </defs>
53 + <path
54 + d="M1 16L2.58314 11.2506C1.83084 9.74642 1.63835 8.02363 2.04013 6.39052C2.4419 4.75741 3.41171 3.32057 4.776 2.33712C6.1403 1.35367 7.81003 0.887808 9.4864 1.02289C11.1628 1.15798 12.7364 1.8852 13.9256 3.07442C15.1148 4.26363 15.842 5.83723 15.9771 7.5136C16.1122 9.18997 15.6463 10.8597 14.6629 12.224C13.6794 13.5883 12.2426 14.5581 10.6095 14.9599C8.97637 15.3616 7.25358 15.1692 5.74942 14.4169L1 16Z"
55 + fill={inverted ? 'black' : 'white'}
56 + stroke={inverted ? 'black' : 'white'}
57 + strokeWidth={2}
58 + strokeLinecap="round"
59 + strokeLinejoin="round"
60 + />
61 + <mask
62 + id="mask0_91_2047"
63 + style={{ maskType: 'alpha' }}
64 + maskUnits="userSpaceOnUse"
65 + x={1}
66 + y={0}
67 + width={16}
68 + height={16}
69 + >
70 + <circle cx={9} cy={8} r={8} fill={inverted ? 'black' : 'white'} />
71 + </mask>
72 + <g mask="url(#mask0_91_2047)">
73 + <circle cx={9} cy={8} r={8} fill={inverted ? 'black' : 'white'} />
74 + <path
75 + d="M14.2896 14.0018L7.146 4.8H5.80005V11.1973H6.87681V6.16743L13.4444 14.6529C13.7407 14.4545 14.0231 14.2369 14.2896 14.0018Z"
76 + fill={`url(#gradient-${id}-1)`}
77 + />
78 + <rect
79 + x="11.2222"
80 + y="4.8"
81 + width="1.06667"
82 + height="6.4"
83 + fill={`url(#gradient-${id}-2)`}
84 + />
85 + </g>
86 + </svg>
87 + )
88 +}
89 +
90 +function IconOpenAI({ className, ...props }: React.ComponentProps<'svg'>) {
91 + return (
92 + <svg
93 + fill="currentColor"
94 + viewBox="0 0 24 24"
95 + role="img"
96 + xmlns="http://www.w3.org/2000/svg"
97 + className={cn('size-4', className)}
98 + {...props}
99 + >
100 + <title>OpenAI icon</title>
101 + <path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z" />
102 + </svg>
103 + )
104 +}
105 +
106 +function IconVercel({ className, ...props }: React.ComponentProps<'svg'>) {
107 + return (
108 + <svg
109 + aria-label="Vercel logomark"
110 + role="img"
111 + viewBox="0 0 74 64"
112 + className={cn('size-4', className)}
113 + {...props}
114 + >
115 + <path
116 + d="M37.5896 0.25L74.5396 64.25H0.639648L37.5896 0.25Z"
117 + fill="currentColor"
118 + ></path>
119 + </svg>
120 + )
121 +}
122 +
123 +function IconGitHub({ className, ...props }: React.ComponentProps<'svg'>) {
124 + return (
125 + <svg
126 + role="img"
127 + viewBox="0 0 24 24"
128 + xmlns="http://www.w3.org/2000/svg"
129 + fill="currentColor"
130 + className={cn('size-4', className)}
131 + {...props}
132 + >
133 + <title>GitHub</title>
134 + <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
135 + </svg>
136 + )
137 +}
138 +
139 +function IconSeparator({ className, ...props }: React.ComponentProps<'svg'>) {
140 + return (
141 + <svg
142 + fill="none"
143 + shapeRendering="geometricPrecision"
144 + stroke="currentColor"
145 + strokeLinecap="round"
146 + strokeLinejoin="round"
147 + strokeWidth="1"
148 + viewBox="0 0 24 24"
149 + aria-hidden="true"
150 + className={cn('size-4', className)}
151 + {...props}
152 + >
153 + <path d="M16.88 3.549L7.12 20.451"></path>
154 + </svg>
155 + )
156 +}
157 +
158 +function IconArrowDown({ className, ...props }: React.ComponentProps<'svg'>) {
159 + return (
160 + <svg
161 + xmlns="http://www.w3.org/2000/svg"
162 + viewBox="0 0 256 256"
163 + fill="currentColor"
164 + className={cn('size-4', className)}
165 + {...props}
166 + >
167 + <path d="m205.66 149.66-72 72a8 8 0 0 1-11.32 0l-72-72a8 8 0 0 1 11.32-11.32L120 196.69V40a8 8 0 0 1 16 0v156.69l58.34-58.35a8 8 0 0 1 11.32 11.32Z" />
168 + </svg>
169 + )
170 +}
171 +
172 +function IconArrowRight({ className, ...props }: React.ComponentProps<'svg'>) {
173 + return (
174 + <svg
175 + xmlns="http://www.w3.org/2000/svg"
176 + viewBox="0 0 256 256"
177 + fill="currentColor"
178 + className={cn('size-4', className)}
179 + {...props}
180 + >
181 + <path d="m221.66 133.66-72 72a8 8 0 0 1-11.32-11.32L196.69 136H40a8 8 0 0 1 0-16h156.69l-58.35-58.34a8 8 0 0 1 11.32-11.32l72 72a8 8 0 0 1 0 11.32Z" />
182 + </svg>
183 + )
184 +}
185 +
186 +function IconUser({ className, ...props }: React.ComponentProps<'svg'>) {
187 + return (
188 + <svg
189 + xmlns="http://www.w3.org/2000/svg"
190 + viewBox="0 0 256 256"
191 + fill="currentColor"
192 + className={cn('size-4', className)}
193 + {...props}
194 + >
195 + <path d="M230.92 212c-15.23-26.33-38.7-45.21-66.09-54.16a72 72 0 1 0-73.66 0c-27.39 8.94-50.86 27.82-66.09 54.16a8 8 0 1 0 13.85 8c18.84-32.56 52.14-52 89.07-52s70.23 19.44 89.07 52a8 8 0 1 0 13.85-8ZM72 96a56 56 0 1 1 56 56 56.06 56.06 0 0 1-56-56Z" />
196 + </svg>
197 + )
198 +}
199 +
200 +function IconPlus({ className, ...props }: React.ComponentProps<'svg'>) {
201 + return (
202 + <svg
203 + xmlns="http://www.w3.org/2000/svg"
204 + viewBox="0 0 256 256"
205 + fill="currentColor"
206 + className={cn('size-4', className)}
207 + {...props}
208 + >
209 + <path d="M224 128a8 8 0 0 1-8 8h-80v80a8 8 0 0 1-16 0v-80H40a8 8 0 0 1 0-16h80V40a8 8 0 0 1 16 0v80h80a8 8 0 0 1 8 8Z" />
210 + </svg>
211 + )
212 +}
213 +
214 +function IconArrowElbow({ className, ...props }: React.ComponentProps<'svg'>) {
215 + return (
216 + <svg
217 + xmlns="http://www.w3.org/2000/svg"
218 + viewBox="0 0 256 256"
219 + fill="currentColor"
220 + className={cn('size-4', className)}
221 + {...props}
222 + >
223 + <path d="M200 32v144a8 8 0 0 1-8 8H67.31l34.35 34.34a8 8 0 0 1-11.32 11.32l-48-48a8 8 0 0 1 0-11.32l48-48a8 8 0 0 1 11.32 11.32L67.31 168H184V32a8 8 0 0 1 16 0Z" />
224 + </svg>
225 + )
226 +}
227 +
228 +function IconSpinner({ className, ...props }: React.ComponentProps<'svg'>) {
229 + return (
230 + <svg
231 + xmlns="http://www.w3.org/2000/svg"
232 + viewBox="0 0 256 256"
233 + fill="currentColor"
234 + className={cn('size-4 animate-spin', className)}
235 + {...props}
236 + >
237 + <path d="M232 128a104 104 0 0 1-208 0c0-41 23.81-78.36 60.66-95.27a8 8 0 0 1 6.68 14.54C60.15 61.59 40 93.27 40 128a88 88 0 0 0 176 0c0-34.73-20.15-66.41-51.34-80.73a8 8 0 0 1 6.68-14.54C208.19 49.64 232 87 232 128Z" />
238 + </svg>
239 + )
240 +}
241 +
242 +function IconMessage({ className, ...props }: React.ComponentProps<'svg'>) {
243 + return (
244 + <svg
245 + xmlns="http://www.w3.org/2000/svg"
246 + viewBox="0 0 256 256"
247 + fill="currentColor"
248 + className={cn('size-4', className)}
249 + {...props}
250 + >
251 + <path d="M216 48H40a16 16 0 0 0-16 16v160a15.84 15.84 0 0 0 9.25 14.5A16.05 16.05 0 0 0 40 240a15.89 15.89 0 0 0 10.25-3.78.69.69 0 0 0 .13-.11L82.5 208H216a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16ZM40 224Zm176-32H82.5a16 16 0 0 0-10.3 3.75l-.12.11L40 224V64h176Z" />
252 + </svg>
253 + )
254 +}
255 +
256 +function IconTrash({ className, ...props }: React.ComponentProps<'svg'>) {
257 + return (
258 + <svg
259 + xmlns="http://www.w3.org/2000/svg"
260 + viewBox="0 0 256 256"
261 + fill="currentColor"
262 + className={cn('size-4', className)}
263 + {...props}
264 + >
265 + <path d="M216 48h-40v-8a24 24 0 0 0-24-24h-48a24 24 0 0 0-24 24v8H40a8 8 0 0 0 0 16h8v144a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16V64h8a8 8 0 0 0 0-16ZM96 40a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8v8H96Zm96 168H64V64h128Zm-80-104v64a8 8 0 0 1-16 0v-64a8 8 0 0 1 16 0Zm48 0v64a8 8 0 0 1-16 0v-64a8 8 0 0 1 16 0Z" />
266 + </svg>
267 + )
268 +}
269 +
270 +function IconRefresh({ className, ...props }: React.ComponentProps<'svg'>) {
271 + return (
272 + <svg
273 + xmlns="http://www.w3.org/2000/svg"
274 + viewBox="0 0 256 256"
275 + fill="currentColor"
276 + className={cn('size-4', className)}
277 + {...props}
278 + >
279 + <path d="M197.67 186.37a8 8 0 0 1 0 11.29C196.58 198.73 170.82 224 128 224c-37.39 0-64.53-22.4-80-39.85V208a8 8 0 0 1-16 0v-48a8 8 0 0 1 8-8h48a8 8 0 0 1 0 16H55.44C67.76 183.35 93 208 128 208c36 0 58.14-21.46 58.36-21.68a8 8 0 0 1 11.31.05ZM216 40a8 8 0 0 0-8 8v23.85C192.53 54.4 165.39 32 128 32c-42.82 0-68.58 25.27-69.66 26.34a8 8 0 0 0 11.3 11.34C69.86 69.46 92 48 128 48c35 0 60.24 24.65 72.56 40H168a8 8 0 0 0 0 16h48a8 8 0 0 0 8-8V48a8 8 0 0 0-8-8Z" />
280 + </svg>
281 + )
282 +}
283 +
284 +function IconStop({ className, ...props }: React.ComponentProps<'svg'>) {
285 + return (
286 + <svg
287 + xmlns="http://www.w3.org/2000/svg"
288 + viewBox="0 0 256 256"
289 + fill="currentColor"
290 + className={cn('size-4', className)}
291 + {...props}
292 + >
293 + <path d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24Zm0 192a88 88 0 1 1 88-88 88.1 88.1 0 0 1-88 88Zm24-120h-48a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h48a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8Zm-8 48h-32v-32h32Z" />
294 + </svg>
295 + )
296 +}
297 +
298 +function IconSidebar({ className, ...props }: React.ComponentProps<'svg'>) {
299 + return (
300 + <svg
301 + xmlns="http://www.w3.org/2000/svg"
302 + viewBox="0 0 256 256"
303 + fill="currentColor"
304 + className={cn('size-4', className)}
305 + {...props}
306 + >
307 + <path d="M216 40H40a16 16 0 0 0-16 16v144a16 16 0 0 0 16 16h176a16 16 0 0 0 16-16V56a16 16 0 0 0-16-16ZM40 56h40v144H40Zm176 144H96V56h120v144Z" />
308 + </svg>
309 + )
310 +}
311 +
312 +function IconMoon({ className, ...props }: React.ComponentProps<'svg'>) {
313 + return (
314 + <svg
315 + xmlns="http://www.w3.org/2000/svg"
316 + viewBox="0 0 256 256"
317 + fill="currentColor"
318 + className={cn('size-4', className)}
319 + {...props}
320 + >
321 + <path d="M233.54 142.23a8 8 0 0 0-8-2 88.08 88.08 0 0 1-109.8-109.8 8 8 0 0 0-10-10 104.84 104.84 0 0 0-52.91 37A104 104 0 0 0 136 224a103.09 103.09 0 0 0 62.52-20.88 104.84 104.84 0 0 0 37-52.91 8 8 0 0 0-1.98-7.98Zm-44.64 48.11A88 88 0 0 1 65.66 67.11a89 89 0 0 1 31.4-26A106 106 0 0 0 96 56a104.11 104.11 0 0 0 104 104 106 106 0 0 0 14.92-1.06 89 89 0 0 1-26.02 31.4Z" />
322 + </svg>
323 + )
324 +}
325 +
326 +function IconSun({ className, ...props }: React.ComponentProps<'svg'>) {
327 + return (
328 + <svg
329 + xmlns="http://www.w3.org/2000/svg"
330 + viewBox="0 0 256 256"
331 + fill="currentColor"
332 + className={cn('size-4', className)}
333 + {...props}
334 + >
335 + <path d="M120 40V16a8 8 0 0 1 16 0v24a8 8 0 0 1-16 0Zm72 88a64 64 0 1 1-64-64 64.07 64.07 0 0 1 64 64Zm-16 0a48 48 0 1 0-48 48 48.05 48.05 0 0 0 48-48ZM58.34 69.66a8 8 0 0 0 11.32-11.32l-16-16a8 8 0 0 0-11.32 11.32Zm0 116.68-16 16a8 8 0 0 0 11.32 11.32l16-16a8 8 0 0 0-11.32-11.32ZM192 72a8 8 0 0 0 5.66-2.34l16-16a8 8 0 0 0-11.32-11.32l-16 16A8 8 0 0 0 192 72Zm5.66 114.34a8 8 0 0 0-11.32 11.32l16 16a8 8 0 0 0 11.32-11.32ZM48 128a8 8 0 0 0-8-8H16a8 8 0 0 0 0 16h24a8 8 0 0 0 8-8Zm80 80a8 8 0 0 0-8 8v24a8 8 0 0 0 16 0v-24a8 8 0 0 0-8-8Zm112-88h-24a8 8 0 0 0 0 16h24a8 8 0 0 0 0-16Z" />
336 + </svg>
337 + )
338 +}
339 +
340 +function IconCopy({ className, ...props }: React.ComponentProps<'svg'>) {
341 + return (
342 + <svg
343 + xmlns="http://www.w3.org/2000/svg"
344 + viewBox="0 0 256 256"
345 + fill="currentColor"
346 + className={cn('size-4', className)}
347 + {...props}
348 + >
349 + <path d="M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8Zm-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z" />
350 + </svg>
351 + )
352 +}
353 +
354 +function IconCheck({ className, ...props }: React.ComponentProps<'svg'>) {
355 + return (
356 + <svg
357 + xmlns="http://www.w3.org/2000/svg"
358 + viewBox="0 0 256 256"
359 + fill="currentColor"
360 + className={cn('size-4', className)}
361 + {...props}
362 + >
363 + <path d="m229.66 77.66-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69 218.34 66.34a8 8 0 0 1 11.32 11.32Z" />
364 + </svg>
365 + )
366 +}
367 +
368 +function IconDownload({ className, ...props }: React.ComponentProps<'svg'>) {
369 + return (
370 + <svg
371 + xmlns="http://www.w3.org/2000/svg"
372 + viewBox="0 0 256 256"
373 + fill="currentColor"
374 + className={cn('size-4', className)}
375 + {...props}
376 + >
377 + <path d="M224 152v56a16 16 0 0 1-16 16H48a16 16 0 0 1-16-16v-56a8 8 0 0 1 16 0v56h160v-56a8 8 0 0 1 16 0Zm-101.66 5.66a8 8 0 0 0 11.32 0l40-40a8 8 0 0 0-11.32-11.32L136 132.69V40a8 8 0 0 0-16 0v92.69l-26.34-26.35a8 8 0 0 0-11.32 11.32Z" />
378 + </svg>
379 + )
380 +}
381 +
382 +function IconClose({ className, ...props }: React.ComponentProps<'svg'>) {
383 + return (
384 + <svg
385 + xmlns="http://www.w3.org/2000/svg"
386 + viewBox="0 0 256 256"
387 + fill="currentColor"
388 + className={cn('size-4', className)}
389 + {...props}
390 + >
391 + <path d="M205.66 194.34a8 8 0 0 1-11.32 11.32L128 139.31l-66.34 66.35a8 8 0 0 1-11.32-11.32L116.69 128 50.34 61.66a8 8 0 0 1 11.32-11.32L128 116.69l66.34-66.35a8 8 0 0 1 11.32 11.32L139.31 128Z" />
392 + </svg>
393 + )
394 +}
395 +
396 +function IconEdit({ className, ...props }: React.ComponentProps<'svg'>) {
397 + return (
398 + <svg
399 + xmlns="http://www.w3.org/2000/svg"
400 + fill="none"
401 + viewBox="0 0 24 24"
402 + strokeWidth={1.5}
403 + stroke="currentColor"
404 + className={cn('size-4', className)}
405 + {...props}
406 + >
407 + <path
408 + strokeLinecap="round"
409 + strokeLinejoin="round"
410 + d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10"
411 + />
412 + </svg>
413 + )
414 +}
415 +
416 +function IconShare({ className, ...props }: React.ComponentProps<'svg'>) {
417 + return (
418 + <svg
419 + xmlns="http://www.w3.org/2000/svg"
420 + fill="currentColor"
421 + className={cn('size-4', className)}
422 + viewBox="0 0 256 256"
423 + {...props}
424 + >
425 + <path d="m237.66 106.35-80-80A8 8 0 0 0 144 32v40.35c-25.94 2.22-54.59 14.92-78.16 34.91-28.38 24.08-46.05 55.11-49.76 87.37a12 12 0 0 0 20.68 9.58c11-11.71 50.14-48.74 107.24-52V192a8 8 0 0 0 13.66 5.65l80-80a8 8 0 0 0 0-11.3ZM160 172.69V144a8 8 0 0 0-8-8c-28.08 0-55.43 7.33-81.29 21.8a196.17 196.17 0 0 0-36.57 26.52c5.8-23.84 20.42-46.51 42.05-64.86C99.41 99.77 127.75 88 152 88a8 8 0 0 0 8-8V51.32L220.69 112Z" />
426 + </svg>
427 + )
428 +}
429 +
430 +function IconUsers({ className, ...props }: React.ComponentProps<'svg'>) {
431 + return (
432 + <svg
433 + xmlns="http://www.w3.org/2000/svg"
434 + fill="currentColor"
435 + className={cn('size-4', className)}
436 + viewBox="0 0 256 256"
437 + {...props}
438 + >
439 + <path d="M117.25 157.92a60 60 0 1 0-66.5 0 95.83 95.83 0 0 0-47.22 37.71 8 8 0 1 0 13.4 8.74 80 80 0 0 1 134.14 0 8 8 0 0 0 13.4-8.74 95.83 95.83 0 0 0-47.22-37.71ZM40 108a44 44 0 1 1 44 44 44.05 44.05 0 0 1-44-44Zm210.14 98.7a8 8 0 0 1-11.07-2.33A79.83 79.83 0 0 0 172 168a8 8 0 0 1 0-16 44 44 0 1 0-16.34-84.87 8 8 0 1 1-5.94-14.85 60 60 0 0 1 55.53 105.64 95.83 95.83 0 0 1 47.22 37.71 8 8 0 0 1-2.33 11.07Z" />
440 + </svg>
441 + )
442 +}
443 +
444 +function IconExternalLink({
445 + className,
446 + ...props
447 +}: React.ComponentProps<'svg'>) {
448 + return (
449 + <svg
450 + xmlns="http://www.w3.org/2000/svg"
451 + fill="currentColor"
452 + className={cn('size-4', className)}
453 + viewBox="0 0 256 256"
454 + {...props}
455 + >
456 + <path d="M224 104a8 8 0 0 1-16 0V59.32l-66.33 66.34a8 8 0 0 1-11.32-11.32L196.68 48H152a8 8 0 0 1 0-16h64a8 8 0 0 1 8 8Zm-40 24a8 8 0 0 0-8 8v72H48V80h72a8 8 0 0 0 0-16H48a16 16 0 0 0-16 16v128a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-72a8 8 0 0 0-8-8Z" />
457 + </svg>
458 + )
459 +}
460 +
461 +function IconChevronUpDown({
462 + className,
463 + ...props
464 +}: React.ComponentProps<'svg'>) {
465 + return (
466 + <svg
467 + xmlns="http://www.w3.org/2000/svg"
468 + fill="currentColor"
469 + className={cn('size-4', className)}
470 + viewBox="0 0 256 256"
471 + {...props}
472 + >
473 + <path d="M181.66 170.34a8 8 0 0 1 0 11.32l-48 48a8 8 0 0 1-11.32 0l-48-48a8 8 0 0 1 11.32-11.32L128 212.69l42.34-42.35a8 8 0 0 1 11.32 0Zm-96-84.68L128 43.31l42.34 42.35a8 8 0 0 0 11.32-11.32l-48-48a8 8 0 0 0-11.32 0l-48 48a8 8 0 0 0 11.32 11.32Z" />
474 + </svg>
475 + )
476 +}
477 +
478 +export {
479 + IconEdit,
480 + IconNextChat,
481 + IconOpenAI,
482 + IconVercel,
483 + IconGitHub,
484 + IconSeparator,
485 + IconArrowDown,
486 + IconArrowRight,
487 + IconUser,
488 + IconPlus,
489 + IconArrowElbow,
490 + IconSpinner,
491 + IconMessage,
492 + IconTrash,
493 + IconRefresh,
494 + IconStop,
495 + IconSidebar,
496 + IconMoon,
497 + IconSun,
498 + IconCopy,
499 + IconCheck,
500 + IconDownload,
501 + IconClose,
502 + IconShare,
503 + IconUsers,
504 + IconExternalLink,
505 + IconChevronUpDown
506 +}
app/_ui/components/prompt-form.tsx new
+97
@@ -0,0 +1,97 @@
1 +'use client';
2 +
3 +import * as React from 'react'
4 +import Textarea from 'react-textarea-autosize'
5 +import { UseChatHelpers } from 'ai/react'
6 +import {
7 + Tooltip,
8 + TooltipContent,
9 + TooltipTrigger
10 +} from './tooltip'
11 +import { IconArrowElbow, IconPlus } from './icons'
12 +import { useRouter } from 'next/navigation'
13 +import { Button, buttonVariants } from './button';
14 +
15 +export interface PromptProps
16 + extends Pick<UseChatHelpers, 'input' | 'setInput'> {
17 + onSubmit: (value: string) => void
18 + isLoading: boolean
19 +}
20 +
21 +export function PromptForm({
22 + onSubmit,
23 + input,
24 + setInput,
25 + isLoading
26 +}: PromptProps) {
27 + const { formRef, onKeyDown } = useEnterSubmit()
28 + const inputRef = React.useRef<HTMLTextAreaElement>(null)
29 + const router = useRouter()
30 + React.useEffect(() => {
31 + if (inputRef.current) {
32 + inputRef.current.focus()
33 + }
34 + }, [])
35 +
36 + return (
37 + <form
38 + onSubmit={async e => {
39 + e.preventDefault()
40 + if (!input?.trim()) {
41 + return
42 + }
43 + setInput('')
44 + await onSubmit(input)
45 + }}
46 + ref={formRef}
47 + >
48 + <div className="relative flex flex-col w-full px-8 overflow-hidden max-h-60 grow bg-background sm:rounded-md sm:border sm:px-12">
49 + <Tooltip>
50 + <TooltipTrigger asChild>
51 + <button
52 + onClick={e => {
53 + e.preventDefault()
54 + router.refresh()
55 + router.push('/')
56 + }}
57 + className={cn(
58 + buttonVariants({ size: 'sm', variant: 'outline' }),
59 + 'absolute left-0 top-4 size-8 rounded-full bg-background p-0 sm:left-4'
60 + )}
61 + >
62 + <IconPlus />
63 + <span className="sr-only">New Chat</span>
64 + </button>
65 + </TooltipTrigger>
66 + <TooltipContent>New Chat</TooltipContent>
67 + </Tooltip>
68 + <Textarea
69 + ref={inputRef}
70 + tabIndex={0}
71 + onKeyDown={onKeyDown}
72 + rows={1}
73 + value={input}
74 + onChange={e => setInput(e.target.value)}
75 + placeholder="Send a message."
76 + spellCheck={false}
77 + className="min-h-[60px] w-full resize-none bg-transparent px-4 py-[1.3rem] focus-within:outline-none sm:text-sm"
78 + />
79 + <div className="absolute right-0 top-4 sm:right-4">
80 + <Tooltip>
81 + <TooltipTrigger asChild>
82 + <Button
83 + type="submit"
84 + size="icon"
85 + disabled={isLoading || input === ''}
86 + >
87 + <IconArrowElbow />
88 + <span className="sr-only">Send message</span>
89 + </Button>
90 + </TooltipTrigger>
91 + <TooltipContent>Send message</TooltipContent>
92 + </Tooltip>
93 + </div>
94 + </div>
95 + </form>
96 + )
97 +}
app/_ui/components/tooltip.tsx new
+29
@@ -0,0 +1,29 @@
1 +'use client'
2 +
3 +import * as React from 'react'
4 +import * as TooltipPrimitive from '@radix-ui/react-tooltip'
5 +import { cn } from '@/app/_lib/utils'
6 +
7 +const TooltipProvider = TooltipPrimitive.Provider
8 +
9 +const Tooltip = TooltipPrimitive.Root
10 +
11 +const TooltipTrigger = TooltipPrimitive.Trigger
12 +
13 +const TooltipContent = React.forwardRef<
14 + React.ElementRef<typeof TooltipPrimitive.Content>,
15 + React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
16 +>(({ className, sideOffset = 4, ...props }, ref) => (
17 + <TooltipPrimitive.Content
18 + ref={ref}
19 + sideOffset={sideOffset}
20 + className={cn(
21 + 'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs font-medium text-popover-foreground shadow-md animate-in fade-in-50 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1',
22 + className
23 + )}
24 + {...props}
25 + />
26 +))
27 +TooltipContent.displayName = TooltipPrimitive.Content.displayName
28 +
29 +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
app/_ui/external-link.tsx new
+20
@@ -0,0 +1,20 @@
1 +import { ArrowRightIcon } from '@heroicons/react/outline';
2 +
3 +export const ExternalLink = ({
4 + children,
5 + href,
6 +}: {
7 + children: React.ReactNode;
8 + href: string;
9 +}) => {
10 + return (
11 + <a
12 + href={href}
13 + className="inline-flex gap-x-2 rounded-lg bg-gray-700 px-3 py-1 text-sm font-medium text-gray-100 no-underline hover:bg-gray-500 hover:text-white"
14 + >
15 + <div>{children}</div>
16 +
17 + <ArrowRightIcon className="block w-4" />
18 + </a>
19 + );
20 +};
app/_ui/global-nav.tsx new
+97
@@ -0,0 +1,97 @@
1 +'use client';
2 +
3 +import { menus, type Item } from '../_lib/menus';
4 +import Link from 'next/link';
5 +import { useSelectedLayoutSegment } from 'next/navigation';
6 +import { MenuAlt2Icon, XIcon } from '@heroicons/react/solid';
7 +import clsx from 'clsx';
8 +import { useState } from 'react';
9 +import Image from 'next/image';
10 +
11 +export function GlobalNav() {
12 + const [isOpen, setIsOpen] = useState(false);
13 + const close = () => setIsOpen(false);
14 +
15 + return (
16 + <div className="fixed top-0 z-10 flex w-full flex-col border-b border-gray-800 bg-black lg:bottom-0 lg:z-auto lg:w-72 lg:border-b-0 lg:border-r lg:border-gray-800">
17 + <div className="flex h-14 items-center px-4 py-4 lg:h-auto">
18 + <Link
19 + href="/"
20 + className="group flex w-full items-center gap-x-2.5"
21 + onClick={close}
22 + >
23 + <div className="h-7 w-7 rounded-sm border border-white/30 group-hover:border-white/50">
24 + <Image src="/logo192.png" alt="Tauri on Bazel" width={40} height={40} />
25 + </div>
26 +
27 + <h3 className="font-semibold tracking-wide text-gray-400 group-hover:text-gray-50">
28 + Tauri on Bazel
29 + </h3>
30 + </Link>
31 + </div>
32 + <button
33 + type="button"
34 + className="group absolute right-0 top-0 flex h-14 items-center gap-x-2 px-4 lg:hidden"
35 + onClick={() => setIsOpen(!isOpen)}
36 + >
37 + <div className="font-medium text-gray-100 group-hover:text-gray-400">
38 + Menu
39 + </div>
40 + {isOpen ? (
41 + <XIcon className="block w-6 text-gray-400" />
42 + ) : (
43 + <MenuAlt2Icon className="block w-6 text-gray-400" />
44 + )}
45 + </button>
46 +
47 + <div
48 + className={clsx('overflow-y-auto lg:static lg:block', {
49 + 'fixed inset-x-0 bottom-0 top-14 mt-px bg-black': isOpen,
50 + hidden: !isOpen,
51 + })}
52 + >
53 + <nav className="space-y-6 px-2 pb-24 pt-5">
54 + {menus.map((section, index) => {
55 + return (
56 + <div key={index}>
57 +
58 + <div className="space-y-1">
59 + {section.items.map((item) => (
60 + <GlobalNavItem key={item.slug} item={item} close={close} />
61 + ))}
62 + </div>
63 + </div>
64 + );
65 + })}
66 + </nav>
67 + </div>
68 + </div>
69 + );
70 +}
71 +
72 +function GlobalNavItem({
73 + item,
74 + close,
75 +}: {
76 + item: Item;
77 + close: () => false | void;
78 +}) {
79 + const segment = useSelectedLayoutSegment();
80 + const isActive = item.slug === segment;
81 +
82 + return (
83 + <Link
84 + onClick={close}
85 + href={`/${item.slug}`}
86 + className={clsx(
87 + 'block rounded-md px-3 py-2 text-sm font-medium hover:text-gray-300',
88 + {
89 + 'text-gray-400 hover:bg-gray-800': !isActive,
90 + 'text-white': isActive,
91 + },
92 + )}
93 + >
94 + {item.name}
95 + </Link>
96 + );
97 +}
app/_ui/skeleton-card.tsx new
+16
@@ -0,0 +1,16 @@
1 +import clsx from 'clsx';
2 +
3 +export const SkeletonCard = ({ isLoading }: { isLoading?: boolean }) => (
4 + <div
5 + className={clsx('rounded-2xl bg-gray-900/80 p-4', {
6 + 'relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent':
7 + isLoading,
8 + })}
9 + >
10 + <div className="space-y-3">
11 + <div className="h-14 rounded-lg bg-gray-700" />
12 + <div className="h-3 w-11/12 rounded-lg bg-gray-700" />
13 + <div className="h-3 w-8/12 rounded-lg bg-gray-700" />
14 + </div>
15 + </div>
16 +);
app/_ui/tab-group.tsx new
+31
@@ -0,0 +1,31 @@
1 +import { Tab } from "./tab";
2 +
3 +export type Item = {
4 + text: string;
5 + slug?: string;
6 + segment?: string;
7 + parallelRoutesKey?: string;
8 +};
9 +
10 +export const TabGroup = ({
11 + path,
12 + parallelRoutesKey,
13 + items,
14 +}: {
15 + path: string;
16 + parallelRoutesKey?: string;
17 + items: Item[];
18 +}) => {
19 + return (
20 + <div className="flex flex-wrap items-center gap-2">
21 + {items.map((item) => (
22 + <Tab
23 + key={path + item.slug}
24 + item={item}
25 + path={path}
26 + parallelRoutesKey={parallelRoutesKey}
27 + />
28 + ))}
29 + </div>
30 + );
31 +};
app/_ui/tab-nav-item.tsx new
+25
@@ -0,0 +1,25 @@
1 +import clsx from 'clsx';
2 +import Link from 'next/link';
3 +
4 +export const TabNavItem = ({
5 + children,
6 + href,
7 + isActive,
8 +}: {
9 + children: React.ReactNode;
10 + href: string;
11 + isActive?: boolean;
12 +}) => {
13 + return (
14 + <Link
15 + href={href}
16 + className={clsx('rounded-lg px-3 py-1 text-sm font-medium', {
17 + 'bg-gray-700 text-gray-100 hover:bg-gray-500 hover:text-white':
18 + !isActive,
19 + 'bg-vercel-blue text-white': isActive,
20 + })}
21 + >
22 + {children}
23 + </Link>
24 + );
25 +};
app/_ui/tab.tsx new
+39
@@ -0,0 +1,39 @@
1 +'use client';
2 +
3 +import type { Item } from '#/ui/tab-group';
4 +import clsx from 'clsx';
5 +import Link from 'next/link';
6 +import { useSelectedLayoutSegment } from 'next/navigation';
7 +
8 +export const Tab = ({
9 + path,
10 + parallelRoutesKey,
11 + item,
12 +}: {
13 + path: string;
14 + parallelRoutesKey?: string;
15 + item: Item;
16 +}) => {
17 + const segment = useSelectedLayoutSegment(parallelRoutesKey);
18 +
19 + const href = item.slug ? path + '/' + item.slug : path;
20 + const isActive =
21 + // Example home pages e.g. `/layouts`
22 + (!item.slug && segment === null) ||
23 + segment === item.segment ||
24 + // Nested pages e.g. `/layouts/electronics`
25 + segment === item.slug;
26 +
27 + return (
28 + <Link
29 + href={href}
30 + className={clsx('rounded-lg px-3 py-1 text-sm font-medium', {
31 + 'bg-gray-700 text-gray-100 hover:bg-gray-500 hover:text-white':
32 + !isActive,
33 + 'bg-vercel-blue text-white': isActive,
34 + })}
35 + >
36 + {item.text}
37 + </Link>
38 + );
39 +};
app/api/categories/category.d.ts new
+6
@@ -0,0 +1,6 @@
1 +export type Category = {
2 + name: string;
3 + slug: string;
4 + count: number;
5 + parent: string | null;
6 +};
app/api/categories/getCategories.ts new
+52
@@ -0,0 +1,52 @@
1 +import { notFound } from 'next/navigation';
2 +import type { Category } from './category';
3 +
4 +// `server-only` guarantees any modules that import code in file
5 +// will never run on the client. Even though this particular api
6 +// doesn't currently use sensitive environment variables, it's
7 +// good practise to add `server-only` preemptively.
8 +import 'server-only';
9 +
10 +export async function getCategories({ parent }: { parent?: string } = {}) {
11 + const res = await fetch(
12 + `https://app-router-api.vercel.app/api/categories${
13 + parent ? `?parent=${parent}` : ''
14 + }`,
15 + );
16 +
17 + if (!res.ok) {
18 + // Render the closest `error.js` Error Boundary
19 + throw new Error('Something went wrong!');
20 + }
21 +
22 + const categories = (await res.json()) as Category[];
23 +
24 + if (categories.length === 0) {
25 + // Render the closest `not-found.js` Error Boundary
26 + notFound();
27 + }
28 +
29 + return categories;
30 +}
31 +
32 +export async function getCategory({ slug }: { slug: string }) {
33 + const res = await fetch(
34 + `https://app-router-api.vercel.app/api/categories${
35 + slug ? `?slug=${slug}` : ''
36 + }`,
37 + );
38 +
39 + if (!res.ok) {
40 + // Render the closest `error.js` Error Boundary
41 + throw new Error('Something went wrong!');
42 + }
43 +
44 + const category = (await res.json()) as Category;
45 +
46 + if (!category) {
47 + // Render the closest `not-found.js` Error Boundary
48 + notFound();
49 + }
50 +
51 + return category;
52 +}
app/chat/[categorySlug]/[subCategorySlug]/page.tsx new
+22
@@ -0,0 +1,22 @@
1 +import { SkeletonCard } from "@/app/_ui/skeleton-card";
2 +import { getCategory } from "@/app/api/categories/getCategories";
3 +
4 +export default async function Page({
5 + params,
6 +}: {
7 + params: { subCategorySlug: string };
8 +}) {
9 + const category = await getCategory({ slug: params.subCategorySlug });
10 +
11 + return (
12 + <div className="space-y-4">
13 + <h1 className="text-xl font-medium text-gray-400/80">{category.name}</h1>
14 +
15 + <div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
16 + {Array.from({ length: category.count }).map((_, i) => (
17 + <SkeletonCard key={i} />
18 + ))}
19 + </div>
20 + </div>
21 + );
22 +}
app/chat/[categorySlug]/layout.tsx new
+39
@@ -0,0 +1,39 @@
1 +import { ClickCounter } from "@/app/_ui/click-counter";
2 +import { TabGroup } from "@/app/_ui/tab-group";
3 +import { getCategories, getCategory } from "@/app/api/categories/getCategories";
4 +
5 +export default async function Layout({
6 + children,
7 + params,
8 +}: {
9 + children: React.ReactNode;
10 + params: { categorySlug: string };
11 +}) {
12 + const category = await getCategory({ slug: params.categorySlug });
13 + const categories = await getCategories({ parent: params.categorySlug });
14 +
15 + return (
16 + <div className="space-y-9">
17 + <div className="flex justify-between">
18 + <TabGroup
19 + path={`/feed/${category.slug}`}
20 + items={[
21 + {
22 + text: 'All',
23 + },
24 + ...categories.map((x) => ({
25 + text: x.name,
26 + slug: x.slug,
27 + })),
28 + ]}
29 + />
30 +
31 + <div className="self-start">
32 + <ClickCounter />
33 + </div>
34 + </div>
35 +
36 + <div>{children}</div>
37 + </div>
38 + );
39 +}
app/chat/[categorySlug]/page.tsx new
+24
@@ -0,0 +1,24 @@
1 +import { SkeletonCard } from "@/app/_ui/skeleton-card";
2 +import { getCategory } from "@/app/api/categories/getCategories";
3 +
4 +export default async function Page({
5 + params,
6 +}: {
7 + params: { categorySlug: string };
8 +}) {
9 + const category = await getCategory({ slug: params.categorySlug });
10 +
11 + return (
12 + <div className="space-y-4">
13 + <h1 className="text-xl font-medium text-gray-400/80">
14 + All {category.name}
15 + </h1>
16 +
17 + <div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
18 + {Array.from({ length: 9 }).map((_, i) => (
19 + <SkeletonCard key={i} />
20 + ))}
21 + </div>
22 + </div>
23 + );
24 +}
app/chat/[categorySlug]/template.tsx new
+6
@@ -0,0 +1,6 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import React from 'react';
3 +
4 +export default function Template({ children }: { children: React.ReactNode }) {
5 + return <Boundary>{children}</Boundary>;
6 +}
app/chat/layout.tsx new
+25
@@ -0,0 +1,25 @@
1 +import { TooltipProvider } from '../_ui/components/tooltip';
2 +import React from 'react';
3 +
4 +const title = 'Nested Layouts';
5 +
6 +export const metadata = {
7 + metadataBase: new URL('https://splitfire.ai'),
8 + title,
9 + openGraph: {
10 + title,
11 + images: [`/api/og?title=${title}`],
12 + },
13 +};
14 +
15 +export default async function Layout({
16 + children,
17 +}: {
18 + children: React.ReactNode;
19 +}) {
20 + return (
21 + <div className="space-y-9">
22 + <TooltipProvider>{children}</TooltipProvider>
23 + </div>
24 + );
25 +}
app/chat/page.tsx new
+57
@@ -0,0 +1,57 @@
1 +'use client'
2 +
3 +import { useLocalStorage } from '../_lib/hooks/use-local-storage';
4 +import { cn } from '../_lib/utils';
5 +import { ChatPanel } from '../_ui/components/chat-panel';
6 +import { EmptyScreen } from '../_ui/components/empty-screen';
7 +import { useChat, type Message } from 'ai/react'
8 +import { usePathname } from 'next/navigation';
9 +import { toast } from 'react-hot-toast'
10 +
11 +export interface ChatProps extends React.ComponentProps<'div'> {
12 + initialMessages?: Message[]
13 + id?: string
14 +}
15 +
16 +export default function Page({id, initialMessages, className}: ChatProps) {
17 + const path = usePathname()
18 + const [previewToken, setPreviewToken] = useLocalStorage<string | null>(
19 + 'ai-token',
20 + null
21 + )
22 + const { messages, append, reload, stop, isLoading, input, setInput } =
23 + useChat({
24 + initialMessages,
25 + id,
26 + body: {
27 + id,
28 + previewToken
29 + },
30 + onResponse(response) {
31 + if (response.status === 401) {
32 + toast.error(response.statusText)
33 + }
34 + },
35 + onFinish() {
36 + if (!path.includes('chat')) {
37 + window.history.pushState({}, '', `/chat/${id}`)
38 + }
39 + }
40 + })
41 +
42 + return (
43 + <div className="prose prose-sm prose-invert max-w-none">
44 + <div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
45 + <div className={cn('pb-[200px] pt-4 md:pt-10', className)}>
46 + {messages.length ? (
47 + <>
48 + </>
49 + ) : (
50 + <EmptyScreen setInput={setInput} />
51 + )}
52 + </div>
53 +
54 + </div>
55 + </div>
56 + );
57 +}
app/globals.css new
+3
@@ -0,0 +1,3 @@
1 +@tailwind base;
2 +@tailwind components;
3 +@tailwind utilities;
app/layout.tsx new
+31
@@ -0,0 +1,31 @@
1 +'use client'
2 +
3 +import { AddressBar } from './_ui/address-bar';
4 +import { GlobalNav } from './_ui/global-nav';
5 +import './globals.css';
6 +
7 +export default function RootLayout({
8 + children,
9 +}: {
10 + children: React.ReactNode;
11 +}) {
12 + return (
13 + <html lang="en" className="[color-scheme:dark]">
14 + <body className="bg-gray-1100 overflow-y-scroll bg-[url('/grid.svg')] pb-36">
15 + <GlobalNav />
16 + <div className="lg:pl-72">
17 + <div className="bg-vc-border-gradient rounded-lg p-px shadow-lg shadow-black/20">
18 + <div className="rounded-lg bg-black">
19 + <AddressBar />
20 + </div>
21 + </div>
22 + <div className="mx-auto max-w-4xl space-y-8 px-2 pt-20 lg:px-8 lg:py-8">
23 + <div className="bg-vc-border-gradient rounded-lg p-px shadow-lg shadow-black/20">
24 + <div className="rounded-lg bg-black p-3.5 lg:p-6">{children}</div>
25 + </div>
26 + </div>
27 + </div>
28 + </body>
29 + </html>
30 + );
31 +}
app/page.tsx new
+12
@@ -0,0 +1,12 @@
1 +export default function Page() {
2 + return (
3 + <div className="space-y-8">
4 + <h1 className="text-xl font-medium text-gray-300">Hello, Tauri on Bazel!</h1>
5 + <div className="space-y-10 text-white">
6 + <div className="space-y-5">
7 + <div className="grid grid-cols-1 gap-5 lg:grid-cols-2"></div>
8 + </div>
9 + </div>
10 + </div>
11 + );
12 +}
app/play/(checkout)/checkout/page.tsx new
+3
@@ -0,0 +1,3 @@
1 +export default function Page() {
2 + return <h1 className="text-xl font-medium text-gray-400/80">Checkout</h1>;
3 +}
app/play/(checkout)/layout.tsx new
+23
@@ -0,0 +1,23 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import { TabNavItem } from '@/app/_ui/tab-nav-item';
3 +import React from 'react';
4 +
5 +export default function Layout({ children }: { children: React.ReactNode }) {
6 + return (
7 + <Boundary
8 + labels={['checkout layout']}
9 + color="blue"
10 + animateRerendering={false}
11 + >
12 + <div className="space-y-9">
13 + <div className="flex items-center justify-between">
14 + <div className="flex items-center gap-x-4">
15 + <TabNavItem href="/play">Back</TabNavItem>
16 + </div>
17 + </div>
18 +
19 + <div>{children}</div>
20 + </div>
21 + </Boundary>
22 + );
23 +}
app/play/(checkout)/template.tsx new
+6
@@ -0,0 +1,6 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import React from 'react';
3 +
4 +export default function Template({ children }: { children: React.ReactNode }) {
5 + return <Boundary>{children}</Boundary>;
6 +}
app/play/(main)/layout.tsx new
+47
@@ -0,0 +1,47 @@
1 +
2 +import { Boundary } from '@/app/_ui/boundary';
3 +import { ClickCounter } from '@/app/_ui/click-counter';
4 +import { TabGroup } from '@/app/_ui/tab-group';
5 +import { getCategories } from '@/app/api/categories/getCategories';
6 +import React from 'react';
7 +
8 +export default async function Layout({
9 + children,
10 +}: {
11 + children: React.ReactNode;
12 +}) {
13 + const categories = await getCategories();
14 +
15 + return (
16 + <Boundary
17 + labels={['main layout']}
18 + color="orange"
19 + animateRerendering={false}
20 + >
21 + <div className="space-y-9">
22 + <div className="flex justify-between">
23 + <TabGroup
24 + path="/play"
25 + items={[
26 + {
27 + text: 'Home',
28 + },
29 + ...categories.map((x) => ({
30 + text: x.name,
31 + slug: x.slug,
32 + })),
33 + { text: 'Checkout', slug: 'checkout' },
34 + { text: 'Blog', slug: 'blog' },
35 + ]}
36 + />
37 +
38 + <div className="self-start">
39 + <ClickCounter />
40 + </div>
41 + </div>
42 +
43 + <div>{children}</div>
44 + </div>
45 + </Boundary>
46 + );
47 +}
app/play/(main)/page.tsx new
+38
@@ -0,0 +1,38 @@
1 +import { ExternalLink } from "@/app/_ui/external-link";
2 +
3 +export default function Page() {
4 + return (
5 + <div className="prose prose-sm prose-invert max-w-none">
6 + <h1 className="text-xl font-bold">Route Groups</h1>
7 +
8 + <ul>
9 + <li>
10 + This example uses Route Groups to create layouts for different
11 + sections of the app without affecting the URL structure.
12 + </li>
13 + <li>
14 + Try navigating pages and noting the different layouts used for each
15 + section.
16 + </li>
17 + <li>Route groups can be used to:</li>
18 + <ul>
19 + <li>Opt a route segment out of a shared layout.</li>
20 + <li>Organize routes without affecting the URL structure.</li>
21 + <li>
22 + Create multiple root layouts by partitioning the top level of the
23 + application.
24 + </li>
25 + </ul>
26 + </ul>
27 +
28 + <div className="flex gap-2">
29 + <ExternalLink href="https://nextjs.org/docs/app/building-your-application/routing/route-groups">
30 + Docs
31 + </ExternalLink>
32 + <ExternalLink href="https://github.com/vercel/app-playground/tree/main/app/route-groups">
33 + Code
34 + </ExternalLink>
35 + </div>
36 + </div>
37 + );
38 +}
app/play/(main)/template.tsx new
+6
@@ -0,0 +1,6 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import React from 'react';
3 +
4 +export default function Template({ children }: { children: React.ReactNode }) {
5 + return <Boundary>{children}</Boundary>;
6 +}
app/play/(marketing)/blog/page.tsx new
+3
@@ -0,0 +1,3 @@
1 +export default function Page() {
2 + return <h1 className="text-xl font-medium text-gray-400/80">Blog</h1>;
3 +}
app/play/(marketing)/layout.tsx new
+47
@@ -0,0 +1,47 @@
1 +
2 +import { Boundary } from '@/app/_ui/boundary';
3 +import { ClickCounter } from '@/app/_ui/click-counter';
4 +import { TabGroup } from '@/app/_ui/tab-group';
5 +import { getCategories } from '@/app/api/categories/getCategories';
6 +import React from 'react';
7 +
8 +export default async function Layout({
9 + children,
10 +}: {
11 + children: React.ReactNode;
12 +}) {
13 + const categories = await getCategories();
14 +
15 + return (
16 + <Boundary
17 + labels={['marketing layout']}
18 + color="violet"
19 + animateRerendering={false}
20 + >
21 + <div className="space-y-9">
22 + <div className="flex justify-between">
23 + <TabGroup
24 + path="/play"
25 + items={[
26 + {
27 + text: 'Home',
28 + },
29 + ...categories.map((x) => ({
30 + text: x.name,
31 + slug: x.slug,
32 + })),
33 + { text: 'Checkout', slug: 'checkout' },
34 + { text: 'Blog', slug: 'blog' },
35 + ]}
36 + />
37 +
38 + <div className="self-start">
39 + <ClickCounter />
40 + </div>
41 + </div>
42 +
43 + <div>{children}</div>
44 + </div>
45 + </Boundary>
46 + );
47 +}
app/play/(marketing)/template.tsx new
+6
@@ -0,0 +1,6 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import React from 'react';
3 +
4 +export default function Template({ children }: { children: React.ReactNode }) {
5 + return <Boundary>{children}</Boundary>;
6 +}
app/play/(shop)/[categorySlug]/[subCategorySlug]/page.tsx new
+22
@@ -0,0 +1,22 @@
1 +import { SkeletonCard } from "@/app/_ui/skeleton-card";
2 +import { getCategory } from "@/app/api/categories/getCategories";
3 +
4 +export default async function Page({
5 + params,
6 +}: {
7 + params: { categorySlug: string; subCategorySlug: string };
8 +}) {
9 + const category = await getCategory({ slug: params.subCategorySlug });
10 +
11 + return (
12 + <div className="space-y-4">
13 + <h1 className="text-xl font-medium text-gray-400/80">{category.name}</h1>
14 +
15 + <div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
16 + {Array.from({ length: category.count }).map((_, i) => (
17 + <SkeletonCard key={i} />
18 + ))}
19 + </div>
20 + </div>
21 + );
22 +}
app/play/(shop)/[categorySlug]/layout.tsx new
+38
@@ -0,0 +1,38 @@
1 +import { ClickCounter } from "@/app/_ui/click-counter";
2 +import { TabGroup } from "@/app/_ui/tab-group";
3 +import { getCategories, getCategory } from "@/app/api/categories/getCategories";
4 +
5 +export default async function Layout({
6 + children,
7 + params,
8 +}: {
9 + children: React.ReactNode;
10 + params: { categorySlug: string };
11 +}) {
12 + const category = await getCategory({ slug: params.categorySlug });
13 + const categories = await getCategories({ parent: params.categorySlug });
14 +
15 + return (
16 + <div className="space-y-9">
17 + <div className="flex justify-between">
18 + <TabGroup
19 + path={`/play/${category.slug}`}
20 + items={[
21 + {
22 + text: 'All',
23 + },
24 + ...categories.map((x) => ({
25 + text: x.name,
26 + slug: x.slug,
27 + })),
28 + ]}
29 + />
30 +
31 + <div className="self-start">
32 + <ClickCounter />
33 + </div>
34 + </div>
35 + <div>{children}</div>
36 + </div>
37 + );
38 +}
app/play/(shop)/[categorySlug]/page.tsx new
+23
@@ -0,0 +1,23 @@
1 +import { SkeletonCard } from "@/app/_ui/skeleton-card";
2 +import { getCategory } from "@/app/api/categories/getCategories";
3 +
4 +export default async function Page({
5 + params,
6 +}: {
7 + params: { categorySlug: string };
8 +}) {
9 + const category = await getCategory({ slug: params.categorySlug });
10 + return (
11 + <div className="space-y-4">
12 + <h1 className="text-xl font-medium text-gray-400/80">
13 + All {category.name}
14 + </h1>
15 +
16 + <div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
17 + {Array.from({ length: 9 }).map((_, i) => (
18 + <SkeletonCard key={i} />
19 + ))}
20 + </div>
21 + </div>
22 + );
23 +}
app/play/(shop)/[categorySlug]/template.tsx new
+6
@@ -0,0 +1,6 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import React from 'react';
3 +
4 +export default function Template({ children }: { children: React.ReactNode }) {
5 + return <Boundary>{children}</Boundary>;
6 +}
app/play/(shop)/layout.tsx new
+42
@@ -0,0 +1,42 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import { ClickCounter } from '@/app/_ui/click-counter';
3 +import { TabGroup } from '@/app/_ui/tab-group';
4 +import { getCategories } from '@/app/api/categories/getCategories';
5 +import React from 'react';
6 +
7 +export default async function Layout({
8 + children,
9 +}: {
10 + children: React.ReactNode;
11 +}) {
12 + const categories = await getCategories();
13 +
14 + return (
15 + <Boundary labels={['shop layout']} color="cyan" animateRerendering={false}>
16 + <div className="space-y-9">
17 + <div className="flex justify-between">
18 + <TabGroup
19 + path="/play"
20 + items={[
21 + {
22 + text: 'Home',
23 + },
24 + ...categories.map((x) => ({
25 + text: x.name,
26 + slug: x.slug,
27 + })),
28 + { text: 'Checkout', slug: 'checkout' },
29 + { text: 'Blog', slug: 'blog' },
30 + ]}
31 + />
32 +
33 + <div className="self-start">
34 + <ClickCounter />
35 + </div>
36 + </div>
37 +
38 + <div>{children}</div>
39 + </div>
40 + </Boundary>
41 + );
42 +}
app/play/(shop)/template.tsx new
+6
@@ -0,0 +1,6 @@
1 +import { Boundary } from '@/app/_ui/boundary';
2 +import React from 'react';
3 +
4 +export default function Template({ children }: { children: React.ReactNode }) {
5 + return <Boundary>{children}</Boundary>;
6 +}
app/play/layout.tsx new
+29
@@ -0,0 +1,29 @@
1 +import React from 'react';
2 +
3 +const title = 'Nested Layouts';
4 +
5 +export const metadata = {
6 + metadataBase: new URL('https://splitfire.ai'),
7 + title,
8 + openGraph: {
9 + title,
10 + images: [`/api/og?title=${title}`],
11 + },
12 +};
13 +
14 +export default async function Layout({
15 + children,
16 +}: {
17 + children: React.ReactNode;
18 +}) {
19 + return (
20 + <div className="space-y-9">
21 + <div className="flex justify-between">
22 + <div className="self-start">
23 + <h1 className="text-3xl font-bold">Ready to play!</h1>
24 + </div>
25 + </div>
26 + <div>{children}</div>
27 + </div>
28 + );
29 +}
app/play/page.tsx new
+13
@@ -0,0 +1,13 @@
1 +import { SkeletonCard } from '../_ui/skeleton-card';
2 +
3 +export default function Page() {
4 + return (
5 + <div className="prose prose-sm prose-invert max-w-none">
6 + <div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
7 + {Array.from({ length: 6 }).map((_, i) => (
8 + <SkeletonCard key={i} />
9 + ))}
10 + </div>
11 + </div>
12 + );
13 +}
next.config.js
+1 -15
@@ -1,18 +1,4 @@
1 /** @type {import('next').NextConfig} */
2 -const nextConfig = {
3 - reactStrictMode: true,
4 - swcMinify: true,
5 - // Note: This experimental feature is required to use NextJS Image in SSG mode.
6 - // See https://nextjs.org/docs/messages/export-image-api for different workarounds.
7 - images: {
8 - unoptimized: true,
9 - },
10 - webpack: (config) =>
11 - {
12 - config.resolve.symlinks = false;
13 - return config;
14 - }
15 -
16 -};
2 +const nextConfig = {};
3
4 module.exports = nextConfig;
package-lock.json
+1754 -52
@@ -8,27 +8,75 @@
8 "name": "tauri-on-bazel",
9 "version": "0.1.0",
10 "dependencies": {
11 + "@heroicons/react": "1.0.6",
12 + "@radix-ui/react-slot": "^1.0.2",
13 + "@radix-ui/react-tooltip": "^1.0.7",
14 "@tauri-apps/api": "^1.5.3",
15 "@types/node": "18.17.0",
16 "@types/react": "18.2.78",
17 "@types/react-dom": "18.2.25",
18 + "ai": "^2.2.33",
19 + "class-variance-authority": "^0.7.0",
20 + "clsx": "1.2.1",
21 "eslint": "8.32.0",
22 "eslint-config-next": "14.1.0",
23 "next": "14.1.0",
24 "react": "18.2.0",
25 "react-dom": "18.2.0",
26 + "react-hot-toast": "^2.4.1",
27 + "react-textarea-autosize": "^8.5.3",
28 + "tailwind-merge": "^2.2.1",
29 "typescript": "4.9.4"
30 },
31 "devDependencies": {
23 - "@tauri-apps/cli": "^1.5.11"
32 + "@tailwindcss/forms": "0.5.3",
33 + "@tailwindcss/typography": "0.5.9",
34 + "@tauri-apps/cli": "^1.5.11",
35 + "autoprefixer": "^10.4.19",
36 + "postcss": "^8.4.38",
37 + "tailwindcss": "^3.4.3"
38 + }
39 + },
40 + "node_modules/@alloc/quick-lru": {
41 + "version": "5.2.0",
42 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
43 + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
44 + "dev": true,
45 + "engines": {
46 + "node": ">=10"
47 + }
48 + },
49 + "node_modules/@ampproject/remapping": {
50 + "version": "2.3.0",
51 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@ampproject/remapping/-/remapping-2.3.0.tgz",
52 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
53 + "peer": true,
54 + "dependencies": {
55 + "@jridgewell/gen-mapping": "^0.3.5",
56 + "@jridgewell/trace-mapping": "^0.3.24"
57 + },
58 + "engines": {
59 + "node": ">=6.0.0"
60 + }
61 + },
62 + "node_modules/@babel/parser": {
63 + "version": "7.24.4",
64 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@babel/parser/-/parser-7.24.4.tgz",
65 + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
66 + "peer": true,
67 + "bin": {
68 + "parser": "bin/babel-parser.js"
69 + },
70 + "engines": {
71 + "node": ">=6.0.0"
72 }
73 },
74 "node_modules/@babel/runtime": {
27 - "version": "7.20.7",
28 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
29 - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
75 + "version": "7.24.4",
76 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@babel/runtime/-/runtime-7.24.4.tgz",
77 + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
78 "dependencies": {
31 - "regenerator-runtime": "^0.13.11"
79 + "regenerator-runtime": "^0.14.0"
80 },
81 "engines": {
82 "node": ">=6.9.0"
@@ -56,6 +104,48 @@
104 "url": "https://opencollective.com/eslint"
105 }
106 },
107 + "node_modules/@floating-ui/core": {
108 + "version": "1.6.0",
109 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@floating-ui/core/-/core-1.6.0.tgz",
110 + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
111 + "dependencies": {
112 + "@floating-ui/utils": "^0.2.1"
113 + }
114 + },
115 + "node_modules/@floating-ui/dom": {
116 + "version": "1.6.3",
117 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@floating-ui/dom/-/dom-1.6.3.tgz",
118 + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
119 + "dependencies": {
120 + "@floating-ui/core": "^1.0.0",
121 + "@floating-ui/utils": "^0.2.0"
122 + }
123 + },
124 + "node_modules/@floating-ui/react-dom": {
125 + "version": "2.0.8",
126 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
127 + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
128 + "dependencies": {
129 + "@floating-ui/dom": "^1.6.1"
130 + },
131 + "peerDependencies": {
132 + "react": ">=16.8.0",
133 + "react-dom": ">=16.8.0"
134 + }
135 + },
136 + "node_modules/@floating-ui/utils": {
137 + "version": "0.2.1",
138 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@floating-ui/utils/-/utils-0.2.1.tgz",
139 + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
140 + },
141 + "node_modules/@heroicons/react": {
142 + "version": "1.0.6",
143 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@heroicons/react/-/react-1.0.6.tgz",
144 + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==",
145 + "peerDependencies": {
146 + "react": ">= 16"
147 + }
148 + },
149 "node_modules/@humanwhocodes/config-array": {
150 "version": "0.11.8",
151 "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
@@ -121,6 +211,49 @@
211 "node": ">=12"
212 }
213 },
214 + "node_modules/@jridgewell/gen-mapping": {
215 + "version": "0.3.5",
216 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
217 + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
218 + "dependencies": {
219 + "@jridgewell/set-array": "^1.2.1",
220 + "@jridgewell/sourcemap-codec": "^1.4.10",
221 + "@jridgewell/trace-mapping": "^0.3.24"
222 + },
223 + "engines": {
224 + "node": ">=6.0.0"
225 + }
226 + },
227 + "node_modules/@jridgewell/resolve-uri": {
228 + "version": "3.1.2",
229 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
230 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
231 + "engines": {
232 + "node": ">=6.0.0"
233 + }
234 + },
235 + "node_modules/@jridgewell/set-array": {
236 + "version": "1.2.1",
237 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@jridgewell/set-array/-/set-array-1.2.1.tgz",
238 + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
239 + "engines": {
240 + "node": ">=6.0.0"
241 + }
242 + },
243 + "node_modules/@jridgewell/sourcemap-codec": {
244 + "version": "1.4.15",
245 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
246 + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
247 + },
248 + "node_modules/@jridgewell/trace-mapping": {
249 + "version": "0.3.25",
250 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
251 + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
252 + "dependencies": {
253 + "@jridgewell/resolve-uri": "^3.1.0",
254 + "@jridgewell/sourcemap-codec": "^1.4.14"
255 + }
256 + },
257 "node_modules/@next/env": {
258 "version": "14.1.0",
259 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@next/env/-/env-14.1.0.tgz",
@@ -366,6 +499,407 @@
499 "url": "https://opencollective.com/unts"
500 }
501 },
502 + "node_modules/@radix-ui/primitive": {
503 + "version": "1.0.1",
504 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/primitive/-/primitive-1.0.1.tgz",
505 + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==",
506 + "dependencies": {
507 + "@babel/runtime": "^7.13.10"
508 + }
509 + },
510 + "node_modules/@radix-ui/react-arrow": {
511 + "version": "1.0.3",
512 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz",
513 + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==",
514 + "dependencies": {
515 + "@babel/runtime": "^7.13.10",
516 + "@radix-ui/react-primitive": "1.0.3"
517 + },
518 + "peerDependencies": {
519 + "@types/react": "*",
520 + "@types/react-dom": "*",
521 + "react": "^16.8 || ^17.0 || ^18.0",
522 + "react-dom": "^16.8 || ^17.0 || ^18.0"
523 + },
524 + "peerDependenciesMeta": {
525 + "@types/react": {
526 + "optional": true
527 + },
528 + "@types/react-dom": {
529 + "optional": true
530 + }
531 + }
532 + },
533 + "node_modules/@radix-ui/react-compose-refs": {
534 + "version": "1.0.1",
535 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
536 + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==",
537 + "dependencies": {
538 + "@babel/runtime": "^7.13.10"
539 + },
540 + "peerDependencies": {
541 + "@types/react": "*",
542 + "react": "^16.8 || ^17.0 || ^18.0"
543 + },
544 + "peerDependenciesMeta": {
545 + "@types/react": {
546 + "optional": true
547 + }
548 + }
549 + },
550 + "node_modules/@radix-ui/react-context": {
551 + "version": "1.0.1",
552 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-context/-/react-context-1.0.1.tgz",
553 + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==",
554 + "dependencies": {
555 + "@babel/runtime": "^7.13.10"
556 + },
557 + "peerDependencies": {
558 + "@types/react": "*",
559 + "react": "^16.8 || ^17.0 || ^18.0"
560 + },
561 + "peerDependenciesMeta": {
562 + "@types/react": {
563 + "optional": true
564 + }
565 + }
566 + },
567 + "node_modules/@radix-ui/react-dismissable-layer": {
568 + "version": "1.0.5",
569 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz",
570 + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==",
571 + "dependencies": {
572 + "@babel/runtime": "^7.13.10",
573 + "@radix-ui/primitive": "1.0.1",
574 + "@radix-ui/react-compose-refs": "1.0.1",
575 + "@radix-ui/react-primitive": "1.0.3",
576 + "@radix-ui/react-use-callback-ref": "1.0.1",
577 + "@radix-ui/react-use-escape-keydown": "1.0.3"
578 + },
579 + "peerDependencies": {
580 + "@types/react": "*",
581 + "@types/react-dom": "*",
582 + "react": "^16.8 || ^17.0 || ^18.0",
583 + "react-dom": "^16.8 || ^17.0 || ^18.0"
584 + },
585 + "peerDependenciesMeta": {
586 + "@types/react": {
587 + "optional": true
588 + },
589 + "@types/react-dom": {
590 + "optional": true
591 + }
592 + }
593 + },
594 + "node_modules/@radix-ui/react-id": {
595 + "version": "1.0.1",
596 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-id/-/react-id-1.0.1.tgz",
597 + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==",
598 + "dependencies": {
599 + "@babel/runtime": "^7.13.10",
600 + "@radix-ui/react-use-layout-effect": "1.0.1"
601 + },
602 + "peerDependencies": {
603 + "@types/react": "*",
604 + "react": "^16.8 || ^17.0 || ^18.0"
605 + },
606 + "peerDependenciesMeta": {
607 + "@types/react": {
608 + "optional": true
609 + }
610 + }
611 + },
612 + "node_modules/@radix-ui/react-popper": {
613 + "version": "1.1.3",
614 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-popper/-/react-popper-1.1.3.tgz",
615 + "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==",
616 + "dependencies": {
617 + "@babel/runtime": "^7.13.10",
618 + "@floating-ui/react-dom": "^2.0.0",
619 + "@radix-ui/react-arrow": "1.0.3",
620 + "@radix-ui/react-compose-refs": "1.0.1",
621 + "@radix-ui/react-context": "1.0.1",
622 + "@radix-ui/react-primitive": "1.0.3",
623 + "@radix-ui/react-use-callback-ref": "1.0.1",
624 + "@radix-ui/react-use-layout-effect": "1.0.1",
625 + "@radix-ui/react-use-rect": "1.0.1",
626 + "@radix-ui/react-use-size": "1.0.1",
627 + "@radix-ui/rect": "1.0.1"
628 + },
629 + "peerDependencies": {
630 + "@types/react": "*",
631 + "@types/react-dom": "*",
632 + "react": "^16.8 || ^17.0 || ^18.0",
633 + "react-dom": "^16.8 || ^17.0 || ^18.0"
634 + },
635 + "peerDependenciesMeta": {
636 + "@types/react": {
637 + "optional": true
638 + },
639 + "@types/react-dom": {
640 + "optional": true
641 + }
642 + }
643 + },
644 + "node_modules/@radix-ui/react-portal": {
645 + "version": "1.0.4",
646 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-portal/-/react-portal-1.0.4.tgz",
647 + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==",
648 + "dependencies": {
649 + "@babel/runtime": "^7.13.10",
650 + "@radix-ui/react-primitive": "1.0.3"
651 + },
652 + "peerDependencies": {
653 + "@types/react": "*",
654 + "@types/react-dom": "*",
655 + "react": "^16.8 || ^17.0 || ^18.0",
656 + "react-dom": "^16.8 || ^17.0 || ^18.0"
657 + },
658 + "peerDependenciesMeta": {
659 + "@types/react": {
660 + "optional": true
661 + },
662 + "@types/react-dom": {
663 + "optional": true
664 + }
665 + }
666 + },
667 + "node_modules/@radix-ui/react-presence": {
668 + "version": "1.0.1",
669 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-presence/-/react-presence-1.0.1.tgz",
670 + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==",
671 + "dependencies": {
672 + "@babel/runtime": "^7.13.10",
673 + "@radix-ui/react-compose-refs": "1.0.1",
674 + "@radix-ui/react-use-layout-effect": "1.0.1"
675 + },
676 + "peerDependencies": {
677 + "@types/react": "*",
678 + "@types/react-dom": "*",
679 + "react": "^16.8 || ^17.0 || ^18.0",
680 + "react-dom": "^16.8 || ^17.0 || ^18.0"
681 + },
682 + "peerDependenciesMeta": {
683 + "@types/react": {
684 + "optional": true
685 + },
686 + "@types/react-dom": {
687 + "optional": true
688 + }
689 + }
690 + },
691 + "node_modules/@radix-ui/react-primitive": {
692 + "version": "1.0.3",
693 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz",
694 + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==",
695 + "dependencies": {
696 + "@babel/runtime": "^7.13.10",
697 + "@radix-ui/react-slot": "1.0.2"
698 + },
699 + "peerDependencies": {
700 + "@types/react": "*",
701 + "@types/react-dom": "*",
702 + "react": "^16.8 || ^17.0 || ^18.0",
703 + "react-dom": "^16.8 || ^17.0 || ^18.0"
704 + },
705 + "peerDependenciesMeta": {
706 + "@types/react": {
707 + "optional": true
708 + },
709 + "@types/react-dom": {
710 + "optional": true
711 + }
712 + }
713 + },
714 + "node_modules/@radix-ui/react-slot": {
715 + "version": "1.0.2",
716 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
717 + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
718 + "dependencies": {
719 + "@babel/runtime": "^7.13.10",
720 + "@radix-ui/react-compose-refs": "1.0.1"
721 + },
722 + "peerDependencies": {
723 + "@types/react": "*",
724 + "react": "^16.8 || ^17.0 || ^18.0"
725 + },
726 + "peerDependenciesMeta": {
727 + "@types/react": {
728 + "optional": true
729 + }
730 + }
731 + },
732 + "node_modules/@radix-ui/react-tooltip": {
733 + "version": "1.0.7",
734 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz",
735 + "integrity": "sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==",
736 + "dependencies": {
737 + "@babel/runtime": "^7.13.10",
738 + "@radix-ui/primitive": "1.0.1",
739 + "@radix-ui/react-compose-refs": "1.0.1",
740 + "@radix-ui/react-context": "1.0.1",
741 + "@radix-ui/react-dismissable-layer": "1.0.5",
742 + "@radix-ui/react-id": "1.0.1",
743 + "@radix-ui/react-popper": "1.1.3",
744 + "@radix-ui/react-portal": "1.0.4",
745 + "@radix-ui/react-presence": "1.0.1",
746 + "@radix-ui/react-primitive": "1.0.3",
747 + "@radix-ui/react-slot": "1.0.2",
748 + "@radix-ui/react-use-controllable-state": "1.0.1",
749 + "@radix-ui/react-visually-hidden": "1.0.3"
750 + },
751 + "peerDependencies": {
752 + "@types/react": "*",
753 + "@types/react-dom": "*",
754 + "react": "^16.8 || ^17.0 || ^18.0",
755 + "react-dom": "^16.8 || ^17.0 || ^18.0"
756 + },
757 + "peerDependenciesMeta": {
758 + "@types/react": {
759 + "optional": true
760 + },
761 + "@types/react-dom": {
762 + "optional": true
763 + }
764 + }
765 + },
766 + "node_modules/@radix-ui/react-use-callback-ref": {
767 + "version": "1.0.1",
768 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
769 + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==",
770 + "dependencies": {
771 + "@babel/runtime": "^7.13.10"
772 + },
773 + "peerDependencies": {
774 + "@types/react": "*",
775 + "react": "^16.8 || ^17.0 || ^18.0"
776 + },
777 + "peerDependenciesMeta": {
778 + "@types/react": {
779 + "optional": true
780 + }
781 + }
782 + },
783 + "node_modules/@radix-ui/react-use-controllable-state": {
784 + "version": "1.0.1",
785 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz",
786 + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==",
787 + "dependencies": {
788 + "@babel/runtime": "^7.13.10",
789 + "@radix-ui/react-use-callback-ref": "1.0.1"
790 + },
791 + "peerDependencies": {
792 + "@types/react": "*",
793 + "react": "^16.8 || ^17.0 || ^18.0"
794 + },
795 + "peerDependenciesMeta": {
796 + "@types/react": {
797 + "optional": true
798 + }
799 + }
800 + },
801 + "node_modules/@radix-ui/react-use-escape-keydown": {
802 + "version": "1.0.3",
803 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz",
804 + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==",
805 + "dependencies": {
806 + "@babel/runtime": "^7.13.10",
807 + "@radix-ui/react-use-callback-ref": "1.0.1"
808 + },
809 + "peerDependencies": {
810 + "@types/react": "*",
811 + "react": "^16.8 || ^17.0 || ^18.0"
812 + },
813 + "peerDependenciesMeta": {
814 + "@types/react": {
815 + "optional": true
816 + }
817 + }
818 + },
819 + "node_modules/@radix-ui/react-use-layout-effect": {
820 + "version": "1.0.1",
821 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz",
822 + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==",
823 + "dependencies": {
824 + "@babel/runtime": "^7.13.10"
825 + },
826 + "peerDependencies": {
827 + "@types/react": "*",
828 + "react": "^16.8 || ^17.0 || ^18.0"
829 + },
830 + "peerDependenciesMeta": {
831 + "@types/react": {
832 + "optional": true
833 + }
834 + }
835 + },
836 + "node_modules/@radix-ui/react-use-rect": {
837 + "version": "1.0.1",
838 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz",
839 + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==",
840 + "dependencies": {
841 + "@babel/runtime": "^7.13.10",
842 + "@radix-ui/rect": "1.0.1"
843 + },
844 + "peerDependencies": {
845 + "@types/react": "*",
846 + "react": "^16.8 || ^17.0 || ^18.0"
847 + },
848 + "peerDependenciesMeta": {
849 + "@types/react": {
850 + "optional": true
851 + }
852 + }
853 + },
854 + "node_modules/@radix-ui/react-use-size": {
855 + "version": "1.0.1",
856 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz",
857 + "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==",
858 + "dependencies": {
859 + "@babel/runtime": "^7.13.10",
860 + "@radix-ui/react-use-layout-effect": "1.0.1"
861 + },
862 + "peerDependencies": {
863 + "@types/react": "*",
864 + "react": "^16.8 || ^17.0 || ^18.0"
865 + },
866 + "peerDependenciesMeta": {
867 + "@types/react": {
868 + "optional": true
869 + }
870 + }
871 + },
872 + "node_modules/@radix-ui/react-visually-hidden": {
873 + "version": "1.0.3",
874 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz",
875 + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==",
876 + "dependencies": {
877 + "@babel/runtime": "^7.13.10",
878 + "@radix-ui/react-primitive": "1.0.3"
879 + },
880 + "peerDependencies": {
881 + "@types/react": "*",
882 + "@types/react-dom": "*",
883 + "react": "^16.8 || ^17.0 || ^18.0",
884 + "react-dom": "^16.8 || ^17.0 || ^18.0"
885 + },
886 + "peerDependenciesMeta": {
887 + "@types/react": {
888 + "optional": true
889 + },
890 + "@types/react-dom": {
891 + "optional": true
892 + }
893 + }
894 + },
895 + "node_modules/@radix-ui/rect": {
896 + "version": "1.0.1",
897 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@radix-ui/rect/-/rect-1.0.1.tgz",
898 + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==",
899 + "dependencies": {
900 + "@babel/runtime": "^7.13.10"
901 + }
902 + },
903 "node_modules/@rushstack/eslint-patch": {
904 "version": "1.10.2",
905 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz",
@@ -379,6 +913,46 @@
913 "tslib": "^2.4.0"
914 }
915 },
916 + "node_modules/@tailwindcss/forms": {
917 + "version": "0.5.3",
918 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@tailwindcss/forms/-/forms-0.5.3.tgz",
919 + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==",
920 + "dev": true,
921 + "dependencies": {
922 + "mini-svg-data-uri": "^1.2.3"
923 + },
924 + "peerDependencies": {
925 + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
926 + }
927 + },
928 + "node_modules/@tailwindcss/typography": {
929 + "version": "0.5.9",
930 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@tailwindcss/typography/-/typography-0.5.9.tgz",
931 + "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==",
932 + "dev": true,
933 + "dependencies": {
934 + "lodash.castarray": "^4.4.0",
935 + "lodash.isplainobject": "^4.0.6",
936 + "lodash.merge": "^4.6.2",
937 + "postcss-selector-parser": "6.0.10"
938 + },
939 + "peerDependencies": {
940 + "tailwindcss": ">=3.0.0 || insiders"
941 + }
942 + },
943 + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
944 + "version": "6.0.10",
945 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
946 + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
947 + "dev": true,
948 + "dependencies": {
949 + "cssesc": "^3.0.0",
950 + "util-deprecate": "^1.0.2"
951 + },
952 + "engines": {
953 + "node": ">=4"
954 + }
955 + },
956 "node_modules/@tauri-apps/api": {
957 "version": "1.5.3",
958 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@tauri-apps/api/-/api-1.5.3.tgz",
@@ -573,6 +1147,12 @@
1147 "node": ">= 10"
1148 }
1149 },
1150 + "node_modules/@types/estree": {
1151 + "version": "1.0.5",
1152 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@types/estree/-/estree-1.0.5.tgz",
1153 + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
1154 + "peer": true
1155 + },
1156 "node_modules/@types/json5": {
1157 "version": "0.0.29",
1158 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@types/json5/-/json5-0.0.29.tgz",
@@ -701,10 +1281,121 @@
1281 "url": "https://opencollective.com/typescript-eslint"
1282 }
1283 },
1284 + "node_modules/@vue/compiler-core": {
1285 + "version": "3.4.23",
1286 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/compiler-core/-/compiler-core-3.4.23.tgz",
1287 + "integrity": "sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==",
1288 + "peer": true,
1289 + "dependencies": {
1290 + "@babel/parser": "^7.24.1",
1291 + "@vue/shared": "3.4.23",
1292 + "entities": "^4.5.0",
1293 + "estree-walker": "^2.0.2",
1294 + "source-map-js": "^1.2.0"
1295 + }
1296 + },
1297 + "node_modules/@vue/compiler-core/node_modules/estree-walker": {
1298 + "version": "2.0.2",
1299 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/estree-walker/-/estree-walker-2.0.2.tgz",
1300 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
1301 + "peer": true
1302 + },
1303 + "node_modules/@vue/compiler-dom": {
1304 + "version": "3.4.23",
1305 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/compiler-dom/-/compiler-dom-3.4.23.tgz",
1306 + "integrity": "sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==",
1307 + "peer": true,
1308 + "dependencies": {
1309 + "@vue/compiler-core": "3.4.23",
1310 + "@vue/shared": "3.4.23"
1311 + }
1312 + },
1313 + "node_modules/@vue/compiler-sfc": {
1314 + "version": "3.4.23",
1315 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/compiler-sfc/-/compiler-sfc-3.4.23.tgz",
1316 + "integrity": "sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==",
1317 + "peer": true,
1318 + "dependencies": {
1319 + "@babel/parser": "^7.24.1",
1320 + "@vue/compiler-core": "3.4.23",
1321 + "@vue/compiler-dom": "3.4.23",
1322 + "@vue/compiler-ssr": "3.4.23",
1323 + "@vue/shared": "3.4.23",
1324 + "estree-walker": "^2.0.2",
1325 + "magic-string": "^0.30.8",
1326 + "postcss": "^8.4.38",
1327 + "source-map-js": "^1.2.0"
1328 + }
1329 + },
1330 + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": {
1331 + "version": "2.0.2",
1332 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/estree-walker/-/estree-walker-2.0.2.tgz",
1333 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
1334 + "peer": true
1335 + },
1336 + "node_modules/@vue/compiler-ssr": {
1337 + "version": "3.4.23",
1338 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/compiler-ssr/-/compiler-ssr-3.4.23.tgz",
1339 + "integrity": "sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==",
1340 + "peer": true,
1341 + "dependencies": {
1342 + "@vue/compiler-dom": "3.4.23",
1343 + "@vue/shared": "3.4.23"
1344 + }
1345 + },
1346 + "node_modules/@vue/reactivity": {
1347 + "version": "3.4.23",
1348 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/reactivity/-/reactivity-3.4.23.tgz",
1349 + "integrity": "sha512-GlXR9PL+23fQ3IqnbSQ8OQKLodjqCyoCrmdLKZk3BP7jN6prWheAfU7a3mrltewTkoBm+N7qMEb372VHIkQRMQ==",
1350 + "peer": true,
1351 + "dependencies": {
1352 + "@vue/shared": "3.4.23"
1353 + }
1354 + },
1355 + "node_modules/@vue/runtime-core": {
1356 + "version": "3.4.23",
1357 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/runtime-core/-/runtime-core-3.4.23.tgz",
1358 + "integrity": "sha512-FeQ9MZEXoFzFkFiw9MQQ/FWs3srvrP+SjDKSeRIiQHIhtkzoj0X4rWQlRNHbGuSwLra6pMyjAttwixNMjc/xLw==",
1359 + "peer": true,
1360 + "dependencies": {
1361 + "@vue/reactivity": "3.4.23",
1362 + "@vue/shared": "3.4.23"
1363 + }
1364 + },
1365 + "node_modules/@vue/runtime-dom": {
1366 + "version": "3.4.23",
1367 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/runtime-dom/-/runtime-dom-3.4.23.tgz",
1368 + "integrity": "sha512-RXJFwwykZWBkMiTPSLEWU3kgVLNAfActBfWFlZd0y79FTUxexogd0PLG4HH2LfOktjRxV47Nulygh0JFXe5f9A==",
1369 + "peer": true,
1370 + "dependencies": {
1371 + "@vue/runtime-core": "3.4.23",
1372 + "@vue/shared": "3.4.23",
1373 + "csstype": "^3.1.3"
1374 + }
1375 + },
1376 + "node_modules/@vue/server-renderer": {
1377 + "version": "3.4.23",
1378 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/server-renderer/-/server-renderer-3.4.23.tgz",
1379 + "integrity": "sha512-LDwGHtnIzvKFNS8dPJ1SSU5Gvm36p2ck8wCZc52fc3k/IfjKcwCyrWEf0Yag/2wTFUBXrqizfhK9c/mC367dXQ==",
1380 + "peer": true,
1381 + "dependencies": {
1382 + "@vue/compiler-ssr": "3.4.23",
1383 + "@vue/shared": "3.4.23"
1384 + },
1385 + "peerDependencies": {
1386 + "vue": "3.4.23"
1387 + }
1388 + },
1389 + "node_modules/@vue/shared": {
1390 + "version": "3.4.23",
1391 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/@vue/shared/-/shared-3.4.23.tgz",
1392 + "integrity": "sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==",
1393 + "peer": true
1394 + },
1395 "node_modules/acorn": {
705 - "version": "8.8.1",
706 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
707 - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
1396 + "version": "8.11.3",
1397 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/acorn/-/acorn-8.11.3.tgz",
1398 + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
1399 "bin": {
1400 "acorn": "bin/acorn"
1401 },
@@ -720,6 +1411,54 @@
1411 "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1412 }
1413 },
1414 + "node_modules/ai": {
1415 + "version": "2.2.37",
1416 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/ai/-/ai-2.2.37.tgz",
1417 + "integrity": "sha512-JIYm5N1muGVqBqWnvkt29FmXhESoO5TcDxw74OE41SsM+uIou6NPDDs0XWb/ABcd1gmp6k5zym64KWMPM2xm0A==",
1418 + "dependencies": {
1419 + "eventsource-parser": "1.0.0",
1420 + "nanoid": "3.3.6",
1421 + "solid-swr-store": "0.10.7",
1422 + "sswr": "2.0.0",
1423 + "swr": "2.2.0",
1424 + "swr-store": "0.10.6",
1425 + "swrv": "1.0.4"
1426 + },
1427 + "engines": {
1428 + "node": ">=14.6"
1429 + },
1430 + "peerDependencies": {
1431 + "react": "^18.2.0",
1432 + "solid-js": "^1.7.7",
1433 + "svelte": "^3.0.0 || ^4.0.0",
1434 + "vue": "^3.3.4"
1435 + },
1436 + "peerDependenciesMeta": {
1437 + "react": {
1438 + "optional": true
1439 + },
1440 + "solid-js": {
1441 + "optional": true
1442 + },
1443 + "svelte": {
1444 + "optional": true
1445 + },
1446 + "vue": {
1447 + "optional": true
1448 + }
1449 + }
1450 + },
1451 + "node_modules/ai/node_modules/nanoid": {
1452 + "version": "3.3.6",
1453 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/nanoid/-/nanoid-3.3.6.tgz",
1454 + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
1455 + "bin": {
1456 + "nanoid": "bin/nanoid.cjs"
1457 + },
1458 + "engines": {
1459 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1460 + }
1461 + },
1462 "node_modules/ajv": {
1463 "version": "6.12.6",
1464 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -757,17 +1496,42 @@
1496 "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1497 }
1498 },
1499 + "node_modules/any-promise": {
1500 + "version": "1.3.0",
1501 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/any-promise/-/any-promise-1.3.0.tgz",
1502 + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1503 + "dev": true
1504 + },
1505 + "node_modules/anymatch": {
1506 + "version": "3.1.3",
1507 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/anymatch/-/anymatch-3.1.3.tgz",
1508 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1509 + "dev": true,
1510 + "dependencies": {
1511 + "normalize-path": "^3.0.0",
1512 + "picomatch": "^2.0.4"
1513 + },
1514 + "engines": {
1515 + "node": ">= 8"
1516 + }
1517 + },
1518 + "node_modules/arg": {
1519 + "version": "5.0.2",
1520 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/arg/-/arg-5.0.2.tgz",
1521 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1522 + "dev": true
1523 + },
1524 "node_modules/argparse": {
1525 "version": "2.0.1",
1526 "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1527 "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
1528 },
1529 "node_modules/aria-query": {
766 - "version": "5.1.3",
767 - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
768 - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
1530 + "version": "5.3.0",
1531 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/aria-query/-/aria-query-5.3.0.tgz",
1532 + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
1533 "dependencies": {
770 - "deep-equal": "^2.0.5"
1534 + "dequal": "^2.0.3"
1535 }
1536 },
1537 "node_modules/array-buffer-byte-length": {
@@ -912,6 +1676,29 @@
1676 "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
1677 "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="
1678 },
1679 + "node_modules/autoprefixer": {
1680 + "version": "10.4.19",
1681 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/autoprefixer/-/autoprefixer-10.4.19.tgz",
1682 + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
1683 + "dev": true,
1684 + "dependencies": {
1685 + "browserslist": "^4.23.0",
1686 + "caniuse-lite": "^1.0.30001599",
1687 + "fraction.js": "^4.3.7",
1688 + "normalize-range": "^0.1.2",
1689 + "picocolors": "^1.0.0",
1690 + "postcss-value-parser": "^4.2.0"
1691 + },
1692 + "bin": {
1693 + "autoprefixer": "bin/autoprefixer"
1694 + },
1695 + "engines": {
1696 + "node": "^10 || ^12 || >=14"
1697 + },
1698 + "peerDependencies": {
1699 + "postcss": "^8.1.0"
1700 + }
1701 + },
1702 "node_modules/available-typed-arrays": {
1703 "version": "1.0.7",
1704 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -944,6 +1731,15 @@
1731 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1732 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
1733 },
1734 + "node_modules/binary-extensions": {
1735 + "version": "2.3.0",
1736 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/binary-extensions/-/binary-extensions-2.3.0.tgz",
1737 + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1738 + "dev": true,
1739 + "engines": {
1740 + "node": ">=8"
1741 + }
1742 + },
1743 "node_modules/brace-expansion": {
1744 "version": "1.1.11",
1745 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -964,6 +1760,24 @@
1760 "node": ">=8"
1761 }
1762 },
1763 + "node_modules/browserslist": {
1764 + "version": "4.23.0",
1765 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/browserslist/-/browserslist-4.23.0.tgz",
1766 + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
1767 + "dev": true,
1768 + "dependencies": {
1769 + "caniuse-lite": "^1.0.30001587",
1770 + "electron-to-chromium": "^1.4.668",
1771 + "node-releases": "^2.0.14",
1772 + "update-browserslist-db": "^1.0.13"
1773 + },
1774 + "bin": {
1775 + "browserslist": "cli.js"
1776 + },
1777 + "engines": {
1778 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1779 + }
1780 + },
1781 "node_modules/busboy": {
1782 "version": "1.6.0",
1783 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/busboy/-/busboy-1.6.0.tgz",
@@ -998,6 +1812,15 @@
1812 "node": ">=6"
1813 }
1814 },
1815 + "node_modules/camelcase-css": {
1816 + "version": "2.0.1",
1817 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/camelcase-css/-/camelcase-css-2.0.1.tgz",
1818 + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1819 + "dev": true,
1820 + "engines": {
1821 + "node": ">= 6"
1822 + }
1823 + },
1824 "node_modules/caniuse-lite": {
1825 "version": "1.0.30001609",
1826 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz",
@@ -1018,11 +1841,81 @@
1841 "url": "https://github.com/chalk/chalk?sponsor=1"
1842 }
1843 },
1844 + "node_modules/chokidar": {
1845 + "version": "3.6.0",
1846 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/chokidar/-/chokidar-3.6.0.tgz",
1847 + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1848 + "dev": true,
1849 + "dependencies": {
1850 + "anymatch": "~3.1.2",
1851 + "braces": "~3.0.2",
1852 + "glob-parent": "~5.1.2",
1853 + "is-binary-path": "~2.1.0",
1854 + "is-glob": "~4.0.1",
1855 + "normalize-path": "~3.0.0",
1856 + "readdirp": "~3.6.0"
1857 + },
1858 + "engines": {
1859 + "node": ">= 8.10.0"
1860 + },
1861 + "optionalDependencies": {
1862 + "fsevents": "~2.3.2"
1863 + }
1864 + },
1865 + "node_modules/chokidar/node_modules/glob-parent": {
1866 + "version": "5.1.2",
1867 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/glob-parent/-/glob-parent-5.1.2.tgz",
1868 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1869 + "dev": true,
1870 + "dependencies": {
1871 + "is-glob": "^4.0.1"
1872 + },
1873 + "engines": {
1874 + "node": ">= 6"
1875 + }
1876 + },
1877 + "node_modules/class-variance-authority": {
1878 + "version": "0.7.0",
1879 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/class-variance-authority/-/class-variance-authority-0.7.0.tgz",
1880 + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==",
1881 + "dependencies": {
1882 + "clsx": "2.0.0"
1883 + }
1884 + },
1885 + "node_modules/class-variance-authority/node_modules/clsx": {
1886 + "version": "2.0.0",
1887 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/clsx/-/clsx-2.0.0.tgz",
1888 + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
1889 + "engines": {
1890 + "node": ">=6"
1891 + }
1892 + },
1893 "node_modules/client-only": {
1894 "version": "0.0.1",
1895 "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
1896 "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
1897 },
1898 + "node_modules/clsx": {
1899 + "version": "1.2.1",
1900 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/clsx/-/clsx-1.2.1.tgz",
1901 + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
1902 + "engines": {
1903 + "node": ">=6"
1904 + }
1905 + },
1906 + "node_modules/code-red": {
1907 + "version": "1.0.4",
1908 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/code-red/-/code-red-1.0.4.tgz",
1909 + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
1910 + "peer": true,
1911 + "dependencies": {
1912 + "@jridgewell/sourcemap-codec": "^1.4.15",
1913 + "@types/estree": "^1.0.1",
1914 + "acorn": "^8.10.0",
1915 + "estree-walker": "^3.0.3",
1916 + "periscopic": "^3.1.0"
1917 + }
1918 + },
1919 "node_modules/color-convert": {
1920 "version": "2.0.1",
1921 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1039,6 +1932,15 @@
1932 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1933 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1934 },
1935 + "node_modules/commander": {
1936 + "version": "4.1.1",
1937 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/commander/-/commander-4.1.1.tgz",
1938 + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1939 + "dev": true,
1940 + "engines": {
1941 + "node": ">= 6"
1942 + }
1943 + },
1944 "node_modules/concat-map": {
1945 "version": "0.0.1",
1946 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -1057,10 +1959,35 @@
1959 "node": ">= 8"
1960 }
1961 },
1962 + "node_modules/css-tree": {
1963 + "version": "2.3.1",
1964 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/css-tree/-/css-tree-2.3.1.tgz",
1965 + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
1966 + "peer": true,
1967 + "dependencies": {
1968 + "mdn-data": "2.0.30",
1969 + "source-map-js": "^1.0.1"
1970 + },
1971 + "engines": {
1972 + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
1973 + }
1974 + },
1975 + "node_modules/cssesc": {
1976 + "version": "3.0.0",
1977 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/cssesc/-/cssesc-3.0.0.tgz",
1978 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1979 + "dev": true,
1980 + "bin": {
1981 + "cssesc": "bin/cssesc"
1982 + },
1983 + "engines": {
1984 + "node": ">=4"
1985 + }
1986 + },
1987 "node_modules/csstype": {
1061 - "version": "3.1.1",
1062 - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
1063 - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
1988 + "version": "3.1.3",
1989 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/csstype/-/csstype-3.1.3.tgz",
1990 + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
1991 },
1992 "node_modules/damerau-levenshtein": {
1993 "version": "1.0.8",
@@ -1188,6 +2115,20 @@
2115 "node": ">= 0.4"
2116 }
2117 },
2118 + "node_modules/dequal": {
2119 + "version": "2.0.3",
2120 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/dequal/-/dequal-2.0.3.tgz",
2121 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
2122 + "engines": {
2123 + "node": ">=6"
2124 + }
2125 + },
2126 + "node_modules/didyoumean": {
2127 + "version": "1.2.2",
2128 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/didyoumean/-/didyoumean-1.2.2.tgz",
2129 + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
2130 + "dev": true
2131 + },
2132 "node_modules/dir-glob": {
2133 "version": "3.0.1",
2134 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -1199,6 +2140,12 @@
2140 "node": ">=8"
2141 }
2142 },
2143 + "node_modules/dlv": {
2144 + "version": "1.1.3",
2145 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/dlv/-/dlv-1.1.3.tgz",
2146 + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
2147 + "dev": true
2148 + },
2149 "node_modules/doctrine": {
2150 "version": "3.0.0",
2151 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -1215,6 +2162,12 @@
2162 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
2163 "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
2164 },
2165 + "node_modules/electron-to-chromium": {
2166 + "version": "1.4.736",
2167 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz",
2168 + "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==",
2169 + "dev": true
2170 + },
2171 "node_modules/emoji-regex": {
2172 "version": "9.2.2",
2173 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -1232,6 +2185,15 @@
2185 "node": ">=10.13.0"
2186 }
2187 },
2188 + "node_modules/entities": {
2189 + "version": "4.5.0",
2190 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/entities/-/entities-4.5.0.tgz",
2191 + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
2192 + "peer": true,
2193 + "engines": {
2194 + "node": ">=0.12"
2195 + }
2196 + },
2197 "node_modules/es-abstract": {
2198 "version": "1.23.3",
2199 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/es-abstract/-/es-abstract-1.23.3.tgz",
@@ -1398,6 +2360,15 @@
2360 "url": "https://github.com/sponsors/ljharb"
2361 }
2362 },
2363 + "node_modules/escalade": {
2364 + "version": "3.1.2",
2365 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/escalade/-/escalade-3.1.2.tgz",
2366 + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
2367 + "dev": true,
2368 + "engines": {
2369 + "node": ">=6"
2370 + }
2371 + },
2372 "node_modules/escape-string-regexp": {
2373 "version": "4.0.0",
2374 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -1843,6 +2814,15 @@
2814 "node": ">=4.0"
2815 }
2816 },
2817 + "node_modules/estree-walker": {
2818 + "version": "3.0.3",
2819 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/estree-walker/-/estree-walker-3.0.3.tgz",
2820 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
2821 + "peer": true,
2822 + "dependencies": {
2823 + "@types/estree": "^1.0.0"
2824 + }
2825 + },
2826 "node_modules/esutils": {
2827 "version": "2.0.3",
2828 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -1851,15 +2831,23 @@
2831 "node": ">=0.10.0"
2832 }
2833 },
2834 + "node_modules/eventsource-parser": {
2835 + "version": "1.0.0",
2836 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/eventsource-parser/-/eventsource-parser-1.0.0.tgz",
2837 + "integrity": "sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==",
2838 + "engines": {
2839 + "node": ">=14.18"
2840 + }
2841 + },
2842 "node_modules/fast-deep-equal": {
2843 "version": "3.1.3",
2844 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
2845 "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
2846 },
2847 "node_modules/fast-glob": {
1860 - "version": "3.2.12",
1861 - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
1862 - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
2848 + "version": "3.3.2",
2849 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/fast-glob/-/fast-glob-3.3.2.tgz",
2850 + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
2851 "dependencies": {
2852 "@nodelib/fs.stat": "^2.0.2",
2853 "@nodelib/fs.walk": "^1.2.3",
@@ -1974,11 +2962,34 @@
2962 "node": ">=14"
2963 }
2964 },
2965 + "node_modules/fraction.js": {
2966 + "version": "4.3.7",
2967 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/fraction.js/-/fraction.js-4.3.7.tgz",
2968 + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
2969 + "dev": true,
2970 + "engines": {
2971 + "node": "*"
2972 + }
2973 + },
2974 "node_modules/fs.realpath": {
2975 "version": "1.0.0",
2976 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2977 "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
2978 },
2979 + "node_modules/fsevents": {
2980 + "version": "2.3.3",
2981 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/fsevents/-/fsevents-2.3.3.tgz",
2982 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
2983 + "dev": true,
2984 + "hasInstallScript": true,
2985 + "optional": true,
2986 + "os": [
2987 + "darwin"
2988 + ],
2989 + "engines": {
2990 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2991 + }
2992 + },
2993 "node_modules/function-bind": {
2994 "version": "1.1.2",
2995 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/function-bind/-/function-bind-1.1.2.tgz",
@@ -2129,6 +3140,14 @@
3140 "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
3141 "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
3142 },
3143 + "node_modules/goober": {
3144 + "version": "2.1.14",
3145 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/goober/-/goober-2.1.14.tgz",
3146 + "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==",
3147 + "peerDependencies": {
3148 + "csstype": "^3.0.10"
3149 + }
3150 + },
3151 "node_modules/gopd": {
3152 "version": "1.0.1",
3153 "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
@@ -2333,6 +3352,18 @@
3352 "url": "https://github.com/sponsors/ljharb"
3353 }
3354 },
3355 + "node_modules/is-binary-path": {
3356 + "version": "2.1.0",
3357 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/is-binary-path/-/is-binary-path-2.1.0.tgz",
3358 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
3359 + "dev": true,
3360 + "dependencies": {
3361 + "binary-extensions": "^2.0.0"
3362 + },
3363 + "engines": {
3364 + "node": ">=8"
3365 + }
3366 + },
3367 "node_modules/is-boolean-object": {
3368 "version": "1.1.2",
3369 "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
@@ -2498,6 +3529,15 @@
3529 "node": ">=8"
3530 }
3531 },
3532 + "node_modules/is-reference": {
3533 + "version": "3.0.2",
3534 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/is-reference/-/is-reference-3.0.2.tgz",
3535 + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
3536 + "peer": true,
3537 + "dependencies": {
3538 + "@types/estree": "*"
3539 + }
3540 + },
3541 "node_modules/is-regex": {
3542 "version": "1.1.4",
3543 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -2649,6 +3689,15 @@
3689 "@pkgjs/parseargs": "^0.11.0"
3690 }
3691 },
3692 + "node_modules/jiti": {
3693 + "version": "1.21.0",
3694 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/jiti/-/jiti-1.21.0.tgz",
3695 + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
3696 + "dev": true,
3697 + "bin": {
3698 + "jiti": "bin/jiti.js"
3699 + }
3700 + },
3701 "node_modules/js-sdsl": {
3702 "version": "4.2.0",
3703 "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
@@ -2732,6 +3781,27 @@
3781 "node": ">= 0.8.0"
3782 }
3783 },
3784 + "node_modules/lilconfig": {
3785 + "version": "2.1.0",
3786 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/lilconfig/-/lilconfig-2.1.0.tgz",
3787 + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
3788 + "dev": true,
3789 + "engines": {
3790 + "node": ">=10"
3791 + }
3792 + },
3793 + "node_modules/lines-and-columns": {
3794 + "version": "1.2.4",
3795 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
3796 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
3797 + "dev": true
3798 + },
3799 + "node_modules/locate-character": {
3800 + "version": "3.0.0",
3801 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/locate-character/-/locate-character-3.0.0.tgz",
3802 + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
3803 + "peer": true
3804 + },
3805 "node_modules/locate-path": {
3806 "version": "6.0.0",
3807 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -2746,6 +3816,18 @@
3816 "url": "https://github.com/sponsors/sindresorhus"
3817 }
3818 },
3819 + "node_modules/lodash.castarray": {
3820 + "version": "4.4.0",
3821 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
3822 + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
3823 + "dev": true
3824 + },
3825 + "node_modules/lodash.isplainobject": {
3826 + "version": "4.0.6",
3827 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
3828 + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
3829 + "dev": true
3830 + },
3831 "node_modules/lodash.merge": {
3832 "version": "4.6.2",
3833 "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -2773,6 +3855,21 @@
3855 "node": ">=10"
3856 }
3857 },
3858 + "node_modules/magic-string": {
3859 + "version": "0.30.10",
3860 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/magic-string/-/magic-string-0.30.10.tgz",
3861 + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
3862 + "peer": true,
3863 + "dependencies": {
3864 + "@jridgewell/sourcemap-codec": "^1.4.15"
3865 + }
3866 + },
3867 + "node_modules/mdn-data": {
3868 + "version": "2.0.30",
3869 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/mdn-data/-/mdn-data-2.0.30.tgz",
3870 + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
3871 + "peer": true
3872 + },
3873 "node_modules/merge2": {
3874 "version": "1.4.1",
3875 "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -2793,6 +3890,15 @@
3890 "node": ">=8.6"
3891 }
3892 },
3893 + "node_modules/mini-svg-data-uri": {
3894 + "version": "1.4.4",
3895 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
3896 + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
3897 + "dev": true,
3898 + "bin": {
3899 + "mini-svg-data-uri": "cli.js"
3900 + }
3901 + },
3902 "node_modules/minimatch": {
3903 "version": "3.1.2",
3904 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -2822,6 +3928,17 @@
3928 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
3929 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
3930 },
3931 + "node_modules/mz": {
3932 + "version": "2.7.0",
3933 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/mz/-/mz-2.7.0.tgz",
3934 + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
3935 + "dev": true,
3936 + "dependencies": {
3937 + "any-promise": "^1.0.0",
3938 + "object-assign": "^4.0.1",
3939 + "thenify-all": "^1.0.0"
3940 + }
3941 + },
3942 "node_modules/nanoid": {
3943 "version": "3.3.7",
3944 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/nanoid/-/nanoid-3.3.7.tgz",
@@ -2883,6 +4000,43 @@
4000 }
4001 }
4002 },
4003 + "node_modules/next/node_modules/postcss": {
4004 + "version": "8.4.31",
4005 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss/-/postcss-8.4.31.tgz",
4006 + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
4007 + "dependencies": {
4008 + "nanoid": "^3.3.6",
4009 + "picocolors": "^1.0.0",
4010 + "source-map-js": "^1.0.2"
4011 + },
4012 + "engines": {
4013 + "node": "^10 || ^12 || >=14"
4014 + }
4015 + },
4016 + "node_modules/node-releases": {
4017 + "version": "2.0.14",
4018 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/node-releases/-/node-releases-2.0.14.tgz",
4019 + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
4020 + "dev": true
4021 + },
4022 + "node_modules/normalize-path": {
4023 + "version": "3.0.0",
4024 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/normalize-path/-/normalize-path-3.0.0.tgz",
4025 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
4026 + "dev": true,
4027 + "engines": {
4028 + "node": ">=0.10.0"
4029 + }
4030 + },
4031 + "node_modules/normalize-range": {
4032 + "version": "0.1.2",
4033 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/normalize-range/-/normalize-range-0.1.2.tgz",
4034 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
4035 + "dev": true,
4036 + "engines": {
4037 + "node": ">=0.10.0"
4038 + }
4039 + },
4040 "node_modules/object-assign": {
4041 "version": "4.1.1",
4042 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/object-assign/-/object-assign-4.1.1.tgz",
@@ -2891,6 +4045,15 @@
4045 "node": ">=0.10.0"
4046 }
4047 },
4048 + "node_modules/object-hash": {
4049 + "version": "3.0.0",
4050 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/object-hash/-/object-hash-3.0.0.tgz",
4051 + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
4052 + "dev": true,
4053 + "engines": {
4054 + "node": ">= 6"
4055 + }
4056 + },
4057 "node_modules/object-inspect": {
4058 "version": "1.13.1",
4059 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/object-inspect/-/object-inspect-1.13.1.tgz",
@@ -3127,51 +4290,180 @@
4290 "node": "14 || >=16.14"
4291 }
4292 },
3130 - "node_modules/path-type": {
3131 - "version": "4.0.0",
3132 - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
3133 - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
4293 + "node_modules/path-type": {
4294 + "version": "4.0.0",
4295 + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
4296 + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
4297 + "engines": {
4298 + "node": ">=8"
4299 + }
4300 + },
4301 + "node_modules/periscopic": {
4302 + "version": "3.1.0",
4303 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/periscopic/-/periscopic-3.1.0.tgz",
4304 + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
4305 + "peer": true,
4306 + "dependencies": {
4307 + "@types/estree": "^1.0.0",
4308 + "estree-walker": "^3.0.0",
4309 + "is-reference": "^3.0.0"
4310 + }
4311 + },
4312 + "node_modules/picocolors": {
4313 + "version": "1.0.0",
4314 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
4315 + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
4316 + },
4317 + "node_modules/picomatch": {
4318 + "version": "2.3.1",
4319 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
4320 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
4321 + "engines": {
4322 + "node": ">=8.6"
4323 + },
4324 + "funding": {
4325 + "url": "https://github.com/sponsors/jonschlinkert"
4326 + }
4327 + },
4328 + "node_modules/pify": {
4329 + "version": "2.3.0",
4330 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/pify/-/pify-2.3.0.tgz",
4331 + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
4332 + "dev": true,
4333 + "engines": {
4334 + "node": ">=0.10.0"
4335 + }
4336 + },
4337 + "node_modules/pirates": {
4338 + "version": "4.0.6",
4339 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/pirates/-/pirates-4.0.6.tgz",
4340 + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
4341 + "dev": true,
4342 + "engines": {
4343 + "node": ">= 6"
4344 + }
4345 + },
4346 + "node_modules/possible-typed-array-names": {
4347 + "version": "1.0.0",
4348 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
4349 + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
4350 + "engines": {
4351 + "node": ">= 0.4"
4352 + }
4353 + },
4354 + "node_modules/postcss": {
4355 + "version": "8.4.38",
4356 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss/-/postcss-8.4.38.tgz",
4357 + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
4358 + "dependencies": {
4359 + "nanoid": "^3.3.7",
4360 + "picocolors": "^1.0.0",
4361 + "source-map-js": "^1.2.0"
4362 + },
4363 + "engines": {
4364 + "node": "^10 || ^12 || >=14"
4365 + }
4366 + },
4367 + "node_modules/postcss-import": {
4368 + "version": "15.1.0",
4369 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss-import/-/postcss-import-15.1.0.tgz",
4370 + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
4371 + "dev": true,
4372 + "dependencies": {
4373 + "postcss-value-parser": "^4.0.0",
4374 + "read-cache": "^1.0.0",
4375 + "resolve": "^1.1.7"
4376 + },
4377 + "engines": {
4378 + "node": ">=14.0.0"
4379 + },
4380 + "peerDependencies": {
4381 + "postcss": "^8.0.0"
4382 + }
4383 + },
4384 + "node_modules/postcss-js": {
4385 + "version": "4.0.1",
4386 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss-js/-/postcss-js-4.0.1.tgz",
4387 + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
4388 + "dev": true,
4389 + "dependencies": {
4390 + "camelcase-css": "^2.0.1"
4391 + },
4392 + "engines": {
4393 + "node": "^12 || ^14 || >= 16"
4394 + },
4395 + "peerDependencies": {
4396 + "postcss": "^8.4.21"
4397 + }
4398 + },
4399 + "node_modules/postcss-load-config": {
4400 + "version": "4.0.2",
4401 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
4402 + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
4403 + "dev": true,
4404 + "dependencies": {
4405 + "lilconfig": "^3.0.0",
4406 + "yaml": "^2.3.4"
4407 + },
4408 "engines": {
3135 - "node": ">=8"
4409 + "node": ">= 14"
4410 + },
4411 + "peerDependencies": {
4412 + "postcss": ">=8.0.9",
4413 + "ts-node": ">=9.0.0"
4414 + },
4415 + "peerDependenciesMeta": {
4416 + "postcss": {
4417 + "optional": true
4418 + },
4419 + "ts-node": {
4420 + "optional": true
4421 + }
4422 }
4423 },
3138 - "node_modules/picocolors": {
3139 - "version": "1.0.0",
3140 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
3141 - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
3142 - },
3143 - "node_modules/picomatch": {
3144 - "version": "2.3.1",
3145 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
3146 - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
4424 + "node_modules/postcss-load-config/node_modules/lilconfig": {
4425 + "version": "3.1.1",
4426 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/lilconfig/-/lilconfig-3.1.1.tgz",
4427 + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
4428 + "dev": true,
4429 "engines": {
3148 - "node": ">=8.6"
3149 - },
3150 - "funding": {
3151 - "url": "https://github.com/sponsors/jonschlinkert"
4430 + "node": ">=14"
4431 }
4432 },
3154 - "node_modules/possible-typed-array-names": {
3155 - "version": "1.0.0",
3156 - "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
3157 - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
4433 + "node_modules/postcss-nested": {
4434 + "version": "6.0.1",
4435 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss-nested/-/postcss-nested-6.0.1.tgz",
4436 + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
4437 + "dev": true,
4438 + "dependencies": {
4439 + "postcss-selector-parser": "^6.0.11"
4440 + },
4441 "engines": {
3159 - "node": ">= 0.4"
4442 + "node": ">=12.0"
4443 + },
4444 + "peerDependencies": {
4445 + "postcss": "^8.2.14"
4446 }
4447 },
3162 - "node_modules/postcss": {
3163 - "version": "8.4.31",
3164 - "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss/-/postcss-8.4.31.tgz",
3165 - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
4448 + "node_modules/postcss-selector-parser": {
4449 + "version": "6.0.16",
4450 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
4451 + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
4452 + "dev": true,
4453 "dependencies": {
3167 - "nanoid": "^3.3.6",
3168 - "picocolors": "^1.0.0",
3169 - "source-map-js": "^1.0.2"
4454 + "cssesc": "^3.0.0",
4455 + "util-deprecate": "^1.0.2"
4456 },
4457 "engines": {
3172 - "node": "^10 || ^12 || >=14"
4458 + "node": ">=4"
4459 }
4460 },
4461 + "node_modules/postcss-value-parser": {
4462 + "version": "4.2.0",
4463 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
4464 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
4465 + "dev": true
4466 + },
4467 "node_modules/prelude-ls": {
4468 "version": "1.2.1",
4469 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -3240,11 +4532,63 @@
4532 "react": "^18.2.0"
4533 }
4534 },
4535 + "node_modules/react-hot-toast": {
4536 + "version": "2.4.1",
4537 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/react-hot-toast/-/react-hot-toast-2.4.1.tgz",
4538 + "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==",
4539 + "dependencies": {
4540 + "goober": "^2.1.10"
4541 + },
4542 + "engines": {
4543 + "node": ">=10"
4544 + },
4545 + "peerDependencies": {
4546 + "react": ">=16",
4547 + "react-dom": ">=16"
4548 + }
4549 + },
4550 "node_modules/react-is": {
4551 "version": "16.13.1",
4552 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/react-is/-/react-is-16.13.1.tgz",
4553 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
4554 },
4555 + "node_modules/react-textarea-autosize": {
4556 + "version": "8.5.3",
4557 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz",
4558 + "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==",
4559 + "dependencies": {
4560 + "@babel/runtime": "^7.20.13",
4561 + "use-composed-ref": "^1.3.0",
4562 + "use-latest": "^1.2.1"
4563 + },
4564 + "engines": {
4565 + "node": ">=10"
4566 + },
4567 + "peerDependencies": {
4568 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
4569 + }
4570 + },
4571 + "node_modules/read-cache": {
4572 + "version": "1.0.0",
4573 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/read-cache/-/read-cache-1.0.0.tgz",
4574 + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
4575 + "dev": true,
4576 + "dependencies": {
4577 + "pify": "^2.3.0"
4578 + }
4579 + },
4580 + "node_modules/readdirp": {
4581 + "version": "3.6.0",
4582 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/readdirp/-/readdirp-3.6.0.tgz",
4583 + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
4584 + "dev": true,
4585 + "dependencies": {
4586 + "picomatch": "^2.2.1"
4587 + },
4588 + "engines": {
4589 + "node": ">=8.10.0"
4590 + }
4591 + },
4592 "node_modules/reflect.getprototypeof": {
4593 "version": "1.0.6",
4594 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
@@ -3263,9 +4607,9 @@
4607 }
4608 },
4609 "node_modules/regenerator-runtime": {
3266 - "version": "0.13.11",
3267 - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
3268 - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
4610 + "version": "0.14.1",
4611 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
4612 + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
4613 },
4614 "node_modules/regexp.prototype.flags": {
4615 "version": "1.5.2",
@@ -3407,6 +4751,27 @@
4751 "node": ">=10"
4752 }
4753 },
4754 + "node_modules/seroval": {
4755 + "version": "1.0.5",
4756 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/seroval/-/seroval-1.0.5.tgz",
4757 + "integrity": "sha512-TM+Z11tHHvQVQKeNlOUonOWnsNM+2IBwZ4vwoi4j3zKzIpc5IDw8WPwCfcc8F17wy6cBcJGbZbFOR0UCuTZHQA==",
4758 + "peer": true,
4759 + "engines": {
4760 + "node": ">=10"
4761 + }
4762 + },
4763 + "node_modules/seroval-plugins": {
4764 + "version": "1.0.5",
4765 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/seroval-plugins/-/seroval-plugins-1.0.5.tgz",
4766 + "integrity": "sha512-8+pDC1vOedPXjKG7oz8o+iiHrtF2WswaMQJ7CKFpccvSYfrzmvKY9zOJWCg+881722wIHfwkdnRmiiDm9ym+zQ==",
4767 + "peer": true,
4768 + "engines": {
4769 + "node": ">=10"
4770 + },
4771 + "peerDependencies": {
4772 + "seroval": "^1.0"
4773 + }
4774 + },
4775 "node_modules/set-function-length": {
4776 "version": "1.2.2",
4777 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/set-function-length/-/set-function-length-1.2.2.tgz",
@@ -3486,6 +4851,29 @@
4851 "node": ">=8"
4852 }
4853 },
4854 + "node_modules/solid-js": {
4855 + "version": "1.8.16",
4856 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/solid-js/-/solid-js-1.8.16.tgz",
4857 + "integrity": "sha512-rja94MNU9flF3qQRLNsu60QHKBDKBkVE1DldJZPIfn2ypIn3NV2WpSbGTQIvsyGPBo+9E2IMjwqnqpbgfWuzeg==",
4858 + "peer": true,
4859 + "dependencies": {
4860 + "csstype": "^3.1.0",
4861 + "seroval": "^1.0.4",
4862 + "seroval-plugins": "^1.0.3"
4863 + }
4864 + },
4865 + "node_modules/solid-swr-store": {
4866 + "version": "0.10.7",
4867 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/solid-swr-store/-/solid-swr-store-0.10.7.tgz",
4868 + "integrity": "sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==",
4869 + "engines": {
4870 + "node": ">=10"
4871 + },
4872 + "peerDependencies": {
4873 + "solid-js": "^1.2",
4874 + "swr-store": "^0.10"
4875 + }
4876 + },
4877 "node_modules/source-map-js": {
4878 "version": "1.2.0",
4879 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/source-map-js/-/source-map-js-1.2.0.tgz",
@@ -3494,6 +4882,17 @@
4882 "node": ">=0.10.0"
4883 }
4884 },
4885 + "node_modules/sswr": {
4886 + "version": "2.0.0",
4887 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/sswr/-/sswr-2.0.0.tgz",
4888 + "integrity": "sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==",
4889 + "dependencies": {
4890 + "swrev": "^4.0.0"
4891 + },
4892 + "peerDependencies": {
4893 + "svelte": "^4.0.0"
4894 + }
4895 + },
4896 "node_modules/stop-iteration-iterator": {
4897 "version": "1.0.0",
4898 "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
@@ -3687,6 +5086,68 @@
5086 }
5087 }
5088 },
5089 + "node_modules/sucrase": {
5090 + "version": "3.35.0",
5091 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/sucrase/-/sucrase-3.35.0.tgz",
5092 + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
5093 + "dev": true,
5094 + "dependencies": {
5095 + "@jridgewell/gen-mapping": "^0.3.2",
5096 + "commander": "^4.0.0",
5097 + "glob": "^10.3.10",
5098 + "lines-and-columns": "^1.1.6",
5099 + "mz": "^2.7.0",
5100 + "pirates": "^4.0.1",
5101 + "ts-interface-checker": "^0.1.9"
5102 + },
5103 + "bin": {
5104 + "sucrase": "bin/sucrase",
5105 + "sucrase-node": "bin/sucrase-node"
5106 + },
5107 + "engines": {
5108 + "node": ">=16 || 14 >=14.17"
5109 + }
5110 + },
5111 + "node_modules/sucrase/node_modules/brace-expansion": {
5112 + "version": "2.0.1",
5113 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/brace-expansion/-/brace-expansion-2.0.1.tgz",
5114 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
5115 + "dev": true,
5116 + "dependencies": {
5117 + "balanced-match": "^1.0.0"
5118 + }
5119 + },
5120 + "node_modules/sucrase/node_modules/glob": {
5121 + "version": "10.3.12",
5122 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/glob/-/glob-10.3.12.tgz",
5123 + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
5124 + "dev": true,
5125 + "dependencies": {
5126 + "foreground-child": "^3.1.0",
5127 + "jackspeak": "^2.3.6",
5128 + "minimatch": "^9.0.1",
5129 + "minipass": "^7.0.4",
5130 + "path-scurry": "^1.10.2"
5131 + },
5132 + "bin": {
5133 + "glob": "dist/esm/bin.mjs"
5134 + },
5135 + "engines": {
5136 + "node": ">=16 || 14 >=14.17"
5137 + }
5138 + },
5139 + "node_modules/sucrase/node_modules/minimatch": {
5140 + "version": "9.0.4",
5141 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/minimatch/-/minimatch-9.0.4.tgz",
5142 + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
5143 + "dev": true,
5144 + "dependencies": {
5145 + "brace-expansion": "^2.0.1"
5146 + },
5147 + "engines": {
5148 + "node": ">=16 || 14 >=14.17"
5149 + }
5150 + },
5151 "node_modules/supports-color": {
5152 "version": "7.2.0",
5153 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -3706,6 +5167,75 @@
5167 "node": ">= 0.4"
5168 }
5169 },
5170 + "node_modules/svelte": {
5171 + "version": "4.2.15",
5172 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/svelte/-/svelte-4.2.15.tgz",
5173 + "integrity": "sha512-j9KJSccHgLeRERPlhMKrCXpk2TqL2m5Z+k+OBTQhZOhIdCCd3WfqV+ylPWeipEwq17P/ekiSFWwrVQv93i3bsg==",
5174 + "peer": true,
5175 + "dependencies": {
5176 + "@ampproject/remapping": "^2.2.1",
5177 + "@jridgewell/sourcemap-codec": "^1.4.15",
5178 + "@jridgewell/trace-mapping": "^0.3.18",
5179 + "@types/estree": "^1.0.1",
5180 + "acorn": "^8.9.0",
5181 + "aria-query": "^5.3.0",
5182 + "axobject-query": "^4.0.0",
5183 + "code-red": "^1.0.3",
5184 + "css-tree": "^2.3.1",
5185 + "estree-walker": "^3.0.3",
5186 + "is-reference": "^3.0.1",
5187 + "locate-character": "^3.0.0",
5188 + "magic-string": "^0.30.4",
5189 + "periscopic": "^3.1.0"
5190 + },
5191 + "engines": {
5192 + "node": ">=16"
5193 + }
5194 + },
5195 + "node_modules/svelte/node_modules/axobject-query": {
5196 + "version": "4.0.0",
5197 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/axobject-query/-/axobject-query-4.0.0.tgz",
5198 + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
5199 + "peer": true,
5200 + "dependencies": {
5201 + "dequal": "^2.0.3"
5202 + }
5203 + },
5204 + "node_modules/swr": {
5205 + "version": "2.2.0",
5206 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/swr/-/swr-2.2.0.tgz",
5207 + "integrity": "sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==",
5208 + "dependencies": {
5209 + "use-sync-external-store": "^1.2.0"
5210 + },
5211 + "peerDependencies": {
5212 + "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
5213 + }
5214 + },
5215 + "node_modules/swr-store": {
5216 + "version": "0.10.6",
5217 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/swr-store/-/swr-store-0.10.6.tgz",
5218 + "integrity": "sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==",
5219 + "dependencies": {
5220 + "dequal": "^2.0.3"
5221 + },
5222 + "engines": {
5223 + "node": ">=10"
5224 + }
5225 + },
5226 + "node_modules/swrev": {
5227 + "version": "4.0.0",
5228 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/swrev/-/swrev-4.0.0.tgz",
5229 + "integrity": "sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA=="
5230 + },
5231 + "node_modules/swrv": {
5232 + "version": "1.0.4",
5233 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/swrv/-/swrv-1.0.4.tgz",
5234 + "integrity": "sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==",
5235 + "peerDependencies": {
5236 + "vue": ">=3.2.26 < 4"
5237 + }
5238 + },
5239 "node_modules/synckit": {
5240 "version": "0.8.4",
5241 "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz",
@@ -3721,6 +5251,51 @@
5251 "url": "https://opencollective.com/unts"
5252 }
5253 },
5254 + "node_modules/tailwind-merge": {
5255 + "version": "2.3.0",
5256 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/tailwind-merge/-/tailwind-merge-2.3.0.tgz",
5257 + "integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==",
5258 + "dependencies": {
5259 + "@babel/runtime": "^7.24.1"
5260 + }
5261 + },
5262 + "node_modules/tailwindcss": {
5263 + "version": "3.4.3",
5264 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/tailwindcss/-/tailwindcss-3.4.3.tgz",
5265 + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
5266 + "dev": true,
5267 + "dependencies": {
5268 + "@alloc/quick-lru": "^5.2.0",
5269 + "arg": "^5.0.2",
5270 + "chokidar": "^3.5.3",
5271 + "didyoumean": "^1.2.2",
5272 + "dlv": "^1.1.3",
5273 + "fast-glob": "^3.3.0",
5274 + "glob-parent": "^6.0.2",
5275 + "is-glob": "^4.0.3",
5276 + "jiti": "^1.21.0",
5277 + "lilconfig": "^2.1.0",
5278 + "micromatch": "^4.0.5",
5279 + "normalize-path": "^3.0.0",
5280 + "object-hash": "^3.0.0",
5281 + "picocolors": "^1.0.0",
5282 + "postcss": "^8.4.23",
5283 + "postcss-import": "^15.1.0",
5284 + "postcss-js": "^4.0.1",
5285 + "postcss-load-config": "^4.0.1",
5286 + "postcss-nested": "^6.0.1",
5287 + "postcss-selector-parser": "^6.0.11",
5288 + "resolve": "^1.22.2",
5289 + "sucrase": "^3.32.0"
5290 + },
5291 + "bin": {
5292 + "tailwind": "lib/cli.js",
5293 + "tailwindcss": "lib/cli.js"
5294 + },
5295 + "engines": {
5296 + "node": ">=14.0.0"
5297 + }
5298 + },
5299 "node_modules/tapable": {
5300 "version": "2.2.1",
5301 "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -3734,6 +5309,27 @@
5309 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
5310 "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
5311 },
5312 + "node_modules/thenify": {
5313 + "version": "3.3.1",
5314 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/thenify/-/thenify-3.3.1.tgz",
5315 + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
5316 + "dev": true,
5317 + "dependencies": {
5318 + "any-promise": "^1.0.0"
5319 + }
5320 + },
5321 + "node_modules/thenify-all": {
5322 + "version": "1.6.0",
5323 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/thenify-all/-/thenify-all-1.6.0.tgz",
5324 + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
5325 + "dev": true,
5326 + "dependencies": {
5327 + "thenify": ">= 3.1.0 < 4"
5328 + },
5329 + "engines": {
5330 + "node": ">=0.8"
5331 + }
5332 + },
5333 "node_modules/tiny-glob": {
5334 "version": "0.2.9",
5335 "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
@@ -3754,6 +5350,12 @@
5350 "node": ">=8.0"
5351 }
5352 },
5353 + "node_modules/ts-interface-checker": {
5354 + "version": "0.1.13",
5355 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
5356 + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
5357 + "dev": true
5358 + },
5359 "node_modules/tsconfig-paths": {
5360 "version": "3.15.0",
5361 "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
@@ -3897,6 +5499,22 @@
5499 "url": "https://github.com/sponsors/ljharb"
5500 }
5501 },
5502 + "node_modules/update-browserslist-db": {
5503 + "version": "1.0.13",
5504 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
5505 + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
5506 + "dev": true,
5507 + "dependencies": {
5508 + "escalade": "^3.1.1",
5509 + "picocolors": "^1.0.0"
5510 + },
5511 + "bin": {
5512 + "update-browserslist-db": "cli.js"
5513 + },
5514 + "peerDependencies": {
5515 + "browserslist": ">= 4.21.0"
5516 + }
5517 + },
5518 "node_modules/uri-js": {
5519 "version": "4.4.1",
5520 "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -3905,6 +5523,78 @@
5523 "punycode": "^2.1.0"
5524 }
5525 },
5526 + "node_modules/use-composed-ref": {
5527 + "version": "1.3.0",
5528 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/use-composed-ref/-/use-composed-ref-1.3.0.tgz",
5529 + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==",
5530 + "peerDependencies": {
5531 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
5532 + }
5533 + },
5534 + "node_modules/use-isomorphic-layout-effect": {
5535 + "version": "1.1.2",
5536 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
5537 + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==",
5538 + "peerDependencies": {
5539 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
5540 + },
5541 + "peerDependenciesMeta": {
5542 + "@types/react": {
5543 + "optional": true
5544 + }
5545 + }
5546 + },
5547 + "node_modules/use-latest": {
5548 + "version": "1.2.1",
5549 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/use-latest/-/use-latest-1.2.1.tgz",
5550 + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==",
5551 + "dependencies": {
5552 + "use-isomorphic-layout-effect": "^1.1.1"
5553 + },
5554 + "peerDependencies": {
5555 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
5556 + },
5557 + "peerDependenciesMeta": {
5558 + "@types/react": {
5559 + "optional": true
5560 + }
5561 + }
5562 + },
5563 + "node_modules/use-sync-external-store": {
5564 + "version": "1.2.0",
5565 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
5566 + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
5567 + "peerDependencies": {
5568 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
5569 + }
5570 + },
5571 + "node_modules/util-deprecate": {
5572 + "version": "1.0.2",
5573 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/util-deprecate/-/util-deprecate-1.0.2.tgz",
5574 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
5575 + "dev": true
5576 + },
5577 + "node_modules/vue": {
5578 + "version": "3.4.23",
5579 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/vue/-/vue-3.4.23.tgz",
5580 + "integrity": "sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==",
5581 + "peer": true,
5582 + "dependencies": {
5583 + "@vue/compiler-dom": "3.4.23",
5584 + "@vue/compiler-sfc": "3.4.23",
5585 + "@vue/runtime-dom": "3.4.23",
5586 + "@vue/server-renderer": "3.4.23",
5587 + "@vue/shared": "3.4.23"
5588 + },
5589 + "peerDependencies": {
5590 + "typescript": "*"
5591 + },
5592 + "peerDependenciesMeta": {
5593 + "typescript": {
5594 + "optional": true
5595 + }
5596 + }
5597 + },
5598 "node_modules/which": {
5599 "version": "2.0.2",
5600 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -4075,6 +5765,18 @@
5765 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
5766 "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
5767 },
5768 + "node_modules/yaml": {
5769 + "version": "2.4.1",
5770 + "resolved": "https://viaplay.jfrog.io/artifactory/api/npm/mtg-npm-virtual/yaml/-/yaml-2.4.1.tgz",
5771 + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
5772 + "dev": true,
5773 + "bin": {
5774 + "yaml": "bin.mjs"
5775 + },
5776 + "engines": {
5777 + "node": ">= 14"
5778 + }
5779 + },
5780 "node_modules/yocto-queue": {
5781 "version": "0.1.0",
5782 "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
package.json
+16 -2
@@ -3,18 +3,32 @@
3 "version": "0.1.0",
4 "private": true,
5 "dependencies": {
6 + "@heroicons/react": "1.0.6",
7 + "@radix-ui/react-slot": "^1.0.2",
8 + "@radix-ui/react-tooltip": "^1.0.7",
9 "@tauri-apps/api": "^1.5.3",
10 "@types/node": "18.17.0",
11 "@types/react": "18.2.78",
12 "@types/react-dom": "18.2.25",
13 + "class-variance-authority": "^0.7.0",
14 + "ai": "^2.2.33",
15 + "clsx": "1.2.1",
16 "eslint": "8.32.0",
17 "eslint-config-next": "14.1.0",
18 "next": "14.1.0",
19 "react": "18.2.0",
20 + "react-hot-toast": "^2.4.1",
21 + "react-textarea-autosize": "^8.5.3",
22 "react-dom": "18.2.0",
15 - "typescript": "4.9.4"
23 + "typescript": "4.9.4",
24 + "tailwind-merge": "^2.2.1"
25 },
26 "devDependencies": {
18 - "@tauri-apps/cli": "^1.5.11"
27 + "@tailwindcss/forms": "0.5.3",
28 + "@tailwindcss/typography": "0.5.9",
29 + "@tauri-apps/cli": "^1.5.11",
30 + "autoprefixer": "^10.4.19",
31 + "postcss": "^8.4.38",
32 + "tailwindcss": "^3.4.3"
33 }
34 }
pages/_app.tsx deleted
-6
@@ -1,6 +0,0 @@
1 -import '@/styles/globals.css'
2 -import type { AppProps } from 'next/app'
3 -
4 -export default function App({ Component, pageProps }: AppProps) {
5 - return <Component {...pageProps} />
6 -}
pages/_document.tsx deleted
-13
@@ -1,13 +0,0 @@
1 -import { Html, Head, Main, NextScript } from 'next/document'
2 -
3 -export default function Document() {
4 - return (
5 - <Html lang="en">
6 - <Head />
7 - <body>
8 - <Main />
9 - <NextScript />
10 - </body>
11 - </Html>
12 - )
13 -}
pages/api/hello.ts deleted
-13
@@ -1,13 +0,0 @@
1 -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
2 -import type { NextApiRequest, NextApiResponse } from 'next'
3 -
4 -type Data = {
5 - name: string
6 -}
7 -
8 -export default function handler(
9 - req: NextApiRequest,
10 - res: NextApiResponse<Data>
11 -) {
12 - res.status(200).json({ name: 'John Doe' })
13 -}
pages/index.tsx deleted
-114
@@ -1,114 +0,0 @@
1 -import Head from 'next/head'
2 -import Image from 'next/image'
3 -import { Inter } from "next/font/google"
4 -import styles from '@/styles/Home.module.css'
5 -
6 -const inter = Inter({ subsets: ['latin'] })
7 -
8 -export default function Home() {
9 - return (
10 - <>
11 - <Head>
12 - <title>Create Next App</title>
13 - <meta name="description" content="Generated by create next app" />
14 - <meta name="viewport" content="width=device-width, initial-scale=1" />
15 - <link rel="icon" href="/favicon.ico" />
16 - </Head>
17 - <main className={styles.main}>
18 - <div className={styles.description}>
19 - <p>
20 - Get started by editing&nbsp;
21 - <code className={styles.code}>pages/index.tsx</code>
22 - </p>
23 - <div>
24 - <a
25 - href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
26 - target="_blank"
27 - rel="noopener noreferrer"
28 - >
29 - By{' '}
30 - <Image
31 - src="/vercel.svg"
32 - alt="Vercel Logo"
33 - className={styles.vercelLogo}
34 - width={100}
35 - height={24}
36 - priority
37 - />
38 - </a>
39 - </div>
40 - </div>
41 -
42 - <div className={styles.center}>
43 - <Image
44 - className={styles.logo}
45 - src="/next.svg"
46 - alt="Next.js Logo"
47 - width={180}
48 - height={37}
49 - priority
50 - />
51 - </div>
52 -
53 - <div className={styles.grid}>
54 - <a
55 - href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
56 - className={styles.card}
57 - target="_blank"
58 - rel="noopener noreferrer"
59 - >
60 - <h2 className={inter.className}>
61 - Docs <span>-&gt;</span>
62 - </h2>
63 - <p className={inter.className}>
64 - Find in-depth information about Next.js features and&nbsp;API.
65 - </p>
66 - </a>
67 -
68 - <a
69 - href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
70 - className={styles.card}
71 - target="_blank"
72 - rel="noopener noreferrer"
73 - >
74 - <h2 className={inter.className}>
75 - Learn <span>-&gt;</span>
76 - </h2>
77 - <p className={inter.className}>
78 - Learn about Next.js in an interactive course with&nbsp;quizzes!
79 - </p>
80 - </a>
81 -
82 - <a
83 - href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
84 - className={styles.card}
85 - target="_blank"
86 - rel="noopener noreferrer"
87 - >
88 - <h2 className={inter.className}>
89 - Templates <span>-&gt;</span>
90 - </h2>
91 - <p className={inter.className}>
92 - Discover and deploy boilerplate example Next.js&nbsp;projects.
93 - </p>
94 - </a>
95 -
96 - <a
97 - href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
98 - className={styles.card}
99 - target="_blank"
100 - rel="noopener noreferrer"
101 - >
102 - <h2 className={inter.className}>
103 - Deploy <span>-&gt;</span>
104 - </h2>
105 - <p className={inter.className}>
106 - Instantly deploy your Next.js site to a shareable URL
107 - with&nbsp;Vercel.
108 - </p>
109 - </a>
110 - </div>
111 - </main>
112 - </>
113 - )
114 -}
postcss.config.js new
+6
@@ -0,0 +1,6 @@
1 +module.exports = {
2 + plugins: {
3 + tailwindcss: {},
4 + autoprefixer: {},
5 + },
6 +}
public/grid.svg new
+5
@@ -0,0 +1,5 @@
1 +
2 +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3 + <path d="M96,95h4v1H96v4H95V96H86v4H85V96H76v4H75V96H66v4H65V96H56v4H55V96H46v4H45V96H36v4H35V96H26v4H25V96H16v4H15V96H0V95H15V86H0V85H15V76H0V75H15V66H0V65H15V56H0V55H15V46H0V45H15V36H0V35H15V26H0V25H15V16H0V15H15V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96Zm-1,0V86H86v9ZM85,95V86H76v9ZM75,95V86H66v9ZM65,95V86H56v9ZM55,95V86H46v9ZM45,95V86H36v9ZM35,95V86H26v9ZM25,95V86H16v9ZM16,85h9V76H16Zm10,0h9V76H26Zm10,0h9V76H36Zm10,0h9V76H46Zm10,0h9V76H56Zm10,0h9V76H66Zm10,0h9V76H76Zm10,0h9V76H86Zm9-10V66H86v9ZM85,75V66H76v9ZM75,75V66H66v9ZM65,75V66H56v9ZM55,75V66H46v9ZM45,75V66H36v9ZM35,75V66H26v9ZM25,75V66H16v9ZM16,65h9V56H16Zm10,0h9V56H26Zm10,0h9V56H36Zm10,0h9V56H46Zm10,0h9V56H56Zm10,0h9V56H66Zm10,0h9V56H76Zm10,0h9V56H86Zm9-10V46H86v9ZM85,55V46H76v9ZM75,55V46H66v9ZM65,55V46H56v9ZM55,55V46H46v9ZM45,55V46H36v9ZM35,55V46H26v9ZM25,55V46H16v9ZM16,45h9V36H16Zm10,0h9V36H26Zm10,0h9V36H36Zm10,0h9V36H46Zm10,0h9V36H56Zm10,0h9V36H66Zm10,0h9V36H76Zm10,0h9V36H86Zm9-10V26H86v9ZM85,35V26H76v9ZM75,35V26H66v9ZM65,35V26H56v9ZM55,35V26H46v9ZM45,35V26H36v9ZM35,35V26H26v9ZM25,35V26H16v9ZM16,25h9V16H16Zm10,0h9V16H26Zm10,0h9V16H36Zm10,0h9V16H46Zm10,0h9V16H56Zm10,0h9V16H66Zm10,0h9V16H76Zm10,0h9V16H86Z" fill="rgba(255,255,255,0.2)" fill-rule="evenodd" opacity="0.2"/>
4 + <path d="M6,5V0H5V5H0V6H5v94H6V6h94V5Z" fill="rgba(255,255,255,0.075)" fill-rule="evenodd"/>
5 +</svg>
public/logo192.png
Binary files /dev/null and b/public/logo192.png differ
public/next.svg deleted
-3
@@ -1,3 +0,0 @@
1 -version https://git-lfs.github.com/spec/v1
2 -oid sha256:55995dfad6ecb4945a1e856ddca03c5e16aa5bf13fd21b4df6a74ae79357bcfc
3 -size 1375
public/thirteen.svg deleted
-3
@@ -1,3 +0,0 @@
1 -version https://git-lfs.github.com/spec/v1
2 -oid sha256:6a70cf328586a2b3e98f6f7f5ab88ae84732d4d4f0040d3ccc6b3a3ea0f1eab0
3 -size 1138
public/vercel.svg deleted
-3
@@ -1,3 +0,0 @@
1 -version https://git-lfs.github.com/spec/v1
2 -oid sha256:3fa5cd757b418e18afc68ddebad55f443206e410327921ddb2bf1be731658880
3 -size 629
screenshots/0.png
Binary files /dev/null and b/screenshots/0.png differ
screenshots/1.png
Binary files /dev/null and b/screenshots/1.png differ
src-tauri/src/main.rs
+1 -1
@@ -6,7 +6,7 @@
6 // Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
7 #[tauri::command]
8 fn greet(name: &str) -> String {
9 - format!("Hello, {}! You've been greeted from Rust!", name)
9 + format!("Hello, {}! You've been greeted from Rust!!!!", name)
10 }
11
12 fn main() {
src-tauri/tauri.conf.json
+1 -1
@@ -3,7 +3,7 @@
3 "beforeDevCommand": "node node_modules/next/dist/bin/next dev -p 1420",
4 "beforeBuildCommand": "node node_modules/next/dist/bin/next build && node node_modules/next/dist/bin/next export -o next-dist",
5 "devPath": "http://localhost:1420",
6 - "distDir": "../next-dist",
6 + "distDir": "../dist",
7 "withGlobalTauri": false
8 },
9 "package": {
styles/Home.module.css deleted
-278
@@ -1,278 +0,0 @@
1 -.main {
2 - display: flex;
3 - flex-direction: column;
4 - justify-content: space-between;
5 - align-items: center;
6 - padding: 6rem;
7 - min-height: 100vh;
8 -}
9 -
10 -.description {
11 - display: inherit;
12 - justify-content: inherit;
13 - align-items: inherit;
14 - font-size: 0.85rem;
15 - max-width: var(--max-width);
16 - width: 100%;
17 - z-index: 2;
18 - font-family: var(--font-mono);
19 -}
20 -
21 -.description a {
22 - display: flex;
23 - justify-content: center;
24 - align-items: center;
25 - gap: 0.5rem;
26 -}
27 -
28 -.description p {
29 - position: relative;
30 - margin: 0;
31 - padding: 1rem;
32 - background-color: rgba(var(--callout-rgb), 0.5);
33 - border: 1px solid rgba(var(--callout-border-rgb), 0.3);
34 - border-radius: var(--border-radius);
35 -}
36 -
37 -.code {
38 - font-weight: 700;
39 - font-family: var(--font-mono);
40 -}
41 -
42 -.grid {
43 - display: grid;
44 - grid-template-columns: repeat(4, minmax(25%, auto));
45 - width: var(--max-width);
46 - max-width: 100%;
47 -}
48 -
49 -.card {
50 - padding: 1rem 1.2rem;
51 - border-radius: var(--border-radius);
52 - background: rgba(var(--card-rgb), 0);
53 - border: 1px solid rgba(var(--card-border-rgb), 0);
54 - transition: background 200ms, border 200ms;
55 -}
56 -
57 -.card span {
58 - display: inline-block;
59 - transition: transform 200ms;
60 -}
61 -
62 -.card h2 {
63 - font-weight: 600;
64 - margin-bottom: 0.7rem;
65 -}
66 -
67 -.card p {
68 - margin: 0;
69 - opacity: 0.6;
70 - font-size: 0.9rem;
71 - line-height: 1.5;
72 - max-width: 30ch;
73 -}
74 -
75 -.center {
76 - display: flex;
77 - justify-content: center;
78 - align-items: center;
79 - position: relative;
80 - padding: 4rem 0;
81 -}
82 -
83 -.center::before {
84 - background: var(--secondary-glow);
85 - border-radius: 50%;
86 - width: 480px;
87 - height: 360px;
88 - margin-left: -400px;
89 -}
90 -
91 -.center::after {
92 - background: var(--primary-glow);
93 - width: 240px;
94 - height: 180px;
95 - z-index: -1;
96 -}
97 -
98 -.center::before,
99 -.center::after {
100 - content: '';
101 - left: 50%;
102 - position: absolute;
103 - filter: blur(45px);
104 - transform: translateZ(0);
105 -}
106 -
107 -.logo,
108 -.thirteen {
109 - position: relative;
110 -}
111 -
112 -.thirteen {
113 - display: flex;
114 - justify-content: center;
115 - align-items: center;
116 - width: 75px;
117 - height: 75px;
118 - padding: 25px 10px;
119 - margin-left: 16px;
120 - transform: translateZ(0);
121 - border-radius: var(--border-radius);
122 - overflow: hidden;
123 - box-shadow: 0px 2px 8px -1px #0000001a;
124 -}
125 -
126 -.thirteen::before,
127 -.thirteen::after {
128 - content: '';
129 - position: absolute;
130 - z-index: -1;
131 -}
132 -
133 -/* Conic Gradient Animation */
134 -.thirteen::before {
135 - animation: 6s rotate linear infinite;
136 - width: 200%;
137 - height: 200%;
138 - background: var(--tile-border);
139 -}
140 -
141 -/* Inner Square */
142 -.thirteen::after {
143 - inset: 0;
144 - padding: 1px;
145 - border-radius: var(--border-radius);
146 - background: linear-gradient(
147 - to bottom right,
148 - rgba(var(--tile-start-rgb), 1),
149 - rgba(var(--tile-end-rgb), 1)
150 - );
151 - background-clip: content-box;
152 -}
153 -
154 -/* Enable hover only on non-touch devices */
155 -@media (hover: hover) and (pointer: fine) {
156 - .card:hover {
157 - background: rgba(var(--card-rgb), 0.1);
158 - border: 1px solid rgba(var(--card-border-rgb), 0.15);
159 - }
160 -
161 - .card:hover span {
162 - transform: translateX(4px);
163 - }
164 -}
165 -
166 -@media (prefers-reduced-motion) {
167 - .thirteen::before {
168 - animation: none;
169 - }
170 -
171 - .card:hover span {
172 - transform: none;
173 - }
174 -}
175 -
176 -/* Mobile */
177 -@media (max-width: 700px) {
178 - .content {
179 - padding: 4rem;
180 - }
181 -
182 - .grid {
183 - grid-template-columns: 1fr;
184 - margin-bottom: 120px;
185 - max-width: 320px;
186 - text-align: center;
187 - }
188 -
189 - .card {
190 - padding: 1rem 2.5rem;
191 - }
192 -
193 - .card h2 {
194 - margin-bottom: 0.5rem;
195 - }
196 -
197 - .center {
198 - padding: 8rem 0 6rem;
199 - }
200 -
201 - .center::before {
202 - transform: none;
203 - height: 300px;
204 - }
205 -
206 - .description {
207 - font-size: 0.8rem;
208 - }
209 -
210 - .description a {
211 - padding: 1rem;
212 - }
213 -
214 - .description p,
215 - .description div {
216 - display: flex;
217 - justify-content: center;
218 - position: fixed;
219 - width: 100%;
220 - }
221 -
222 - .description p {
223 - align-items: center;
224 - inset: 0 0 auto;
225 - padding: 2rem 1rem 1.4rem;
226 - border-radius: 0;
227 - border: none;
228 - border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
229 - background: linear-gradient(
230 - to bottom,
231 - rgba(var(--background-start-rgb), 1),
232 - rgba(var(--callout-rgb), 0.5)
233 - );
234 - background-clip: padding-box;
235 - backdrop-filter: blur(24px);
236 - }
237 -
238 - .description div {
239 - align-items: flex-end;
240 - pointer-events: none;
241 - inset: auto 0 0;
242 - padding: 2rem;
243 - height: 200px;
244 - background: linear-gradient(
245 - to bottom,
246 - transparent 0%,
247 - rgb(var(--background-end-rgb)) 40%
248 - );
249 - z-index: 1;
250 - }
251 -}
252 -
253 -/* Tablet and Smaller Desktop */
254 -@media (min-width: 701px) and (max-width: 1120px) {
255 - .grid {
256 - grid-template-columns: repeat(2, 50%);
257 - }
258 -}
259 -
260 -@media (prefers-color-scheme: dark) {
261 - .vercelLogo {
262 - filter: invert(1);
263 - }
264 -
265 - .logo,
266 - .thirteen img {
267 - filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
268 - }
269 -}
270 -
271 -@keyframes rotate {
272 - from {
273 - transform: rotate(360deg);
274 - }
275 - to {
276 - transform: rotate(0deg);
277 - }
278 -}
styles/globals.css deleted
-107
@@ -1,107 +0,0 @@
1 -:root {
2 - --max-width: 1100px;
3 - --border-radius: 12px;
4 - --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono',
5 - 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro',
6 - 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace;
7 -
8 - --foreground-rgb: 0, 0, 0;
9 - --background-start-rgb: 214, 219, 220;
10 - --background-end-rgb: 255, 255, 255;
11 -
12 - --primary-glow: conic-gradient(
13 - from 180deg at 50% 50%,
14 - #16abff33 0deg,
15 - #0885ff33 55deg,
16 - #54d6ff33 120deg,
17 - #0071ff33 160deg,
18 - transparent 360deg
19 - );
20 - --secondary-glow: radial-gradient(
21 - rgba(255, 255, 255, 1),
22 - rgba(255, 255, 255, 0)
23 - );
24 -
25 - --tile-start-rgb: 239, 245, 249;
26 - --tile-end-rgb: 228, 232, 233;
27 - --tile-border: conic-gradient(
28 - #00000080,
29 - #00000040,
30 - #00000030,
31 - #00000020,
32 - #00000010,
33 - #00000010,
34 - #00000080
35 - );
36 -
37 - --callout-rgb: 238, 240, 241;
38 - --callout-border-rgb: 172, 175, 176;
39 - --card-rgb: 180, 185, 188;
40 - --card-border-rgb: 131, 134, 135;
41 -}
42 -
43 -@media (prefers-color-scheme: dark) {
44 - :root {
45 - --foreground-rgb: 255, 255, 255;
46 - --background-start-rgb: 0, 0, 0;
47 - --background-end-rgb: 0, 0, 0;
48 -
49 - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
50 - --secondary-glow: linear-gradient(
51 - to bottom right,
52 - rgba(1, 65, 255, 0),
53 - rgba(1, 65, 255, 0),
54 - rgba(1, 65, 255, 0.3)
55 - );
56 -
57 - --tile-start-rgb: 2, 13, 46;
58 - --tile-end-rgb: 2, 5, 19;
59 - --tile-border: conic-gradient(
60 - #ffffff80,
61 - #ffffff40,
62 - #ffffff30,
63 - #ffffff20,
64 - #ffffff10,
65 - #ffffff10,
66 - #ffffff80
67 - );
68 -
69 - --callout-rgb: 20, 20, 20;
70 - --callout-border-rgb: 108, 108, 108;
71 - --card-rgb: 100, 100, 100;
72 - --card-border-rgb: 200, 200, 200;
73 - }
74 -}
75 -
76 -* {
77 - box-sizing: border-box;
78 - padding: 0;
79 - margin: 0;
80 -}
81 -
82 -html,
83 -body {
84 - max-width: 100vw;
85 - overflow-x: hidden;
86 -}
87 -
88 -body {
89 - color: rgb(var(--foreground-rgb));
90 - background: linear-gradient(
91 - to bottom,
92 - transparent,
93 - rgb(var(--background-end-rgb))
94 - )
95 - rgb(var(--background-start-rgb));
96 -}
97 -
98 -a {
99 - color: inherit;
100 - text-decoration: none;
101 -}
102 -
103 -@media (prefers-color-scheme: dark) {
104 - html {
105 - color-scheme: dark;
106 - }
107 -}
tailwind.config.js new
+88
@@ -0,0 +1,88 @@
1 +import colors from 'tailwindcss/colors';
2 +import { Config } from 'tailwindcss';
3 +
4 +export default {
5 + content: [
6 + './app/**/*.{js,ts,jsx,tsx,mdx}',
7 + ],
8 + future: {
9 + hoverOnlyWhenSupported: true,
10 + },
11 + darkMode: 'class',
12 + theme: {
13 + extend: {
14 + // https://vercel.com/design/color
15 + colors: {
16 + gray: colors.zinc,
17 + 'gray-1000': 'rgb(17,17,19)',
18 + 'gray-1100': 'rgb(10,10,11)',
19 + vercel: {
20 + pink: '#FF0080',
21 + blue: '#0070F3',
22 + cyan: '#50E3C2',
23 + orange: '#F5A623',
24 + violet: '#7928CA',
25 + },
26 + },
27 + backgroundImage: ({ theme }) => ({
28 + 'vc-border-gradient': `radial-gradient(at left top, ${theme(
29 + 'colors.gray.500',
30 + )}, 50px, ${theme('colors.gray.800')} 50%)`,
31 + }),
32 + keyframes: ({ theme }) => ({
33 + rerender: {
34 + '0%': {
35 + ['border-color']: theme('colors.vercel.pink'),
36 + },
37 + '40%': {
38 + ['border-color']: theme('colors.vercel.pink'),
39 + },
40 + },
41 + highlight: {
42 + '0%': {
43 + background: theme('colors.vercel.pink'),
44 + color: theme('colors.white'),
45 + },
46 + '40%': {
47 + background: theme('colors.vercel.pink'),
48 + color: theme('colors.white'),
49 + },
50 + },
51 + loading: {
52 + '0%': {
53 + opacity: '.2',
54 + },
55 + '20%': {
56 + opacity: '1',
57 + transform: 'translateX(1px)',
58 + },
59 + to: {
60 + opacity: '.2',
61 + },
62 + },
63 + shimmer: {
64 + '100%': {
65 + transform: 'translateX(100%)',
66 + },
67 + },
68 + translateXReset: {
69 + '100%': {
70 + transform: 'translateX(0)',
71 + },
72 + },
73 + fadeToTransparent: {
74 + '0%': {
75 + opacity: '1',
76 + },
77 + '40%': {
78 + opacity: '1',
79 + },
80 + '100%': {
81 + opacity: '0',
82 + },
83 + },
84 + }),
85 + },
86 + },
87 + plugins: [require('@tailwindcss/typography'), require('@tailwindcss/forms')],
88 +} satisfies Config;
tsconfig.json
+23 -5
@@ -1,7 +1,11 @@
1 {
2 "compilerOptions": {
3 "target": "es5",
4 - "lib": ["dom", "dom.iterable", "esnext"],
4 + "lib": [
5 + "dom",
6 + "dom.iterable",
7 + "esnext"
8 + ],
9 "allowJs": true,
10 "skipLibCheck": true,
11 "strict": true,
@@ -16,9 +20,23 @@
20 "incremental": true,
21 "baseUrl": ".",
22 "paths": {
19 - "@/*": ["./*"]
20 - }
23 + "@/*": [
24 + "./*"
25 + ]
26 + },
27 + "plugins": [
28 + {
29 + "name": "next"
30 + }
31 + ]
32 },
22 - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
23 - "exclude": ["node_modules"]
33 + "include": [
34 + "next-env.d.ts",
35 + "**/*.ts",
36 + "**/*.tsx",
37 + ".next/types/**/*.ts"
38 + ],
39 + "exclude": [
40 + "node_modules"
41 + ]
42 }