35 Commits

Author SHA1 Message Date
itsMapleLeaf
ad57674d6e 0.3.5 2022-04-22 23:27:43 -05:00
itsMapleLeaf
065bec9a37 Merge branches 'main' and 'main' of github.com:itsMapleLeaf/reacord 2022-04-22 23:23:35 -05:00
itsMapleLeaf
d3ccafc6d5 update website links 2022-04-22 23:22:28 -05:00
Darius
c71d70bbb4 remove domain redirect 2022-03-27 13:34:09 -05:00
itsMapleLeaf
5ba12af699 this should be call uncontrolled modal 2022-01-16 18:18:44 -06:00
itsMapleLeaf
ff39ef753f add accessible text to header logo 2022-01-16 14:09:53 -06:00
itsMapleLeaf
2288c27e1e fix style preload 2022-01-16 13:46:08 -06:00
MapleLeaf
c86648f44e deploy domain redirect to fly 2022-01-15 13:56:15 -06:00
MapleLeaf
0edf702b5f change umami url 2022-01-15 11:36:10 -06:00
MapleLeaf
05bda71ad6 fix action row example 2022-01-14 15:55:49 -06:00
MapleLeaf
0217fb8533 adjust prose style 2022-01-14 15:55:37 -06:00
MapleLeaf
b59dcc0ae7 active nav link style 2022-01-13 17:05:46 -06:00
Darius
3efaef162b update npm badge to link to npm 2022-01-13 12:54:42 -06:00
Darius
4c2aafe185 add npm badge 2022-01-13 12:52:55 -06:00
MapleLeaf
d3d1f473ae release v0.3.4 2022-01-13 11:42:36 -06:00
MapleLeaf
116e606db1 more package.json metadata fields 2022-01-13 11:41:16 -06:00
MapleLeaf
490bf2cefa reduce initial animation delay 2022-01-13 11:26:29 -06:00
MapleLeaf
e06bfa490f new main nav menu, remove alpine 2022-01-13 11:16:09 -06:00
MapleLeaf
2765b4fda4 extract and clean up buttonClass 2022-01-12 22:07:43 -06:00
MapleLeaf
5660297588 ignore /public/api 2022-01-12 22:07:19 -06:00
MapleLeaf
2cdd324495 un-proxy the api docs 2022-01-12 21:14:05 -06:00
MapleLeaf
7a09e8fdca add back get started button 2022-01-12 21:13:09 -06:00
MapleLeaf
8111931183 add meta theme-color 2022-01-12 20:32:50 -06:00
MapleLeaf
fd64132e58 seo stuff 2022-01-12 20:24:11 -06:00
MapleLeaf
1ba0da6c86 update header logo 2022-01-12 20:14:12 -06:00
MapleLeaf
fdd6a3a3cc add modal to show code 2022-01-12 20:10:09 -06:00
MapleLeaf
8ce3834cf4 fun landing animation 2022-01-12 19:29:20 -06:00
MapleLeaf
1bfbe9608c add neat tilted background 2022-01-12 17:55:36 -06:00
MapleLeaf
0695bbc6bd add favicon 2022-01-12 17:42:31 -06:00
MapleLeaf
569e5c7473 add new banner to readme 💖 thanks @Crawron 2022-01-12 17:12:40 -06:00
MapleLeaf
62300d23ca remove log in test script 2022-01-12 13:31:58 -06:00
MapleLeaf
cda69a0c85 load api files through a remix route 2022-01-12 13:31:50 -06:00
MapleLeaf
785384286b add analytics + notice 2022-01-12 13:15:09 -06:00
MapleLeaf
50961e888e prebuild tailwindcss for caching
need to figure out how to do this with remix-tailwind lol
2022-01-12 11:01:38 -06:00
MapleLeaf
8c3304144e add more package.json fields 2022-01-12 10:25:06 -06:00
38 changed files with 963 additions and 242 deletions

View File

@@ -1,17 +0,0 @@
name: deploy website
on:
push:
branches: [main]
paths:
- "packages/website/**"
- "reacord/library/**/*.{ts,tsx}"
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: superfly/flyctl-actions@master
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
with:
args: "deploy"

View File

