title
This commit is contained in:
parent
e3c477181d
commit
5bb6ae6aa3
12 changed files with 222 additions and 59 deletions
|
@ -18,7 +18,11 @@
|
||||||
"@tanstack/react-query": "^5.37.1",
|
"@tanstack/react-query": "^5.37.1",
|
||||||
"@tauri-apps/api": "^1",
|
"@tauri-apps/api": "^1",
|
||||||
"@uiw/react-md-editor": "^4.0.4",
|
"@uiw/react-md-editor": "^4.0.4",
|
||||||
|
"hast-util-to-mdast": "^10.1.0",
|
||||||
"javascript-time-ago": "^2.5.10",
|
"javascript-time-ago": "^2.5.10",
|
||||||
|
"jotai": "^2.8.1",
|
||||||
|
"mdast-util-from-markdown": "^2.0.0",
|
||||||
|
"mdast-util-to-markdown": "^2.1.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-markdown": "^9.0.1",
|
"react-markdown": "^9.0.1",
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
padding: 12px;
|
padding: 2px 12px;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
|
|
||||||
background: rgb(204, 201, 255);
|
background: rgb(204, 201, 255);
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
import styles from "./Header.module.scss";
|
import styles from "./Header.module.scss";
|
||||||
|
import NoteAddIcon from "@mui/icons-material/NoteAdd";
|
||||||
import SearchBar from "./SearchBar";
|
import SearchBar from "./SearchBar";
|
||||||
|
|
||||||
export default function Header() {
|
export default function Header() {
|
||||||
return (
|
return (
|
||||||
<div className={styles.Header}>
|
<div className={styles.Header}>
|
||||||
<span>Panorama</span>
|
<span>Panorama</span>
|
||||||
|
<button type="button">
|
||||||
|
<NoteAddIcon />
|
||||||
|
</button>
|
||||||
<SearchBar />
|
<SearchBar />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,24 +7,17 @@
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mdContent {
|
|
||||||
flex-grow: 1;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mdEditor {
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
padding: 2px 12px;
|
padding: 2px 12px;
|
||||||
color: rgb(106, 103, 160);
|
color: rgb(106, 103, 160);
|
||||||
background: rgb(204, 201, 255);
|
background: rgb(204, 201, 255);
|
||||||
background: linear-gradient(90deg, rgba(204, 201, 255, 1) 0%, rgba(255, 255, 255, 1) 100%);
|
background: linear-gradient(90deg, rgba(204, 201, 255, 1) 0%, rgba(255, 255, 255, 1) 100%);
|
||||||
|
|
||||||
|
font-size: 0.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.body {
|
.body {
|
||||||
|
@ -35,3 +28,12 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
padding: 12px;
|
||||||
|
border-bottom: 1px solid lightgray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.untitled {
|
||||||
|
color: gray;
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import ReactTimeAgo from "react-time-ago";
|
||||||
import Markdown from "react-markdown";
|
import Markdown from "react-markdown";
|
||||||
import MDEditor, { commands } from "@uiw/react-md-editor";
|
import MDEditor, { commands } from "@uiw/react-md-editor";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
import JournalPage from "./nodes/JournalPage";
|
||||||
|
|
||||||
export interface NodeDisplayProps {
|
export interface NodeDisplayProps {
|
||||||
id: string;
|
id: string;
|
||||||
|
@ -26,9 +27,12 @@ export default function NodeDisplay({ id }: NodeDisplayProps) {
|
||||||
{isSuccess ? (
|
{isSuccess ? (
|
||||||
<NodeDisplayHeaderLoaded id={id} data={data} />
|
<NodeDisplayHeaderLoaded id={id} data={data} />
|
||||||
) : (
|
) : (
|
||||||
<small>ID {id}</small>
|
<>ID {id}</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
<div className={styles.title}>
|
||||||
|
{data.title ?? <span className={styles.untitled}>(untitled)</span>}
|
||||||
|
</div>
|
||||||
<div className={styles.body}>
|
<div className={styles.body}>
|
||||||
{isSuccess ? (
|
{isSuccess ? (
|
||||||
<NodeDisplayLoaded id={id} data={data} />
|
<NodeDisplayLoaded id={id} data={data} />
|
||||||
|
@ -42,49 +46,23 @@ export default function NodeDisplay({ id }: NodeDisplayProps) {
|
||||||
|
|
||||||
function NodeDisplayHeaderLoaded({ id, data }) {
|
function NodeDisplayHeaderLoaded({ id, data }) {
|
||||||
return (
|
return (
|
||||||
<small>
|
<>
|
||||||
Type {data.type} · Last updated{" "}
|
Type {data.type} · Last updated{" "}
|
||||||
<ReactTimeAgo date={data.created_at * 1000} /> · {id}
|
<ReactTimeAgo date={data.created_at * 1000} /> · {id}
|
||||||
</small>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function NodeDisplayLoaded({ id, data }) {
|
function NodeDisplayLoaded({ id, data }) {
|
||||||
const [value, setValue] = useState(() => data.content);
|
switch (data.type) {
|
||||||
const [isEditing, setIsEditing] = useState(() => false);
|
case "panorama/journal/page":
|
||||||
|
return <JournalPage id={id} data={data} />;
|
||||||
|
|
||||||
|
default:
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<details>
|
Don't know how to render node of type <code>{data.type}</code>
|
||||||
<summary>JSON</summary>
|
|
||||||
<pre>{JSON.stringify(data, null, 2)}</pre>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<button type="button" onClick={() => setIsEditing((prev) => !prev)}>
|
|
||||||
{isEditing ? "done" : "edit"}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<div className={styles.mdContent} data-color-mode="light">
|
|
||||||
{
|
|
||||||
isEditing ? (
|
|
||||||
<>
|
|
||||||
<MDEditor
|
|
||||||
data-color-mode="light"
|
|
||||||
className={styles.mdEditor}
|
|
||||||
value={value}
|
|
||||||
onChange={setValue}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<MDEditor.Markdown
|
|
||||||
source={value}
|
|
||||||
style={{ whiteSpace: "pre-wrap" }}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
// <Markdown>{data.content}</Markdown>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,20 @@
|
||||||
background-color: rgba(255, 255, 255, 0.5);
|
background-color: rgba(255, 255, 255, 0.5);
|
||||||
backdrop-filter: blur(20px);
|
backdrop-filter: blur(20px);
|
||||||
-webkit-backdrop-filter: blur(10px);
|
-webkit-backdrop-filter: blur(10px);
|
||||||
// box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.25);
|
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.25);
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
|
||||||
min-width: 500px;
|
min-width: 500px;
|
||||||
min-height: 200px;
|
min-height: 200px;
|
||||||
|
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
padding: 2px 6px;
|
||||||
|
font-size: 14pt;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
}
|
}
|
|
@ -33,6 +33,7 @@ export default function SearchBar() {
|
||||||
<>
|
<>
|
||||||
<div>
|
<div>
|
||||||
<input
|
<input
|
||||||
|
className={styles.entry}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Search..."
|
placeholder="Search..."
|
||||||
onFocus={() => setShowMenu(true)}
|
onFocus={() => setShowMenu(true)}
|
||||||
|
@ -44,7 +45,6 @@ export default function SearchBar() {
|
||||||
{showMenu && (
|
{showMenu && (
|
||||||
<FloatingPortal>
|
<FloatingPortal>
|
||||||
<FloatingOverlay>
|
<FloatingOverlay>
|
||||||
{/* <FloatingFocusManager context={context} modal={false}> */}
|
|
||||||
<div
|
<div
|
||||||
ref={refs.setFloating}
|
ref={refs.setFloating}
|
||||||
className={styles.menu}
|
className={styles.menu}
|
||||||
|
@ -53,7 +53,6 @@ export default function SearchBar() {
|
||||||
>
|
>
|
||||||
<SearchMenu />
|
<SearchMenu />
|
||||||
</div>
|
</div>
|
||||||
{/* </FloatingFocusManager> */}
|
|
||||||
</FloatingOverlay>
|
</FloatingOverlay>
|
||||||
</FloatingPortal>
|
</FloatingPortal>
|
||||||
)}
|
)}
|
||||||
|
@ -61,6 +60,6 @@ export default function SearchBar() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function SearchMenu({}) {
|
function SearchMenu() {
|
||||||
return <>Search</>;
|
return <>Search suggestions...</>;
|
||||||
}
|
}
|
||||||
|
|
9
app/src/components/nodes/JournalPage.module.scss
Normal file
9
app/src/components/nodes/JournalPage.module.scss
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
.mdContent {
|
||||||
|
flex-grow: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mdEditor {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
29
app/src/components/nodes/JournalPage.tsx
Normal file
29
app/src/components/nodes/JournalPage.tsx
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { createContext, useCallback, useContext, useState } from "react";
|
||||||
|
import styles from "./JournalPage.module.scss";
|
||||||
|
import MDEditor from "@uiw/react-md-editor";
|
||||||
|
import Markdown from "react-markdown";
|
||||||
|
import { toMdast } from "hast-util-to-mdast";
|
||||||
|
import { fromMarkdown } from "mdast-util-from-markdown";
|
||||||
|
import { toMarkdown } from "mdast-util-to-markdown";
|
||||||
|
|
||||||
|
const MDContext = createContext(null);
|
||||||
|
|
||||||
|
export default function JournalPage({ id, data }) {
|
||||||
|
const [content, setContent] = useState(() => data.content);
|
||||||
|
const [isEditing, setIsEditing] = useState(() => false);
|
||||||
|
|
||||||
|
const tree = fromMarkdown(data.content);
|
||||||
|
console.log("tree", tree);
|
||||||
|
|
||||||
|
const contextValue = { content, setContent, isEditing, setIsEditing };
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<details>
|
||||||
|
<summary>JSON</summary>
|
||||||
|
<pre>{JSON.stringify(data, null, 2)}</pre>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<div className={styles.mdContent} data-color-mode="light"></div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
|
@ -29,7 +29,7 @@ use tower_http::cors::{self, CorsLayer};
|
||||||
use crate::{
|
use crate::{
|
||||||
journal::get_todays_journal_id,
|
journal::get_todays_journal_id,
|
||||||
migrations::run_migrations,
|
migrations::run_migrations,
|
||||||
node::{get_node, update_node},
|
node::{get_node, node_types, update_node},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
@ -66,12 +66,13 @@ async fn main() -> Result<()> {
|
||||||
.route("/", get(|| async { "Hello, World!" }))
|
.route("/", get(|| async { "Hello, World!" }))
|
||||||
.route("/node/:id", get(get_node))
|
.route("/node/:id", get(get_node))
|
||||||
.route("/node/:id", post(update_node))
|
.route("/node/:id", post(update_node))
|
||||||
|
.route("/node/types", get(node_types))
|
||||||
.route("/journal/get_todays_journal_id", get(get_todays_journal_id))
|
.route("/journal/get_todays_journal_id", get(get_todays_journal_id))
|
||||||
.layer(ServiceBuilder::new().layer(cors))
|
.layer(ServiceBuilder::new().layer(cors))
|
||||||
.with_state(state);
|
.with_state(state);
|
||||||
|
|
||||||
let listener = TcpListener::bind("0.0.0.0:5195").await?;
|
let listener = TcpListener::bind("0.0.0.0:5195").await?;
|
||||||
println!("Listening...");
|
println!("Listening... {:?}", listener);
|
||||||
axum::serve(listener, app).await?;
|
axum::serve(listener, app).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use axum::{
|
use axum::{
|
||||||
extract::{Path, State},
|
extract::{Path, State},
|
||||||
http::StatusCode,
|
http::StatusCode,
|
||||||
|
@ -54,12 +56,26 @@ pub async fn get_node(
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize, Debug)]
|
||||||
struct NodeUpdate {}
|
pub struct UpdateData {
|
||||||
|
title: Option<String>,
|
||||||
|
extra_data: Option<HashMap<String, Value>>,
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn update_node(
|
pub async fn update_node(
|
||||||
State(state): State<AppState>,
|
State(state): State<AppState>,
|
||||||
Path(node_id): Path<String>,
|
Path(node_id): Path<String>,
|
||||||
|
Json(update_data): Json<UpdateData>,
|
||||||
) -> AppResult<Json<Value>> {
|
) -> AppResult<Json<Value>> {
|
||||||
|
println!("Update data: {:?}", update_data);
|
||||||
|
|
||||||
Ok(Json(json!({})))
|
Ok(Json(json!({})))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn node_types() -> AppResult<Json<Value>> {
|
||||||
|
Ok(Json(json!({
|
||||||
|
"types": [
|
||||||
|
{ "id": "panorama/journal/page", "display": "Journal Entry" },
|
||||||
|
]
|
||||||
|
})))
|
||||||
|
}
|
||||||
|
|
109
pnpm-lock.yaml
109
pnpm-lock.yaml
|
@ -35,9 +35,21 @@ importers:
|
||||||
'@uiw/react-md-editor':
|
'@uiw/react-md-editor':
|
||||||
specifier: ^4.0.4
|
specifier: ^4.0.4
|
||||||
version: 4.0.4(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
version: 4.0.4(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
|
hast-util-to-mdast:
|
||||||
|
specifier: ^10.1.0
|
||||||
|
version: 10.1.0
|
||||||
javascript-time-ago:
|
javascript-time-ago:
|
||||||
specifier: ^2.5.10
|
specifier: ^2.5.10
|
||||||
version: 2.5.10
|
version: 2.5.10
|
||||||
|
jotai:
|
||||||
|
specifier: ^2.8.1
|
||||||
|
version: 2.8.1(@types/react@18.3.3)(react@18.3.1)
|
||||||
|
mdast-util-from-markdown:
|
||||||
|
specifier: ^2.0.0
|
||||||
|
version: 2.0.0
|
||||||
|
mdast-util-to-markdown:
|
||||||
|
specifier: ^2.1.0
|
||||||
|
version: 2.1.0
|
||||||
react:
|
react:
|
||||||
specifier: ^18.2.0
|
specifier: ^18.2.0
|
||||||
version: 18.3.1
|
version: 18.3.1
|
||||||
|
@ -954,6 +966,9 @@ packages:
|
||||||
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
hast-util-embedded@3.0.0:
|
||||||
|
resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==}
|
||||||
|
|
||||||
hast-util-from-html@2.0.1:
|
hast-util-from-html@2.0.1:
|
||||||
resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==}
|
resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==}
|
||||||
|
|
||||||
|
@ -966,6 +981,9 @@ packages:
|
||||||
hast-util-heading-rank@3.0.0:
|
hast-util-heading-rank@3.0.0:
|
||||||
resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==}
|
resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==}
|
||||||
|
|
||||||
|
hast-util-is-body-ok-link@3.0.0:
|
||||||
|
resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==}
|
||||||
|
|
||||||
hast-util-is-element@3.0.0:
|
hast-util-is-element@3.0.0:
|
||||||
resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
|
resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
|
||||||
|
|
||||||
|
@ -975,6 +993,9 @@ packages:
|
||||||
hast-util-parse-selector@4.0.0:
|
hast-util-parse-selector@4.0.0:
|
||||||
resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
|
resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
|
||||||
|
|
||||||
|
hast-util-phrasing@3.0.1:
|
||||||
|
resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==}
|
||||||
|
|
||||||
hast-util-raw@9.0.3:
|
hast-util-raw@9.0.3:
|
||||||
resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==}
|
resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==}
|
||||||
|
|
||||||
|
@ -987,12 +1008,18 @@ packages:
|
||||||
hast-util-to-jsx-runtime@2.3.0:
|
hast-util-to-jsx-runtime@2.3.0:
|
||||||
resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==}
|
resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==}
|
||||||
|
|
||||||
|
hast-util-to-mdast@10.1.0:
|
||||||
|
resolution: {integrity: sha512-DsL/SvCK9V7+vfc6SLQ+vKIyBDXTk2KLSbfBYkH4zeF/uR1yBajHRhkzuaUSGOB1WJSTieJBdHwxlC+HLKvZZw==}
|
||||||
|
|
||||||
hast-util-to-parse5@8.0.0:
|
hast-util-to-parse5@8.0.0:
|
||||||
resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
|
resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
|
||||||
|
|
||||||
hast-util-to-string@3.0.0:
|
hast-util-to-string@3.0.0:
|
||||||
resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==}
|
resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==}
|
||||||
|
|
||||||
|
hast-util-to-text@4.0.2:
|
||||||
|
resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
|
||||||
|
|
||||||
hast-util-whitespace@3.0.0:
|
hast-util-whitespace@3.0.0:
|
||||||
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
|
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
|
||||||
|
|
||||||
|
@ -1062,6 +1089,18 @@ packages:
|
||||||
javascript-time-ago@2.5.10:
|
javascript-time-ago@2.5.10:
|
||||||
resolution: {integrity: sha512-EUxp4BP74QH8xiYHyeSHopx1XhMMJ9qEX4rcBdFtpVWmKRdzpxbNzz2GSbuekZr5wt0rmLehuyp0PE34EAJT9g==}
|
resolution: {integrity: sha512-EUxp4BP74QH8xiYHyeSHopx1XhMMJ9qEX4rcBdFtpVWmKRdzpxbNzz2GSbuekZr5wt0rmLehuyp0PE34EAJT9g==}
|
||||||
|
|
||||||
|
jotai@2.8.1:
|
||||||
|
resolution: {integrity: sha512-Gmk5Y3yJL/vN5S0rQ6AaWpXH5Q+HBGHThMHXfylVzXGVuO8YxPRtZf8Y9XYvl+h7ZMQXoHNdFi37vNsJFsiszQ==}
|
||||||
|
engines: {node: '>=12.20.0'}
|
||||||
|
peerDependencies:
|
||||||
|
'@types/react': '>=17.0.0'
|
||||||
|
react: '>=17.0.0'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@types/react':
|
||||||
|
optional: true
|
||||||
|
react:
|
||||||
|
optional: true
|
||||||
|
|
||||||
js-tokens@4.0.0:
|
js-tokens@4.0.0:
|
||||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
||||||
|
|
||||||
|
@ -1357,6 +1396,9 @@ packages:
|
||||||
resolution: {integrity: sha512-BpAT/3lU9DMJ2siYVD/dSR0A/zQgD6Fb+fxkJd4j+wDVy6TYbYpK+FZqu8eM9EuNKGvi4BJR7XTZ/+zF02Dq8w==}
|
resolution: {integrity: sha512-BpAT/3lU9DMJ2siYVD/dSR0A/zQgD6Fb+fxkJd4j+wDVy6TYbYpK+FZqu8eM9EuNKGvi4BJR7XTZ/+zF02Dq8w==}
|
||||||
engines: {node: '>=16'}
|
engines: {node: '>=16'}
|
||||||
|
|
||||||
|
rehype-minify-whitespace@6.0.0:
|
||||||
|
resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==}
|
||||||
|
|
||||||
rehype-parse@9.0.0:
|
rehype-parse@9.0.0:
|
||||||
resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==}
|
resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==}
|
||||||
|
|
||||||
|
@ -1465,6 +1507,9 @@ packages:
|
||||||
trim-lines@3.0.1:
|
trim-lines@3.0.1:
|
||||||
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
|
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
|
||||||
|
|
||||||
|
trim-trailing-lines@2.1.0:
|
||||||
|
resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==}
|
||||||
|
|
||||||
trough@2.2.0:
|
trough@2.2.0:
|
||||||
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
|
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
|
||||||
|
|
||||||
|
@ -1479,6 +1524,9 @@ packages:
|
||||||
unist-util-filter@5.0.1:
|
unist-util-filter@5.0.1:
|
||||||
resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==}
|
resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==}
|
||||||
|
|
||||||
|
unist-util-find-after@5.0.0:
|
||||||
|
resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
|
||||||
|
|
||||||
unist-util-is@6.0.0:
|
unist-util-is@6.0.0:
|
||||||
resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
|
resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
|
||||||
|
|
||||||
|
@ -2388,6 +2436,11 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
function-bind: 1.1.2
|
function-bind: 1.1.2
|
||||||
|
|
||||||
|
hast-util-embedded@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
'@types/hast': 3.0.4
|
||||||
|
hast-util-is-element: 3.0.0
|
||||||
|
|
||||||
hast-util-from-html@2.0.1:
|
hast-util-from-html@2.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
@ -2416,6 +2469,10 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
|
||||||
|
hast-util-is-body-ok-link@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
'@types/hast': 3.0.4
|
||||||
|
|
||||||
hast-util-is-element@3.0.0:
|
hast-util-is-element@3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
@ -2428,6 +2485,14 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
|
||||||
|
hast-util-phrasing@3.0.1:
|
||||||
|
dependencies:
|
||||||
|
'@types/hast': 3.0.4
|
||||||
|
hast-util-embedded: 3.0.0
|
||||||
|
hast-util-has-property: 3.0.0
|
||||||
|
hast-util-is-body-ok-link: 3.0.0
|
||||||
|
hast-util-is-element: 3.0.0
|
||||||
|
|
||||||
hast-util-raw@9.0.3:
|
hast-util-raw@9.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
@ -2498,6 +2563,23 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
hast-util-to-mdast@10.1.0:
|
||||||
|
dependencies:
|
||||||
|
'@types/hast': 3.0.4
|
||||||
|
'@types/mdast': 4.0.4
|
||||||
|
'@ungap/structured-clone': 1.2.0
|
||||||
|
hast-util-phrasing: 3.0.1
|
||||||
|
hast-util-to-html: 9.0.1
|
||||||
|
hast-util-to-text: 4.0.2
|
||||||
|
hast-util-whitespace: 3.0.0
|
||||||
|
mdast-util-phrasing: 4.1.0
|
||||||
|
mdast-util-to-hast: 13.1.0
|
||||||
|
mdast-util-to-string: 4.0.0
|
||||||
|
rehype-minify-whitespace: 6.0.0
|
||||||
|
trim-trailing-lines: 2.1.0
|
||||||
|
unist-util-position: 5.0.0
|
||||||
|
unist-util-visit: 5.0.0
|
||||||
|
|
||||||
hast-util-to-parse5@8.0.0:
|
hast-util-to-parse5@8.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
@ -2512,6 +2594,13 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
|
||||||
|
hast-util-to-text@4.0.2:
|
||||||
|
dependencies:
|
||||||
|
'@types/hast': 3.0.4
|
||||||
|
'@types/unist': 3.0.2
|
||||||
|
hast-util-is-element: 3.0.0
|
||||||
|
unist-util-find-after: 5.0.0
|
||||||
|
|
||||||
hast-util-whitespace@3.0.0:
|
hast-util-whitespace@3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
@ -2584,6 +2673,11 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
relative-time-format: 1.1.6
|
relative-time-format: 1.1.6
|
||||||
|
|
||||||
|
jotai@2.8.1(@types/react@18.3.3)(react@18.3.1):
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.3
|
||||||
|
react: 18.3.1
|
||||||
|
|
||||||
js-tokens@4.0.0: {}
|
js-tokens@4.0.0: {}
|
||||||
|
|
||||||
jsesc@2.5.2: {}
|
jsesc@2.5.2: {}
|
||||||
|
@ -3108,6 +3202,14 @@ snapshots:
|
||||||
unified: 11.0.4
|
unified: 11.0.4
|
||||||
unist-util-visit: 5.0.0
|
unist-util-visit: 5.0.0
|
||||||
|
|
||||||
|
rehype-minify-whitespace@6.0.0:
|
||||||
|
dependencies:
|
||||||
|
'@types/hast': 3.0.4
|
||||||
|
hast-util-embedded: 3.0.0
|
||||||
|
hast-util-is-element: 3.0.0
|
||||||
|
hast-util-whitespace: 3.0.0
|
||||||
|
unist-util-is: 6.0.0
|
||||||
|
|
||||||
rehype-parse@9.0.0:
|
rehype-parse@9.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
@ -3271,6 +3373,8 @@ snapshots:
|
||||||
|
|
||||||
trim-lines@3.0.1: {}
|
trim-lines@3.0.1: {}
|
||||||
|
|
||||||
|
trim-trailing-lines@2.1.0: {}
|
||||||
|
|
||||||
trough@2.2.0: {}
|
trough@2.2.0: {}
|
||||||
|
|
||||||
typescript@5.4.5: {}
|
typescript@5.4.5: {}
|
||||||
|
@ -3291,6 +3395,11 @@ snapshots:
|
||||||
unist-util-is: 6.0.0
|
unist-util-is: 6.0.0
|
||||||
unist-util-visit-parents: 6.0.1
|
unist-util-visit-parents: 6.0.1
|
||||||
|
|
||||||
|
unist-util-find-after@5.0.0:
|
||||||
|
dependencies:
|
||||||
|
'@types/unist': 3.0.2
|
||||||
|
unist-util-is: 6.0.0
|
||||||
|
|
||||||
unist-util-is@6.0.0:
|
unist-util-is@6.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/unist': 3.0.2
|
'@types/unist': 3.0.2
|
||||||
|
|
Loading…
Reference in a new issue