mirror of
https://github.com/dergigi/boris.git
synced 2025-12-19 07:34:28 +01:00
feat: initialize markr nostr bookmark client
- Add project structure with TypeScript, React, and Vite - Implement nostr authentication using browser extension (NIP-07) - Add NIP-51 compliant bookmark fetching and display - Create minimal UI with login and bookmark components - Integrate applesauce-core and applesauce-react libraries - Add responsive styling with dark/light mode support - Include comprehensive README with setup instructions This is a minimal MVP for a nostr bookmark client that allows users to view their bookmarks according to NIP-51 specification.
This commit is contained in:
3
node_modules/applesauce-react/dist/helpers/build-link-renderer.d.ts
generated
vendored
Normal file
3
node_modules/applesauce-react/dist/helpers/build-link-renderer.d.ts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import { Link } from "applesauce-content/nast";
|
||||
export type LinkRenderer = (url: URL, node: Link) => JSX.Element | false | null;
|
||||
export declare function buildLinkRenderer(handlers: LinkRenderer[]): import("react").NamedExoticComponent<import("./nast.js").ExtraProps<Link>>;
|
||||
23
node_modules/applesauce-react/dist/helpers/build-link-renderer.js
generated
vendored
Normal file
23
node_modules/applesauce-react/dist/helpers/build-link-renderer.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
||||
import { memo, useMemo } from "react";
|
||||
export function buildLinkRenderer(handlers) {
|
||||
const LinkRenderer = ({ node }) => {
|
||||
const content = useMemo(() => {
|
||||
try {
|
||||
const url = new URL(node.href);
|
||||
for (const handler of handlers) {
|
||||
try {
|
||||
const content = handler(url, node);
|
||||
if (content)
|
||||
return content;
|
||||
}
|
||||
catch (e) { }
|
||||
}
|
||||
}
|
||||
catch (error) { }
|
||||
return null;
|
||||
}, [node.href, node.value]);
|
||||
return content || _jsx(_Fragment, { children: node.value });
|
||||
};
|
||||
return memo(LinkRenderer);
|
||||
}
|
||||
2
node_modules/applesauce-react/dist/helpers/index.d.ts
generated
vendored
Normal file
2
node_modules/applesauce-react/dist/helpers/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from "./nast.js";
|
||||
export * from "./build-link-renderer.js";
|
||||
2
node_modules/applesauce-react/dist/helpers/index.js
generated
vendored
Normal file
2
node_modules/applesauce-react/dist/helpers/index.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from "./nast.js";
|
||||
export * from "./build-link-renderer.js";
|
||||
12
node_modules/applesauce-react/dist/helpers/nast.d.ts
generated
vendored
Normal file
12
node_modules/applesauce-react/dist/helpers/nast.d.ts
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
import React from "react";
|
||||
import { Content, ContentMap, Root } from "applesauce-content/nast";
|
||||
type Component<ComponentProps> = React.FunctionComponent<ComponentProps> | React.ComponentClass;
|
||||
export type ExtraProps<T extends Content> = {
|
||||
node: T;
|
||||
};
|
||||
export type ComponentMap = Partial<{
|
||||
[k in keyof ContentMap]: Component<ExtraProps<ContentMap[k]>>;
|
||||
}>;
|
||||
/** Render a nostr syntax tree to JSX components */
|
||||
export declare function renderNast(root: Root, components: ComponentMap): import("react/jsx-runtime").JSX.Element;
|
||||
export {};
|
||||
15
node_modules/applesauce-react/dist/helpers/nast.js
generated
vendored
Normal file
15
node_modules/applesauce-react/dist/helpers/nast.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
||||
/** Render a nostr syntax tree to JSX components */
|
||||
export function renderNast(root, components) {
|
||||
const indexes = {};
|
||||
return (_jsx(_Fragment, { children: root.children.map((node) => {
|
||||
indexes[node.type] = indexes[node.type] ?? 0;
|
||||
const index = indexes[node.type];
|
||||
indexes[node.type]++;
|
||||
const Component = components[node.type];
|
||||
if (!Component)
|
||||
return null;
|
||||
// @ts-expect-error
|
||||
return _jsx(Component, { node: node }, node.type + "-" + index);
|
||||
}) }));
|
||||
}
|
||||
Reference in New Issue
Block a user