@@ -1,7 +1,9 @@
# reacord
Create interactive Discord messages using React!
<center>
<img src="./packages/website/app/assets/banner.png" alt="Reacord: Create interactive Discord messages using React">
</center>
## Installation ∙ [![npm](https://img.shields.io/npm/v/reacord?color=blue&style=flat-square)](https://www.npmjs.com/package/reacord)
## Installation
```console
# npm
npm install reacord react discord.js
@@ -15,9 +17,11 @@ pnpm add reacord react discord.js
```
## Get Started
[Visit the docs to get started.](https://reacord.fly.dev/guides/getting-started)
[Visit the docs to get started.](https://reacord.mapleleaf.dev/guides/getting-started)
## Example
<!-- prettier-ignore -->
```tsx
import * as React from "react"

View File

@@ -1,40 +0,0 @@
# fly.toml file generated for reacord on 2021-12-29T14:06:41-06:00
app = "reacord"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []
[env]
PORT = 8080
[experimental]
allowed_public_ports = []
auto_rollback = true
[[services]]
http_checks = []
internal_port = 8080
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"
[[services.ports]]
handlers = ["http"]
port = 80
[[services.ports]]
handlers = ["tls", "http"]
port = 443
[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

View File

@@ -21,9 +21,9 @@ export type ActionRowProps = {
* ```tsx
* // put buttons on two separate rows
* <ActionRow>
* <Button onClick={handleFirst}>First</Button>
* <Button label="First" onClick={handleFirst} />
* </ActionRow>
* <Button onClick={handleSecond}>Second</Button>
* <Button label="Second" onClick={handleSecond} />
* ```
*
* @category Action Row

View File

@@ -10,7 +10,7 @@ export const InstanceProvider = Context.Provider
* Get the associated instance for the current component.
*
* @category Core
* @see https://reacord.fly.dev/guides/use-instance
* @see https://reacord.mapleleaf.dev/guides/use-instance
*/
export function useInstance(): ReacordInstance {
return (

View File

@@ -40,7 +40,7 @@ export class ReacordDiscordJs extends Reacord {
/**
* Sends a message to a channel.
* @see https://reacord.fly.dev/guides/sending-messages
* @see https://reacord.mapleleaf.dev/guides/sending-messages
*/
override send(
channelId: string,
@@ -54,7 +54,7 @@ export class ReacordDiscordJs extends Reacord {
/**
* Sends a message as a reply to a command interaction.
* @see https://reacord.fly.dev/guides/sending-messages
* @see https://reacord.mapleleaf.dev/guides/sending-messages
*/
override reply(
interaction: Discord.CommandInteraction,
@@ -68,7 +68,7 @@ export class ReacordDiscordJs extends Reacord {
/**
* Sends an ephemeral message as a reply to a command interaction.
* @see https://reacord.fly.dev/guides/sending-messages
* @see https://reacord.mapleleaf.dev/guides/sending-messages
*/
override ephemeralReply(
interaction: Discord.CommandInteraction,

View File

@@ -2,8 +2,23 @@
"name": "reacord",
"type": "module",
"description": "Create interactive Discord messages using React.",
"version": "0.3.3",
"version": "0.3.5",
"types": "./dist/main.d.ts",
"homepage": "https://reacord.mapleleaf.dev",
"repository": "https://github.com/itsMapleLeaf/reacord.git",
"changelog": "https://github.com/itsMapleLeaf/reacord/releases",
"license": "MIT",
"keywords": [
"discord",
"discord-js",
"react",
"react-js",
"react-renderer",
"interaction",
"message",
"embed",
"reacord"
],
"files": [
"dist",
"README.md",

View File

@@ -7,3 +7,4 @@ node_modules
/public/api
cypress/videos
cypress/screenshots
*.out.css

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,3 @@
<svg width="53" height="35" viewBox="0 0 53 35" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="3" cy="3" r="1" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

View File

@@ -0,0 +1,27 @@
import { HeartIcon } from "@heroicons/react/solid"
import clsx from "clsx"
import { ExternalLink } from "~/modules/dom/external-link"
import { linkClass, maxWidthContainer } from "~/modules/ui/components"
export function AppFooter() {
return (
<footer className={clsx(maxWidthContainer, "text-xs opacity-75")}>
<address className="not-italic">
&copy; {new Date().getFullYear()} itsMapleLeaf
</address>
<p>
Coded with <HeartIcon className="inline w-4 align-sub" /> using{" "}
<ExternalLink className={linkClass()} href="https://remix.run">
Remix
</ExternalLink>
</p>
<p>
Uses{" "}
<ExternalLink className={linkClass()} href="https://umami.is/">
umami
</ExternalLink>{" "}
for simple, non-identifying analytics.
</p>
</footer>
)
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,12 @@
import type { ComponentPropsWithoutRef } from "react"
export function ExternalLink({
children,
...props
}: ComponentPropsWithoutRef<"a">) {
return (
<a target="_blank" rel="noopener noreferrer" {...props}>
{children}
</a>
)
}

View File

@@ -0,0 +1,20 @@
import type { ReactNode } from "react"
import { useEffect, useRef } from "react"
import { createPortal } from "react-dom"
export function Portal({ children }: { children: ReactNode }) {
const containerRef = useRef<Element>()
if (!containerRef.current && typeof document !== "undefined") {
containerRef.current = document.createElement("react-portal")
document.body.append(containerRef.current)
}
useEffect(() => () => containerRef.current!.remove(), [])
return containerRef.current ? (
createPortal(children, containerRef.current)
) : (
<>{children}</>
)
}

View File

@@ -0,0 +1,195 @@
import clsx from "clsx"
import { useEffect, useRef, useState } from "react"
import blobComfyUrl from "~/assets/blob-comfy.png"
import cursorIbeamUrl from "~/assets/cursor-ibeam.png"
import cursorUrl from "~/assets/cursor.png"
const defaultState = {
chatInputText: "",
chatInputCursorVisible: true,
messageVisible: false,
count: 0,
cursorLeft: "25%",
cursorBottom: "-15px",
}
const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
const animationFrame = () =>
new Promise((resolve) => requestAnimationFrame(resolve))
export function LandingAnimation() {
const [state, setState] = useState(defaultState)
const chatInputRef = useRef<HTMLDivElement>(null)
const addRef = useRef<HTMLDivElement>(null)
const deleteRef = useRef<HTMLDivElement>(null)
const cursorRef = useRef<HTMLImageElement>(null)
useEffect(() => {
const animateClick = (element: HTMLElement) =>
element.animate(
[{ transform: `translateY(2px)` }, { transform: `translateY(0px)` }],
300,
)
let running = true
void (async () => {
while (running) {
setState(defaultState)
await delay(700)
for (const letter of "/counter") {
setState((state) => ({
...state,
chatInputText: state.chatInputText + letter,
}))
await delay(100)
}
await delay(1000)
setState((state) => ({
...state,
messageVisible: true,
chatInputText: "",
}))
await delay(1000)
setState((state) => ({
...state,
cursorLeft: "70px",
cursorBottom: "40px",
}))
await delay(1500)
for (let i = 0; i < 3; i++) {
setState((state) => ({
...state,
count: state.count + 1,
chatInputCursorVisible: false,
}))
animateClick(addRef.current!)
await delay(700)
}
await delay(500)
setState((state) => ({
...state,
cursorLeft: "140px",
}))
await delay(1000)
animateClick(deleteRef.current!)
setState((state) => ({ ...state, messageVisible: false }))
await delay(1000)
setState(() => ({
...defaultState,
chatInputCursorVisible: false,
}))
await delay(500)
}
})()
return () => {
running = false
}
}, [])
useEffect(() => {
let running = true
void (async () => {
while (running) {
// check if the cursor is in the input
const cursorRect = cursorRef.current!.getBoundingClientRect()
const chatInputRect = chatInputRef.current!.getBoundingClientRect()
const isOverInput =
cursorRef.current &&
chatInputRef.current &&
cursorRect.top + cursorRect.height / 2 > chatInputRect.top
cursorRef.current!.src = isOverInput ? cursorIbeamUrl : cursorUrl
await animationFrame()
}
})()
return () => {
running = false
}
})
return (
<div
className="grid gap-2 relative pointer-events-none select-none"
role="presentation"
>
<div
className={clsx(
"bg-slate-800 p-4 rounded-lg shadow transition",
state.messageVisible ? "opacity-100" : "opacity-0 -translate-y-2",
)}
>
<div className="flex items-start gap-4">
<div className="w-12 h-12 p-2 rounded-full bg-no-repeat bg-contain bg-black/25">
<img
src={blobComfyUrl}
alt=""
className="object-contain scale-90 w-full h-full"
/>
</div>
<div>
<p className="font-bold">comfybot</p>
<p>this button was clicked {state.count} times</p>
<div className="mt-2 flex flex-row gap-3">
<div
ref={addRef}
className="bg-emerald-700 text-white py-1.5 px-3 text-sm rounded"
>
+1
</div>
<div
ref={deleteRef}
className="bg-red-700 text-white py-1.5 px-3 text-sm rounded"
>
🗑 delete
</div>
</div>
</div>
</div>
</div>
<div
className="bg-slate-700 pb-2 pt-1.5 px-4 rounded-lg shadow"
ref={chatInputRef}
>
<span
className={clsx(
"text-sm after:content-[attr(data-after)] after:relative after:-top-px after:-left-[2px]",
state.chatInputCursorVisible
? "after:opacity-100"
: "after:opacity-0",
)}
data-after="|"
>
{state.chatInputText || (
<span className="opacity-50 block absolute translate-y-1">
Message #showing-off-reacord
</span>
)}
</span>
</div>
<img
src={cursorUrl}
alt=""
className="transition-all duration-500 absolute scale-75"
style={{ left: state.cursorLeft, bottom: state.cursorBottom }}
ref={cursorRef}
/>
</div>
)
}

View File

@@ -0,0 +1,26 @@
{/* prettier-ignore */}
```tsx
import * as React from "react"
import { Button, useInstance } from "reacord"
function Counter() {
const [count, setCount] = React.useState(0)
const instance = useInstance()
return (
<>
this button was clicked {count} times
<Button
label="+1"
style="success"
onClick={() => setCount(count + 1)}
/>
<Button
label="delete"
emoji="🗑"
style="danger"
onClick={() => instance.destroy()}
/>
</>
)
}
```

View File

@@ -1,19 +0,0 @@
{/* prettier-ignore */}
```tsx
import * as React from "react"
import { Embed, Button } from "reacord"
function Counter() {
const [count, setCount] = React.useState(0)
return (
<>
<Embed title="Counter">
This button has been clicked {count} times.
</Embed>
<Button onClick={() => setCount(count + 1)}>
+1
</Button>
</>
)
}
```

View File

@@ -0,0 +1,14 @@
import type { ReactNode } from "react"
import type { PathPattern } from "react-router"
import { useMatch } from "react-router"
export function ActiveLink({
to,
children,
}: {
to: string | PathPattern
children: (props: { active: boolean }) => ReactNode
}) {
const match = useMatch(to)
return <>{children({ active: match != undefined })}</>
}

View File

@@ -1,5 +1,6 @@
import type { ComponentPropsWithoutRef } from "react"
import { Link } from "remix"
import { ExternalLink } from "~/modules/dom/external-link"
export type AppLinkProps = ComponentPropsWithoutRef<"a"> & {
type: "internal" | "external" | "router"
@@ -17,9 +18,9 @@ export function AppLink({ type, to, children, ...props }: AppLinkProps) {
if (type === "external") {
return (
<a href={to} target="_blank" rel="noopener noreferrer" {...props}>
<ExternalLink href={to} {...props}>
{children}
</a>
</ExternalLink>
)
}

View File

@@ -18,7 +18,7 @@ export const mainLinks: AppLinkProps[] = [
},
{
type: "internal",
to: "/api",
to: "/api/",
children: (
<>
<CodeIcon className={inlineIconClass} /> API Reference

View File

@@ -0,0 +1,69 @@
import { Menu, Transition } from "@headlessui/react"
import { MenuAlt4Icon } from "@heroicons/react/outline"
import clsx from "clsx"
import { ActiveLink } from "~/modules/navigation/active-link"
import { useGuideLinksContext } from "~/modules/navigation/guide-links-context"
import { Popper } from "~/modules/ui/popper"
import { AppLink } from "./app-link"
import { mainLinks } from "./main-links"
export function MainNavigationMenu() {
const guideLinks = useGuideLinksContext()
return (
<Menu>
<Popper
renderReference={(reference) => (
<Menu.Button {...reference}>
<MenuAlt4Icon className="w-6" />
<span className="sr-only">Menu</span>
</Menu.Button>
)}
renderPopover={() => (
<Transition
enter="transition"
enterFrom="translate-y-4 opacity-0"
enterTo="translate-y-0 opacity-100"
leave="transition"
leaveFrom="translate-y-0 opacity-100"
leaveTo="translate-y-4 opacity-0"
>
<Menu.Items className="w-48 max-h-[calc(100vh-5rem)] bg-slate-800 shadow rounded-lg overflow-hidden overflow-y-auto focus:outline-none">
{mainLinks.map((link) => (
<Menu.Item key={link.to}>
{({ active }) => (
<AppLink {...link} className={menuItemClass({ active })} />
)}
</Menu.Item>
))}
<Menu.Item disabled>
<hr className="border-0 h-[2px] bg-black/50" />
</Menu.Item>
{guideLinks.map(({ link }) => (
<Menu.Item key={link.to}>
{(menuItem) => (
<ActiveLink to={link.to}>
{(activeLink) => (
<AppLink
{...link}
className={menuItemClass({
active: activeLink.active || menuItem.active,
})}
/>
)}
</ActiveLink>
)}
</Menu.Item>
))}
</Menu.Items>
</Transition>
)}
/>
</Menu>
)
}
const menuItemClass = ({ active = false }) =>
clsx(
clsx`px-3 py-2 transition text-left font-medium block opacity-50`,
active && clsx`opacity-100 bg-black/75 text-emerald-400`,
)

View File

@@ -1,41 +1,23 @@
import { useGuideLinksContext } from "~/modules/navigation/guide-links-context"
import { AppLogo } from "~/modules/app/app-logo"
import { linkClass } from "../ui/components"
import { PopoverMenu } from "../ui/popover-menu"
import { AppLink } from "./app-link"
import { mainLinks } from "./main-links"
import { MainNavigationMenu } from "./main-navigation-menu"
export function MainNavigation() {
const guideLinks = useGuideLinksContext()
return (
<nav className="flex justify-between items-center h-16">
<a href="/">
<h1 className="text-3xl font-light">reacord</h1>
<AppLogo className="w-32" />
<span className="sr-only">Home</span>
</a>
<div className="hidden md:flex gap-4">
{mainLinks.map((link) => (
<AppLink {...link} key={link.to} className={linkClass} />
<AppLink {...link} key={link.to} className={linkClass()} />
))}
</div>
<div className="md:hidden">
<PopoverMenu>
{mainLinks.map((link) => (
<AppLink
{...link}
role="menuitem"
key={link.to}
className={PopoverMenu.itemClass}
/>
))}
<hr className="border-0 h-[2px] bg-black/50" />
{guideLinks.map(({ link }) => (
<AppLink
{...link}
role="menuitem"
key={link.to}
className={PopoverMenu.itemClass}
/>
))}
</PopoverMenu>
<MainNavigationMenu />
</div>
</nav>
)

View File

@@ -4,21 +4,41 @@ export const maxWidthContainer = clsx`mx-auto w-full max-w-screen-lg px-4`
export const inlineIconClass = clsx`inline w-5 align-sub`
export const linkClass = clsx`
font-medium inline-block relative
opacity-60 hover:opacity-100 transition-opacity
after:absolute after:block after:w-full after:h-px after:bg-white/50 after:translate-y-[3px] after:opacity-0 after:transition
hover:after:translate-y-[-1px] hover:after:opacity-100
`
export const linkClass = ({ active = false } = {}) =>
clsx(
clsx`font-medium inline-block relative`,
clsx`opacity-60 hover:opacity-100 transition-opacity`,
clsx`after:absolute after:block after:w-full after:h-px after:bg-white/50 after:translate-y-[3px] after:opacity-0 after:transition`,
clsx`hover:after:translate-y-[-1px] hover:after:opacity-100`,
active
? clsx`text-emerald-500 after:bg-emerald-500`
: clsx`after:bg-white/50`,
)
export const docsProseClass = clsx`
prose prose-invert
prose-h1:font-light prose-h1:mb-4 prose-h1:text-3xl lg:prose-h1:text-4xl
prose-h2:font-light
prose-h3:font-light
prose-p:my-4
prose-p:my-3
prose-a:font-medium prose-a:text-emerald-400 hover:prose-a:no-underline
prose-strong:font-medium prose-strong:text-emerald-400
prose-pre:font-monospace prose-pre:overflow-x-auto
prose-code:before:hidden prose-code:after:hidden prose-code:text-slate-400
prose-li:mb-5
max-w-none
`
export const buttonClass = ({
variant,
}: {
variant: "solid" | "semiblack"
}) => {
return clsx(
clsx`inline-block mt-4 px-4 py-2.5 text-xl transition rounded-lg`,
clsx`hover:translate-y-[-2px] hover:shadow`,
clsx`active:translate-y-[0px] active:transition-none`, // using translate-y-[0px] instead of just -0 so it takes priority
variant === "solid" && clsx`bg-emerald-700 hover:bg-emerald-800`,
variant === "semiblack" && clsx`bg-black/25 hover:bg-black/40`,
)
}

View File

@@ -0,0 +1,80 @@
import { XIcon } from "@heroicons/react/outline"
import clsx from "clsx"
import type { ReactNode } from "react"
import { useEffect, useRef, useState } from "react"
import { FocusOn } from "react-focus-on"
import { Portal } from "~/modules/dom/portal"
export function Modal({
children,
visible,
onClose,
}: {
children: ReactNode
visible: boolean
onClose: () => void
}) {
const closeButtonRef = useRef<HTMLButtonElement>(null)
useEffect(() => {
if (visible) {
// trying to immediately focus doesn't work for whatever reason
// neither did requestAnimationFrame
setTimeout(() => {
closeButtonRef.current?.focus()
}, 50)
}
}, [visible])
return (
<Portal>
<div
className={clsx(
"bg-black/70 fixed inset-0 transition-all flex flex-col p-4",
visible ? "opacity-100 visible" : "opacity-0 invisible",
)}
>
<FocusOn
className={clsx(
"m-auto flex flex-col gap-2 w-full max-h-full max-w-screen-sm overflow-y-auto transition",
visible ? "translate-y-0" : "translate-y-3",
)}
enabled={visible}
onClickOutside={onClose}
onEscapeKey={onClose}
>
<button
type="button"
className="self-end"
onClick={onClose}
ref={closeButtonRef}
>
<span className="sr-only">Close</span>
<XIcon aria-hidden className="w-6 text-white" />
</button>
<div className={clsx("bg-slate-700 rounded-md shadow p-4")}>
{children}
</div>
</FocusOn>
</div>
</Portal>
)
}
export function UncontrolledModal({
children,
button,
}: {
children: ReactNode
button: (buttonProps: { onClick: () => void }) => void
}) {
const [visible, setVisible] = useState(false)
return (
<>
{button({ onClick: () => setVisible(true) })}
<Modal visible={visible} onClose={() => setVisible(false)}>
{children}
</Modal>
</>
)
}

View File

@@ -1,32 +0,0 @@
import { MenuAlt4Icon } from "@heroicons/react/outline"
import clsx from "clsx"
import React from "react"
import { linkClass } from "./components"
export function PopoverMenu({ children }: { children: React.ReactNode }) {
return (
<div className="relative" x-data="{ open: false }">
<button title="Menu" className={linkClass} x-on:click="open = !open">
<MenuAlt4Icon className="w-6" />
</button>
<div
role="menu"
className={`
w-48 max-h-[calc(100vh-4rem)]
absolute right-0 top-[calc(100%+8px)]
bg-slate-800 shadow rounded-lg
overflow-hidden overflow-y-auto
transition-all
`}
x-bind:class="open ? 'visible opacity-100' : 'invisible opacity-0 translate-y-3'"
>
{children}
</div>
</div>
)
}
PopoverMenu.itemClass = clsx`
px-3 py-2 transition text-left font-medium block
opacity-50 hover:opacity-100 hover:bg-black/30
`

View File

@@ -0,0 +1,41 @@
import { useRect } from "@reach/rect"
import * as React from "react"
import { Portal } from "~/modules/dom/portal"
export function Popper({
renderReference,
renderPopover,
}: {
renderReference: (referenceProps: {
ref: (element: HTMLElement | null | undefined) => void
}) => React.ReactNode
renderPopover: () => React.ReactNode
}) {
const [reference, referenceRef] = React.useState<HTMLElement | null>()
const referenceRect = useRect(useValueAsRefObject(reference))
return (
<>
{renderReference({ ref: referenceRef })}
<Portal>
{referenceRect && (
<div
className="fixed -translate-x-full"
style={{
left: referenceRect.right,
top: referenceRect.bottom + 16,
}}
>
{renderPopover()}
</div>
)}
</Portal>
</>
)
}
function useValueAsRefObject<Value>(value: Value): { readonly current: Value } {
const ref = React.useRef<Value>(value)
ref.current = value
return ref
}

View File

@@ -5,20 +5,41 @@ import {
LiveReload,
Meta,
Outlet,
Scripts,
ScrollRestoration,
useLoaderData,
} from "remix"
import bannerUrl from "~/assets/banner.png"
import faviconUrl from "~/assets/favicon.png"
import { GuideLinksProvider } from "~/modules/navigation/guide-links-context"
import type { GuideLink } from "~/modules/navigation/load-guide-links.server"
import { loadGuideLinks } from "~/modules/navigation/load-guide-links.server"
import prismThemeCss from "~/modules/ui/prism-theme.css"
import tailwindCss from "~/modules/ui/tailwind.out.css"
export const meta: MetaFunction = () => ({
title: "Reacord",
description: packageJson.description,
"title": "Reacord",
"description": packageJson.description,
"theme-color": "#21754b",
"og:url": "https://reacord.mapleleaf.dev/",
"og:type": "website",
"og:title": "Reacord",
"og:description": "Create interactive Discord messages using React",
"og:image": bannerUrl,
"twitter:card": "summary_large_image",
"twitter:domain": "reacord.mapleleaf.dev",
"twitter:url": "https://reacord.mapleleaf.dev/",
"twitter:title": "Reacord",
"twitter:description": "Create interactive Discord messages using React",
"twitter:image": bannerUrl,
})
export const links: LinksFunction = () => [
{ rel: "icon", type: "image/png", href: faviconUrl },
{ rel: "stylesheet", href: tailwindCss },
{ rel: "stylesheet", href: prismThemeCss },
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
{
rel: "preconnect",
@@ -30,8 +51,10 @@ export const links: LinksFunction = () => [
as: "style",
href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@500&family=Rubik:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&display=swap",
},
{ rel: "stylesheet", href: "/tailwind.css" },
{ rel: "stylesheet", href: prismThemeCss },
{
rel: "stylesheet",
href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@500&family=Rubik:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&display=swap",
},
]
type LoaderData = {
@@ -54,13 +77,20 @@ export default function App() {
<meta name="viewport" content="width=device-width,initial-scale=1" />
<Meta />
<Links />
<script defer src="https://unpkg.com/alpinejs@3.7.1/dist/cdn.min.js" />
{process.env.NODE_ENV === "production" && (
<script
async
data-website-id="49c69ade-5593-4853-9686-c9ca9d519a18"
src="https://umami-production-265f.up.railway.app/umami.js"
/>
)}
</head>
<body>
<GuideLinksProvider value={data.guideLinks}>
<Outlet />
</GuideLinksProvider>
<ScrollRestoration />
<Scripts />
{process.env.NODE_ENV === "development" && <LiveReload />}
</body>
</html>

View File

@@ -1,5 +1,6 @@
import clsx from "clsx"
import { Outlet } from "remix"
import { ActiveLink } from "~/modules/navigation/active-link"
import { AppLink } from "~/modules/navigation/app-link"
import { useGuideLinksContext } from "~/modules/navigation/guide-links-context"
import { MainNavigation } from "~/modules/navigation/main-navigation"
@@ -12,7 +13,7 @@ import {
export default function GuidePage() {
const guideLinks = useGuideLinksContext()
return (
<>
<div className="isolate">
<header className="bg-slate-700/30 shadow sticky top-0 backdrop-blur-sm transition z-10 flex">
<div className={maxWidthContainer}>
<MainNavigation />
@@ -24,7 +25,11 @@ export default function GuidePage() {
<ul className="mt-3 flex flex-col gap-2 items-start">
{guideLinks.map(({ link }) => (
<li key={link.to}>
<AppLink {...link} className={linkClass} />
<ActiveLink to={link.to}>
{({ active }) => (
<AppLink {...link} className={linkClass({ active })} />
)}
</ActiveLink>
</li>
))}
</ul>
@@ -33,6 +38,6 @@ export default function GuidePage() {
<Outlet />
</section>
</main>
</>
</div>
)
}

View File

@@ -1,29 +1,63 @@
import packageJson from "reacord/package.json"
import LandingExample from "~/modules/landing/landing-example.mdx"
import dotsBackgroundUrl from "~/assets/dots-background.svg"
import { AppFooter } from "~/modules/app/app-footer"
import { AppLogo } from "~/modules/app/app-logo"
import LandingCode from "~/modules/landing/landing-code.mdx"
import { MainNavigation } from "~/modules/navigation/main-navigation"
import { maxWidthContainer } from "~/modules/ui/components"
import { buttonClass, maxWidthContainer } from "~/modules/ui/components"
import { LandingAnimation } from "../modules/landing/landing-animation"
import { UncontrolledModal } from "../modules/ui/modal"
export default function Landing() {
return (
<div className="flex flex-col min-w-0 min-h-screen text-center">
<header className={maxWidthContainer}>
<MainNavigation />
</header>
<div className="px-4 pb-8 flex flex-1">
<main className="px-4 py-6 rounded-lg shadow bg-slate-800 space-y-5 m-auto w-full max-w-xl">
<h1 className="text-6xl font-light">reacord</h1>
<section className="mx-auto text-sm sm:text-base">
<LandingExample />
</section>
<p className="text-2xl font-light">{packageJson.description}</p>
<a
href="/guides/getting-started"
className="inline-block px-4 py-3 text-xl transition rounded-lg bg-emerald-700 hover:translate-y-[-2px] hover:bg-emerald-800 hover:shadow"
>
Get Started
</a>
</main>
<>
<div
className="fixed inset-0 rotate-6 scale-125 opacity-20"
style={{ backgroundImage: `url(${dotsBackgroundUrl})` }}
/>
<div className="flex flex-col relative min-w-0 min-h-screen pb-4 gap-4">
<header className={maxWidthContainer}>
<MainNavigation />
</header>
<div className="flex flex-col gap-4 my-auto px-4">
<AppLogo className="w-full max-w-lg mx-auto" />
<div className="max-w-md w-full mx-auto">
<LandingAnimation />
</div>
<p className="text-center text-lg font-light -mb-1">
Create interactive Discord messages with React.
</p>
<div className="flex gap-4 self-center">
<a
href="/guides/getting-started"
className={buttonClass({ variant: "solid" })}
>
Get Started
</a>
<UncontrolledModal
button={(button) => (
<button
{...button}
className={buttonClass({ variant: "semiblack" })}
>
Show Code
</button>
)}
>
<div className="text-sm sm:text-base">
<LandingCode />
</div>
</UncontrolledModal>
</div>
</div>
<div className="text-center">
<AppFooter />
</div>
</div>
</div>
</>
)
}

View File

@@ -1,5 +0,0 @@
import type { LoaderFunction } from "remix"
import { serveTailwindCss } from "remix-tailwind"
export const loader: LoaderFunction = () =>
serveTailwindCss("app/modules/ui/tailwind.css")

View File

@@ -3,29 +3,31 @@
"name": "website",
"scripts": {
"prepare": "remix setup node",
"dev": "concurrently 'typedoc --watch' 'remix dev'",
"dev": "concurrently 'typedoc --watch' 'pnpm tailwind -- --watch' 'remix dev'",
"test": "node ./scripts/test.js",
"test-dev": "pnpm dev & wait-on http-get://localhost:3000 && cypress open",
"build": "typedoc && remix build",
"build": "typedoc && pnpm tailwind -- --minify && remix build",
"start": "remix-serve build",
"tailwind": "tailwindcss --config tailwind.config.cjs --input app/modules/ui/tailwind.css --output app/modules/ui/tailwind.out.css",
"typecheck": "tsc --noEmit && tsc --project cypress/tsconfig.json --noEmit"
},
"dependencies": {
"@headlessui/react": "^1.4.2",
"@heroicons/react": "^1.0.5",
"@reach/rect": "^0.16.0",
"@remix-run/react": "^1.1.1",
"@remix-run/serve": "^1.1.1",
"@tailwindcss/typography": "^0.5.0",
"autoprefixer": "^10.4.2",
"clsx": "^1.1.1",
"fast-glob": "^3.2.10",
"gray-matter": "^4.0.3",
"postcss": "^8.4.5",
"reacord": "workspace:*",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"remix": "^1.1.1",
"remix-tailwind": "^0.2.1",
"tailwindcss": "^3.0.13"
"react-focus-on": "^3.5.4",
"react-router": "^6.2.1",
"react-router-dom": "^6.2.1",
"remix": "^1.1.1"
},
"devDependencies": {
"@remix-run/dev": "^1.1.1",
@@ -36,10 +38,13 @@
"@types/react-dom": "^17.0.11",
"@types/tailwindcss": "^3.0.2",
"@types/wait-on": "^5.3.1",
"autoprefixer": "^10.4.2",
"concurrently": "^7.0.0",
"cypress": "^9.2.1",
"execa": "^6.0.0",
"postcss": "^8.4.5",
"rehype-prism-plus": "^1.3.1",
"tailwindcss": "^3.0.13",
"typedoc": "^0.22.10",
"typescript": "^4.5.4",
"wait-on": "^6.0.0"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -6,5 +6,4 @@ await execa("pnpm", ["build"], { stdio: "inherit" })
const app = execa("pnpm", ["start"], { stdio: "inherit" })
await waitOn({ resources: ["http-get://localhost:3000"] })
await cypress.run()
console.log("cypress run done")
app.kill()

323
pnpm-lock.yaml generated
View File

@@ -91,7 +91,9 @@ importers:
packages/website:
specifiers:
'@headlessui/react': ^1.4.2
'@heroicons/react': ^1.0.5
'@reach/rect': ^0.16.0
'@remix-run/dev': ^1.1.1
'@remix-run/node': ^1.1.1
'@remix-run/react': ^1.1.1
@@ -114,29 +116,32 @@ importers:
reacord: workspace:*
react: ^17.0.2
react-dom: ^17.0.2
react-focus-on: ^3.5.4
react-router: ^6.2.1
react-router-dom: ^6.2.1
rehype-prism-plus: ^1.3.1
remix: ^1.1.1
remix-tailwind: ^0.2.1
tailwindcss: ^3.0.13
typedoc: ^0.22.10
typescript: ^4.5.4
wait-on: ^6.0.0
dependencies:
'@headlessui/react': 1.4.2_react-dom@17.0.2+react@17.0.2
'@heroicons/react': 1.0.5_react@17.0.2
'@reach/rect': 0.16.0_react-dom@17.0.2+react@17.0.2
'@remix-run/react': 1.1.1_react-dom@17.0.2+react@17.0.2
'@remix-run/serve': 1.1.1_react-dom@17.0.2+react@17.0.2
'@tailwindcss/typography': 0.5.0_tailwindcss@3.0.13
autoprefixer: 10.4.2_postcss@8.4.5
clsx: 1.1.1
fast-glob: 3.2.10
gray-matter: 4.0.3
postcss: 8.4.5
reacord: link:../reacord
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
react-focus-on: 3.5.4_b08e3c15324cbe90a6ff8fcd416c932c
react-router: 6.2.1_react@17.0.2
react-router-dom: 6.2.1_react-dom@17.0.2+react@17.0.2
remix: 1.1.1
remix-tailwind: 0.2.1_8cbcda2c835593b4e5c6cfe0d6a6e9a3
tailwindcss: 3.0.13_ef48b3b8837f8a23677bffe8f9cd866d
devDependencies:
'@remix-run/dev': 1.1.1
'@remix-run/node': 1.1.1_react-dom@17.0.2+react@17.0.2
@@ -146,10 +151,13 @@ importers:
'@types/react-dom': 17.0.11
'@types/tailwindcss': 3.0.2
'@types/wait-on': 5.3.1
autoprefixer: 10.4.2_postcss@8.4.5
concurrently: 7.0.0
cypress: 9.2.1
execa: 6.0.0
postcss: 8.4.5
rehype-prism-plus: 1.3.1
tailwindcss: 3.0.13_ef48b3b8837f8a23677bffe8f9cd866d
typedoc: 0.22.10_typescript@4.5.4
typescript: 4.5.4
wait-on: 6.0.0
@@ -164,6 +172,7 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/highlight': 7.16.7
dev: true
/@babel/compat-data/7.16.8:
resolution: {integrity: sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==}
@@ -290,6 +299,7 @@ packages:
/@babel/helper-validator-identifier/7.16.7:
resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/helper-validator-option/7.16.7:
resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==}
@@ -314,6 +324,7 @@ packages:
'@babel/helper-validator-identifier': 7.16.7
chalk: 2.4.2
js-tokens: 4.0.0
dev: true
/@babel/parser/7.16.8:
resolution: {integrity: sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==}
@@ -585,6 +596,17 @@ packages:
'@hapi/hoek': 9.2.1
dev: true
/@headlessui/react/1.4.2_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-N8tv7kLhg9qGKBkVdtg572BvKvWhmiudmeEpOCyNwzOsZHCXBtl8AazGikIfUS+vBoub20Fse3BjawXDVPPdug==}
engines: {node: '>=10'}
peerDependencies:
react: ^16 || ^17 || ^18
react-dom: ^16 || ^17 || ^18
dependencies:
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
dev: false
/@heroicons/react/1.0.5_react@17.0.2:
resolution: {integrity: sha512-UDMyLM2KavIu2vlWfMspapw9yii7aoLwzI2Hudx4fyoPwfKfxU8r3cL8dEBXOjcLG0/oOONZzbT14M1HoNtEcg==}
peerDependencies:
@@ -823,6 +845,37 @@ packages:
'@octokit/openapi-types': 11.2.0
dev: true
/@reach/observe-rect/1.2.0:
resolution: {integrity: sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==}
dev: false
/@reach/rect/0.16.0_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-/qO9jQDzpOCdrSxVPR6l674mRHNTqfEjkaxZHluwJ/2qGUtYsA0GSZiF/+wX/yOWeBif1ycxJDa6HusAMJZC5Q==}
peerDependencies:
react: ^16.8.0 || 17.x
react-dom: ^16.8.0 || 17.x
dependencies:
'@reach/observe-rect': 1.2.0
'@reach/utils': 0.16.0_react-dom@17.0.2+react@17.0.2
prop-types: 15.8.1
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
tiny-warning: 1.0.3
tslib: 2.3.1
dev: false
/@reach/utils/0.16.0_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-PCggBet3qaQmwFNcmQ/GqHSefadAFyNCUekq9RrWoaU9hh/S4iaFgf2MBMdM47eQj5i/Bk0Mm07cP/XPFlkN+Q==}
peerDependencies:
react: ^16.8.0 || 17.x
react-dom: ^16.8.0 || 17.x
dependencies:
react: 17.0.2
react-dom: 17.0.2_react@17.0.2
tiny-warning: 1.0.3
tslib: 2.3.1
dev: false
/@remix-run/dev/1.1.1:
resolution: {integrity: sha512-dkzMVgMzaQUppf2za3kD+izsEK1hLsLQSVtDD3wN7pBMEbWXaEkWb2X2lj3c9yRDArPB7y5+09rm4SUnE4mL6A==}
hasBin: true
@@ -1205,6 +1258,7 @@ packages:
/@types/parse-json/4.0.0:
resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
dev: true
/@types/parse5/6.0.3:
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
@@ -1253,10 +1307,6 @@ packages:
resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==}
dev: true
/@types/tailwindcss/2.2.4:
resolution: {integrity: sha512-8mIk+0BoReKiaBI4e3hjaz9YDQto+rdZ2eEExHf6AfS38FZcALQ6s8mTd+74N8BtBaLnTzLdNe5GbkzObWlSXw==}
dev: false
/@types/tailwindcss/3.0.2:
resolution: {integrity: sha512-4nilb5vk7aZXaQvMZin5dSHX+AIHZNDmKtDDRHfVKE/XNkQK9OjZ9V+zo+XHoH/fdLzureJno3+C5wIGdrBzgQ==}
dev: true
@@ -1480,18 +1530,18 @@ packages:
acorn: 7.4.1
acorn-walk: 7.2.0
xtend: 4.0.2
dev: false
dev: true
/acorn-walk/7.2.0:
resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
engines: {node: '>=0.4.0'}
dev: false
dev: true
/acorn/7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: false
dev: true
/acorn/8.7.0:
resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==}
@@ -1546,6 +1596,7 @@ packages:
engines: {node: '>=4'}
dependencies:
color-convert: 1.9.3
dev: true
/ansi-styles/4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
@@ -1575,6 +1626,7 @@ packages:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
dev: true
/arch/2.2.0:
resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
@@ -1582,7 +1634,7 @@ packages:
/arg/5.0.1:
resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==}
dev: false
dev: true
/argparse/1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
@@ -1593,6 +1645,13 @@ packages:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
/aria-hidden/1.1.3:
resolution: {integrity: sha512-RhVWFtKH5BiGMycI72q2RAFMLQi8JP9bLuQXgR5a8Znp7P5KOIADSJeyfI8PCVxLEp067B2HbP5JIiI/PXIZeA==}
engines: {node: '>=8.5.0'}
dependencies:
tslib: 1.14.1
dev: false
/aria-query/4.2.2:
resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
engines: {node: '>=6.0'}
@@ -1752,7 +1811,7 @@ packages:
picocolors: 1.0.0
postcss: 8.4.5
postcss-value-parser: 4.2.0
dev: false
dev: true
/available-typed-arrays/1.0.5:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
@@ -1908,6 +1967,7 @@ packages:
/binary-extensions/2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}
dev: true
/bindings/1.5.0:
resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
@@ -2014,6 +2074,7 @@ packages:
escalade: 3.1.1
node-releases: 2.0.1
picocolors: 1.0.0
dev: true
/bser/2.1.1:
resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
@@ -2184,11 +2245,12 @@ packages:
/callsites/3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
dev: true
/camelcase-css/2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
dev: false
dev: true
/camelcase-keys/6.2.2:
resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
@@ -2211,6 +2273,7 @@ packages:
/caniuse-lite/1.0.30001298:
resolution: {integrity: sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==}
dev: true
/capture-exit/2.0.0:
resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==}
@@ -2242,6 +2305,7 @@ packages:
ansi-styles: 3.2.1
escape-string-regexp: 1.0.5
supports-color: 5.5.0
dev: true
/chalk/4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -2296,6 +2360,7 @@ packages:
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.2
dev: true
/chownr/2.0.0:
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
@@ -2407,6 +2472,7 @@ packages:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies:
color-name: 1.1.3
dev: true
/color-convert/2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
@@ -2416,6 +2482,7 @@ packages:
/color-name/1.1.3:
resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=}
dev: true
/color-name/1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
@@ -2561,6 +2628,7 @@ packages:
parse-json: 5.2.0
path-type: 4.0.0
yaml: 1.10.2
dev: true
/cp-file/7.0.0:
resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==}
@@ -2615,7 +2683,7 @@ packages:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
hasBin: true
dev: false
dev: true
/csstype/3.0.10:
resolution: {integrity: sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==}
@@ -2829,7 +2897,7 @@ packages:
/defined/1.0.0:
resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=}
dev: false
dev: true
/delayed-stream/1.0.0:
resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=}
@@ -2866,6 +2934,10 @@ packages:
resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=}
dev: false
/detect-node-es/1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
dev: false
/detective/5.2.0:
resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==}
engines: {node: '>=0.8.0'}
@@ -2874,7 +2946,7 @@ packages:
acorn-node: 1.8.2
defined: 1.0.0
minimist: 1.2.5
dev: false
dev: true
/dicer/0.3.0:
resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==}
@@ -2884,7 +2956,7 @@ packages:
/didyoumean/1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
dev: false
dev: true
/diff/5.0.0:
resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
@@ -2930,7 +3002,7 @@ packages:
/dlv/1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dev: false
dev: true
/doctrine/2.1.0:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
@@ -2979,6 +3051,7 @@ packages:
/electron-to-chromium/1.4.41:
resolution: {integrity: sha512-VQEXEJc+8rJIva85H8EPtB5Ux9g8TzkNGBanqphM9ZWMZ34elueKJ+5g+BPhz3Lk8gkujfQRcIZ+fpA0btUIuw==}
dev: true
/emoji-regex/8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -3014,6 +3087,7 @@ packages:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
dependencies:
is-arrayish: 0.2.1
dev: true
/es-abstract/1.19.1:
resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==}
@@ -3250,6 +3324,7 @@ packages:
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
dev: true
/escape-goat/2.1.1:
resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
@@ -3931,6 +4006,13 @@ packages:
resolution: {integrity: sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==}
dev: true
/focus-lock/0.10.1:
resolution: {integrity: sha512-b9yUklCi4fTu2GXn7dnaVf4hiLVVBp7xTiZarAHMODV2To6Bitf6F/UI67RmKbdgJQeVwI1UO0d9HYNbXt3GkA==}
engines: {node: '>=10'}
dependencies:
tslib: 2.3.1
dev: false
/follow-redirects/1.14.7:
resolution: {integrity: sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==}
engines: {node: '>=4.0'}
@@ -3997,7 +4079,7 @@ packages:
/fraction.js/4.1.2:
resolution: {integrity: sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==}
dev: false
dev: true
/fragment-cache/0.2.1:
resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=}
@@ -4043,6 +4125,7 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: true
optional: true
/function-bind/1.1.1:
@@ -4073,6 +4156,11 @@ packages:
has: 1.0.3
has-symbols: 1.0.2
/get-nonce/1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
dev: false
/get-package-type/0.1.0:
resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
engines: {node: '>=8.0.0'}
@@ -4150,6 +4238,7 @@ packages:
engines: {node: '>=10.13.0'}
dependencies:
is-glob: 4.0.3
dev: true
/glob-to-regexp/0.3.0:
resolution: {integrity: sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=}
@@ -4291,6 +4380,7 @@ packages:
/has-flag/3.0.0:
resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=}
engines: {node: '>=4'}
dev: true
/has-flag/4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
@@ -4505,6 +4595,7 @@ packages:
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
dev: true
/import-from/3.0.0:
resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==}
@@ -4591,6 +4682,12 @@ packages:
engines: {node: '>= 0.10'}
dev: true
/invariant/2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
dependencies:
loose-envify: 1.4.0
dev: false
/ipaddr.js/1.9.1:
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
engines: {node: '>= 0.10'}
@@ -4628,6 +4725,7 @@ packages:
/is-arrayish/0.2.1:
resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=}
dev: true
/is-bigint/1.0.4:
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
@@ -4639,6 +4737,7 @@ packages:
engines: {node: '>=8'}
dependencies:
binary-extensions: 2.2.0
dev: true
/is-boolean-object/1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
@@ -4684,6 +4783,7 @@ packages:
resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==}
dependencies:
has: 1.0.3
dev: true
/is-data-descriptor/0.1.4:
resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=}
@@ -5106,6 +5206,7 @@ packages:
/json-parse-even-better-errors/2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
dev: true
/json-schema-traverse/0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
@@ -5242,9 +5343,11 @@ packages:
/lilconfig/2.0.4:
resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==}
engines: {node: '>=10'}
dev: true
/lines-and-columns/1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
dev: true
/listr2/3.14.0_enquirer@2.3.6:
resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
@@ -5931,6 +6034,7 @@ packages:
/minimist/1.2.5:
resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==}
dev: true
/minipass-collect/1.0.2:
resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==}
@@ -6080,6 +6184,7 @@ packages:
/node-releases/2.0.1:
resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==}
dev: true
/nodemon/2.0.15:
resolution: {integrity: sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==}
@@ -6125,11 +6230,12 @@ packages:
/normalize-path/3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
dev: true
/normalize-range/0.1.2:
resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=}
engines: {node: '>=0.10.0'}
dev: false
dev: true
/normalize-url/4.5.1:
resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
@@ -6180,7 +6286,7 @@ packages:
/object-hash/2.2.0:
resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
engines: {node: '>= 6'}
dev: false
dev: true
/object-inspect/1.12.0:
resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==}
@@ -6466,6 +6572,7 @@ packages:
engines: {node: '>=6'}
dependencies:
callsites: 3.1.0
dev: true
/parse-entities/4.0.0:
resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==}
@@ -6488,6 +6595,7 @@ packages:
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
dev: true
/parse-ms/2.1.0:
resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==}
@@ -6562,6 +6670,7 @@ packages:
/path-parse/1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
/path-to-regexp/0.1.7:
resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=}
@@ -6577,6 +6686,7 @@ packages:
/path-type/4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
dev: true
/pathval/1.1.1:
resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
@@ -6599,6 +6709,7 @@ packages:
/picocolors/1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
dev: true
/picomatch/2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -6641,7 +6752,7 @@ packages:
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.5
dev: false
dev: true
/postcss-load-config/3.1.1:
resolution: {integrity: sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==}
@@ -6654,6 +6765,7 @@ packages:
dependencies:
lilconfig: 2.0.4
yaml: 1.10.2
dev: true
/postcss-nested/5.0.6_postcss@8.4.5:
resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==}
@@ -6663,7 +6775,7 @@ packages:
dependencies:
postcss: 8.4.5
postcss-selector-parser: 6.0.8
dev: false
dev: true
/postcss-selector-parser/6.0.8:
resolution: {integrity: sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==}
@@ -6671,11 +6783,11 @@ packages:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
dev: false
dev: true
/postcss-value-parser/4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
dev: false
dev: true
/postcss/8.4.5:
resolution: {integrity: sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==}
@@ -6684,6 +6796,7 @@ packages:
nanoid: 3.1.31
picocolors: 1.0.0
source-map-js: 1.0.1
dev: true
/prelude-ls/1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
@@ -6749,7 +6862,6 @@ packages:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
dev: true
/property-information/6.1.1:
resolution: {integrity: sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==}
@@ -6846,6 +6958,7 @@ packages:
/quick-lru/5.1.1:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'}
dev: true
/range-parser/1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
@@ -6872,6 +6985,15 @@ packages:
strip-json-comments: 2.0.1
dev: true
/react-clientside-effect/1.2.5_react@17.0.2:
resolution: {integrity: sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA==}
peerDependencies:
react: ^15.3.0 || ^16.0.0 || ^17.0.0
dependencies:
'@babel/runtime': 7.16.7
react: 17.0.2
dev: false
/react-dom/17.0.2_react@17.0.2:
resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==}
peerDependencies:
@@ -6883,9 +7005,45 @@ packages:
scheduler: 0.20.2
dev: false
/react-focus-lock/2.7.1_b08e3c15324cbe90a6ff8fcd416c932c:
resolution: {integrity: sha512-ImSeVmcrLKNMqzUsIdqOkXwTVltj79OPu43oT8tVun7eIckA4VdM7UmYUFo3H/UC2nRVgagMZGFnAOQEDiDYcA==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@babel/runtime': 7.16.7
focus-lock: 0.10.1
prop-types: 15.8.1
react: 17.0.2
react-clientside-effect: 1.2.5_react@17.0.2
use-callback-ref: 1.2.5_b08e3c15324cbe90a6ff8fcd416c932c
use-sidecar: 1.0.5_react@17.0.2
transitivePeerDependencies:
- '@types/react'
dev: false
/react-focus-on/3.5.4_b08e3c15324cbe90a6ff8fcd416c932c:
resolution: {integrity: sha512-HnU0YGKhNSUsC4k6K8L+2wk8mC/qdg+CsS7A1bWLMgK7UuBphdECs2esnS6cLmBoVNjsFnCm/vMypeezKOdK3A==}
engines: {node: '>=8.5.0'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
dependencies:
'@types/react': 17.0.38
aria-hidden: 1.1.3
react: 17.0.2
react-focus-lock: 2.7.1_b08e3c15324cbe90a6ff8fcd416c932c
react-remove-scroll: 2.4.3_b08e3c15324cbe90a6ff8fcd416c932c
react-style-singleton: 2.1.1_b08e3c15324cbe90a6ff8fcd416c932c
tslib: 2.3.1
use-callback-ref: 1.2.5_b08e3c15324cbe90a6ff8fcd416c932c
use-sidecar: 1.0.5_react@17.0.2
dev: false
/react-is/16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
dev: true
/react-is/17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
@@ -6903,6 +7061,41 @@ packages:
scheduler: 0.20.2
dev: false
/react-remove-scroll-bar/2.2.0_b08e3c15324cbe90a6ff8fcd416c932c:
resolution: {integrity: sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg==}
engines: {node: '>=8.5.0'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0
react: ^16.8.0 || ^17.0.0
peerDependenciesMeta:
'@types/react':
optional: true
dependencies:
'@types/react': 17.0.38
react: 17.0.2
react-style-singleton: 2.1.1_b08e3c15324cbe90a6ff8fcd416c932c
tslib: 1.14.1
dev: false
/react-remove-scroll/2.4.3_b08e3c15324cbe90a6ff8fcd416c932c:
resolution: {integrity: sha512-lGWYXfV6jykJwbFpsuPdexKKzp96f3RbvGapDSIdcyGvHb7/eqyn46C7/6h+rUzYar1j5mdU+XECITHXCKBk9Q==}
engines: {node: '>=8.5.0'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0
react: ^16.8.0 || ^17.0.0
peerDependenciesMeta:
'@types/react':
optional: true
dependencies:
'@types/react': 17.0.38
react: 17.0.2
react-remove-scroll-bar: 2.2.0_b08e3c15324cbe90a6ff8fcd416c932c
react-style-singleton: 2.1.1_b08e3c15324cbe90a6ff8fcd416c932c
tslib: 1.14.1
use-callback-ref: 1.2.5_b08e3c15324cbe90a6ff8fcd416c932c
use-sidecar: 1.0.5_react@17.0.2
dev: false
/react-router-dom/6.2.1_react-dom@17.0.2+react@17.0.2:
resolution: {integrity: sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA==}
peerDependencies:
@@ -6922,6 +7115,23 @@ packages:
history: 5.2.0
react: 17.0.2
/react-style-singleton/2.1.1_b08e3c15324cbe90a6ff8fcd416c932c:
resolution: {integrity: sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA==}
engines: {node: '>=8.5.0'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0
react: ^16.8.0 || ^17.0.0
peerDependenciesMeta:
'@types/react':
optional: true
dependencies:
'@types/react': 17.0.38
get-nonce: 1.0.1
invariant: 2.2.4
react: 17.0.2
tslib: 1.14.1
dev: false
/react/17.0.2:
resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
engines: {node: '>=0.10.0'}
@@ -6969,6 +7179,7 @@ packages:
engines: {node: '>=8.10.0'}
dependencies:
picomatch: 2.3.1
dev: true
/rechoir/0.6.2:
resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=}
@@ -7133,21 +7344,6 @@ packages:
unified: 10.1.1
dev: true
/remix-tailwind/0.2.1_8cbcda2c835593b4e5c6cfe0d6a6e9a3:
resolution: {integrity: sha512-MqUQzOYiDGXpfJtWC5gbQW3mqM2ly4+Uljo0fvGG4NYZLCzh0OTKGxqwUj7R3lt7iN29Ff4TIo1a/N2adqfUnA==}
peerDependencies:
postcss: '>=8'
tailwindcss: '>=2'
dependencies:
'@remix-run/node': 1.1.1_react-dom@17.0.2+react@17.0.2
'@types/tailwindcss': 2.2.4
postcss: 8.4.5
tailwindcss: 3.0.13_ef48b3b8837f8a23677bffe8f9cd866d
transitivePeerDependencies:
- react
- react-dom
dev: false
/remix/1.1.1:
resolution: {integrity: sha512-bo/300CdEAidEwn+r+vouPeZgDd+64Uhs4z0nTv1FRNfzt9NhHVLeJHO1M3EPa55imwGhduIzq3uVDxzz1WE1w==}
dependencies:
@@ -7184,6 +7380,7 @@ packages:
/resolve-from/4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
dev: true
/resolve-from/5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
@@ -7201,6 +7398,7 @@ packages:
is-core-module: 2.8.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
dev: true
/resolve/2.0.0-next.3:
resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==}
@@ -7529,6 +7727,7 @@ packages:
/source-map-js/1.0.1:
resolution: {integrity: sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==}
engines: {node: '>=0.10.0'}
dev: true
/source-map-resolve/0.5.3:
resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
@@ -7768,6 +7967,7 @@ packages:
engines: {node: '>=4'}
dependencies:
has-flag: 3.0.0
dev: true
/supports-color/7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
@@ -7785,6 +7985,7 @@ packages:
/supports-preserve-symlinks-flag/1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
dev: true
/tailwindcss/3.0.13_ef48b3b8837f8a23677bffe8f9cd866d:
resolution: {integrity: sha512-raRPGFwQSGXn/3h0ttHND9jyPYfqk/ur2NXtlQuK25+ZnrCjlH1s1j4/oPswHGMoZzGNykUVycZ/LcROanUE0A==}
@@ -7818,7 +8019,7 @@ packages:
resolve: 1.21.0
transitivePeerDependencies:
- ts-node
dev: false
dev: true
/tar/6.1.11:
resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==}
@@ -7865,6 +8066,10 @@ packages:
/through/2.3.8:
resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=}
/tiny-warning/1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
dev: false
/tinypool/0.1.1:
resolution: {integrity: sha512-sW2fQZ2BRb/GX5v55NkHiTrbMLx0eX0xNpP+VGhOe2f7Oo04+LeClDyM19zCE/WCy7jJ8kzIJ0Ojrxj3UhN9Sg==}
engines: {node: '>=14.0.0'}
@@ -8323,6 +8528,31 @@ packages:
querystring: 0.2.0
dev: true
/use-callback-ref/1.2.5_b08e3c15324cbe90a6ff8fcd416c932c:
resolution: {integrity: sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==}
engines: {node: '>=8.5.0'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0
react: ^16.8.0 || ^17.0.0
peerDependenciesMeta:
'@types/react':
optional: true
dependencies:
'@types/react': 17.0.38
react: 17.0.2
dev: false
/use-sidecar/1.0.5_react@17.0.2:
resolution: {integrity: sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA==}
engines: {node: '>=8.5.0'}
peerDependencies:
react: ^16.8.0 || ^17.0.0
dependencies:
detect-node-es: 1.1.0
react: 17.0.2
tslib: 1.14.1
dev: false
/use/3.1.1:
resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
engines: {node: '>=0.10.0'}
@@ -8679,7 +8909,7 @@ packages:
/xtend/4.0.2:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
dev: false
dev: true
/y18n/5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
@@ -8693,6 +8923,7 @@ packages:
/yaml/1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
dev: true
/yargs-parser/18.1.3:
resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}