diff --git a/apps/desktop/public/heading.png b/apps/desktop/public/heading.png
index 50335ce1..fb740945 100644
Binary files a/apps/desktop/public/heading.png and b/apps/desktop/public/heading.png differ
diff --git a/apps/desktop/public/heading@2x.png b/apps/desktop/public/heading@2x.png
index 72aa9d52..802c679b 100644
Binary files a/apps/desktop/public/heading@2x.png and b/apps/desktop/public/heading@2x.png differ
diff --git a/apps/desktop/src/routes/auth/create.tsx b/apps/desktop/src/routes/auth/create.tsx
index 69623dcb..eee72673 100644
--- a/apps/desktop/src/routes/auth/create.tsx
+++ b/apps/desktop/src/routes/auth/create.tsx
@@ -197,10 +197,6 @@ export function CreateAccountScreen() {
- Get started with familiar way, but all data belong to you and you
- have ability controls everything.
-
{!services ? (
@@ -220,59 +216,75 @@ export function CreateAccountScreen() {
>
Username *
-
-
-
-
- @{getDomainName(serviceId)}
-
-
-
-
-
-
-
-
-
- Public handles
-
- {services.map((service) => (
-
- ))}
-
-
-
-
-
+
+
+
+
+
+
+ @{getDomainName(serviceId)}
+
+
+
+
+
+
+
+
+
+
+ Choose a Provider
+
+ {services.map((service) => (
+
+ ))}
+
+
+
+
+
+
+
+ Use to login to Lume and other Nostr apps. You can choose
+ provider you trust to manage your account
+
-
-
- Backup Email (Optional)
-
-
+
+
+
+ Backup Email (optional)
+
+
+
+
+ Use for recover your account if you lose your password
+
@@ -297,12 +309,12 @@ export function CreateAccountScreen() {
- Or
+ Or manage your own keys
diff --git a/apps/desktop/src/routes/auth/welcome.tsx b/apps/desktop/src/routes/auth/welcome.tsx
index 6b4095cb..a9986055 100644
--- a/apps/desktop/src/routes/auth/welcome.tsx
+++ b/apps/desktop/src/routes/auth/welcome.tsx
@@ -23,9 +23,9 @@ export function WelcomeScreen() {
className="w-2/3"
/>
- Lume is your safe Nostr client to meet, explore and
+ Lume is a magnificent client for Nostr to meet, explore
- freely sharing your though to everyone in nostrverse
+ and freely share your thoughts with everyone.
diff --git a/apps/desktop/src/routes/relays/components/relayForm.tsx b/apps/desktop/src/routes/relays/components/relayForm.tsx
index 7e9d81be..27808861 100644
--- a/apps/desktop/src/routes/relays/components/relayForm.tsx
+++ b/apps/desktop/src/routes/relays/components/relayForm.tsx
@@ -1,17 +1,14 @@
import { useRelaylist } from "@lume/ark";
import { PlusIcon } from "@lume/icons";
-import { NDKRelayUrl } from "@nostr-dev-kit/ndk";
import { normalizeRelayUrl } from "nostr-fetch";
import { useState } from "react";
import { toast } from "sonner";
-const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/;
-
export function RelayForm() {
const { connectRelay } = useRelaylist();
const [relay, setRelay] = useState<{
- url: NDKRelayUrl;
+ url: WebSocket["url"];
purpose: "read" | "write" | undefined;
}>({ url: "", purpose: undefined });
@@ -19,10 +16,8 @@ export function RelayForm() {
if (relay.url.length < 1) return toast.info("Please enter relay url");
try {
const relayUrl = new URL(relay.url.replace(/\s/g, ""));
- if (
- domainRegex.test(relayUrl.host) &&
- (relayUrl.protocol === "wss:" || relayUrl.protocol === "ws:")
- ) {
+
+ if (relayUrl.protocol === "wss:" || relayUrl.protocol === "ws:") {
connectRelay.mutate(normalizeRelayUrl(relay.url));
setRelay({ url: "", purpose: undefined });
} else {
diff --git a/packages/ark/src/components/column/provider.tsx b/packages/ark/src/components/column/provider.tsx
index b727bdf5..115dd017 100644
--- a/packages/ark/src/components/column/provider.tsx
+++ b/packages/ark/src/components/column/provider.tsx
@@ -9,6 +9,7 @@ import {
useEffect,
useState,
} from "react";
+import { toast } from "sonner";
type ColumnContext = {
columns: IColumn[];
@@ -52,6 +53,11 @@ export function ColumnProvider({ children }: { children: ReactNode }) {
}, []);
const removeColumn = useCallback(async (id: number) => {
+ if (id === 9998 || id === 9999) {
+ toast.info("You cannot remove default column");
+ return;
+ }
+
await storage.removeColumn(id);
setColumns((prev) => prev.filter((t) => t.id !== id));
}, []);
diff --git a/packages/ark/src/components/note/child.tsx b/packages/ark/src/components/note/child.tsx
index 607be70a..af85440c 100644
--- a/packages/ark/src/components/note/child.tsx
+++ b/packages/ark/src/components/note/child.tsx
@@ -1,4 +1,5 @@
import { NOSTR_MENTIONS } from "@lume/utils";
+import { nanoid } from "nanoid";
import { nip19 } from "nostr-tools";
import { ReactNode, useMemo } from "react";
import { Link } from "react-router-dom";
@@ -33,13 +34,10 @@ export function NoteChild({
try {
if (hashtags.length) {
for (const hashtag of hashtags) {
- parsedContent = reactStringReplace(
- parsedContent,
- hashtag,
- (match, i) => {
- return
;
- },
- );
+ const regex = new RegExp(`(|^)${hashtag}\\b`, "g");
+ parsedContent = reactStringReplace(parsedContent, regex, () => {
+ return
;
+ });
}
}
diff --git a/packages/ark/src/components/note/content.tsx b/packages/ark/src/components/note/content.tsx
index 119a7e4f..1ef1ffde 100644
--- a/packages/ark/src/components/note/content.tsx
+++ b/packages/ark/src/components/note/content.tsx
@@ -126,15 +126,12 @@ export function NoteContent({
if (hashtags.length) {
for (const hashtag of hashtags) {
- parsedContent = reactStringReplace(
- parsedContent,
- hashtag,
- (match, i) => {
- if (storage.settings.hashtag)
- return
;
- return null;
- },
- );
+ const regex = new RegExp(`(|^)${hashtag}\\b`, "g");
+ parsedContent = reactStringReplace(parsedContent, regex, () => {
+ if (storage.settings.hashtag)
+ return
;
+ return null;
+ });
}
}
diff --git a/packages/ark/src/components/note/preview/image.tsx b/packages/ark/src/components/note/preview/image.tsx
index db432175..abb5d1ae 100644
--- a/packages/ark/src/components/note/preview/image.tsx
+++ b/packages/ark/src/components/note/preview/image.tsx
@@ -13,7 +13,7 @@ export function ImagePreview({ url }: { url: string }) {
const downloadDirPath = await downloadDir();
const filename = url.substring(url.lastIndexOf("/") + 1);
- await download(url, downloadDirPath + `/${filename}`);
+ await download(url, `${downloadDirPath}/${filename}`);
setDownloaded(true);
} catch (e) {
@@ -35,7 +35,7 @@ export function ImagePreview({ url }: { url: string }) {
return (
// biome-ignore lint/a11y/useKeyWithClickEvents:
-
+
+
@@ -42,7 +42,7 @@ export function LinkPreview({ url }: { url: string }) {
to={url}
target="_blank"
rel="noreferrer"
- className="flex flex-col w-full my-1 overflow-hidden rounded-lg bg-neutral-100 dark:bg-neutral-900 border border-black/5 dark:border-white/5"
+ className="flex flex-col w-full mt-1 mb-2.5 overflow-hidden rounded-xl bg-neutral-100 dark:bg-neutral-900 border border-black/5 dark:border-white/5"
>
{isImage(data.image) ? (
) : null}
-
-
+
+
{data.title ? (
{data.title}
@@ -66,7 +66,7 @@ export function LinkPreview({ url }: { url: string }) {
) : null}
-
diff --git a/packages/ark/src/components/note/preview/video.tsx b/packages/ark/src/components/note/preview/video.tsx
index f233c484..3fced92d 100644
--- a/packages/ark/src/components/note/preview/video.tsx
+++ b/packages/ark/src/components/note/preview/video.tsx
@@ -10,7 +10,7 @@ import {
export function VideoPreview({ url }: { url: string }) {
return (
-
+
);
diff --git a/packages/icons/src/composeFilled.tsx b/packages/icons/src/composeFilled.tsx
index e7289918..90a17840 100644
--- a/packages/icons/src/composeFilled.tsx
+++ b/packages/icons/src/composeFilled.tsx
@@ -14,11 +14,7 @@ export function ComposeFilledIcon(
>
-
);
diff --git a/packages/lume-column-default/src/index.tsx b/packages/lume-column-default/src/index.tsx
index b6281932..a55885ab 100644
--- a/packages/lume-column-default/src/index.tsx
+++ b/packages/lume-column-default/src/index.tsx
@@ -14,33 +14,6 @@ export function Default({ column }: { column: IColumn }) {
icon={ }
/>
-
-
-
-
-
-
-
Topic
-
- Explore all content based on your interest.
-
-
-
{
- addColumn({ kind: COL_TYPES.topic, title: "", content: "" });
- }}
- className="shrink-0 w-16 h-8 rounded-lg text-sm font-semibold bg-neutral-100 dark:bg-neutral-900 text-blue-500 hover:bg-neutral-200 dark:hover:bg-neutral-800 inline-flex items-center justify-center"
- >
- Add
-
-
-