diff --git a/src/app.css b/src/app.css index a8a78b6..082d4fe 100644 --- a/src/app.css +++ b/src/app.css @@ -693,6 +693,7 @@ input[type="tel"], input[type="url"], textarea { + @apply bg-primary-50 dark:bg-primary-1000 text-gray-900 dark:text-gray-100 border-s-4 border-primary-200 rounded shadow-none; @apply focus:border-primary-600 dark:focus:border-primary-400; } diff --git a/src/lib/a/README.md b/src/lib/a/README.md new file mode 100644 index 0000000..641f7b6 --- /dev/null +++ b/src/lib/a/README.md @@ -0,0 +1,11 @@ +# Component Library + +This folder contains a component library. +The idea is to have project-scoped reusable components that centralize theming and style rules, +so that main pages and layouts focus on the functionalities. + +All components are based on Flowbite Svelte components, +which are built on top of Tailwind CSS. + +Keeping all the styles in one place allows us to easily change the look and feel of the application by switching themes. + diff --git a/src/lib/a/cards/AEventPreview.svelte b/src/lib/a/cards/AEventPreview.svelte new file mode 100644 index 0000000..621c8e3 --- /dev/null +++ b/src/lib/a/cards/AEventPreview.svelte @@ -0,0 +1,191 @@ + + + +
+
+ {#if label} + {label} + {/if} + {#if showKind} + Kind: {event.kind} + {/if} + {#if community} +
+ + + +
+ {:else} +
+ {/if} + + {@render userBadge( + toNpub(event.pubkey) as string, + profileData?.display_name || profileData?.name + )} + + + {event.created_at + ? new Date(event.created_at * 1000).toLocaleDateString() + : "Unknown date"} + +
+ + {#if event.kind === 0 && profileData} +
+ {#if profileData.picture} + Profile { + (e.target as HTMLImageElement).style.display = "none"; + }} + /> + {:else} +
+ + {(profileData.display_name || profileData.name || event.pubkey.slice(0, 1)).toUpperCase()} + +
+ {/if} +
+ {#if profileData.display_name || profileData.name} + + {profileData.display_name || profileData.name} + + {/if} + {#if profileData.about} + + {profileData.about} + + {/if} +
+
+ {:else} + {#if summary} +
+ {summary} +
+ {/if} + {#if deferralNaddr} +
+ Read + { + e.stopPropagation(); + // Parent should intercept navigation by listening onSelect and inspecting event tags if needed + }} + > + {deferralNaddr} + +
+ {/if} + {#if showPublicationLink} +
+ +
+ {/if} + {#if event.content} +
+ {clippedContent(event.content)} +
+ {/if} + {/if} +
+
diff --git a/src/lib/a/forms/ASearchForm.svelte b/src/lib/a/forms/ASearchForm.svelte new file mode 100644 index 0000000..3db6e00 --- /dev/null +++ b/src/lib/a/forms/ASearchForm.svelte @@ -0,0 +1,71 @@ + + +
+ + + + diff --git a/src/lib/a/index.ts b/src/lib/a/index.ts index 58c7047..28834b8 100644 --- a/src/lib/a/index.ts +++ b/src/lib/a/index.ts @@ -7,6 +7,7 @@ export { default as ANostrUser } from './primitives/ANostrUser.svelte'; export { default as ANostrBadge } from './primitives/ANostrBadge.svelte'; export { default as ANostrBadgeRow } from './primitives/ANostrBadgeRow.svelte'; export { default as AThemeToggleMini } from './primitives/AThemeToggleMini.svelte'; +export { default as AAlert } from './primitives/AAlert.svelte'; export { default as AReaderPage } from './reader/AReaderPage.svelte'; export { default as AReaderToolbar } from './reader/AReaderToolbar.svelte'; @@ -17,3 +18,7 @@ export { default as ATocNode } from './reader/ATocNode.svelte'; export { default as ANavbar } from './nav/ANavbar.svelte'; export { default as AFooter } from './nav/AFooter.svelte'; + +export { default as ASearchForm } from './forms/ASearchForm.svelte'; + +export { default as AEventPreview } from './cards/AEventPreview.svelte'; \ No newline at end of file diff --git a/src/lib/a/nav/ANavDropdown.svelte b/src/lib/a/nav/ANavDropdown.svelte deleted file mode 100644 index e69de29..0000000 diff --git a/src/lib/a/nav/ANavbar.svelte b/src/lib/a/nav/ANavbar.svelte index 937663b..8f804e7 100644 --- a/src/lib/a/nav/ANavbar.svelte +++ b/src/lib/a/nav/ANavbar.svelte @@ -7,16 +7,15 @@ NavHamburger, NavBrand, Dropdown, - DropdownItem, - DropdownDivider + DropdownItem } from "flowbite-svelte"; - import { siteNav, userMenu } from "$lib/nav/site-nav.js"; + import { siteNav } from "$lib/nav/site-nav.js"; import { logoutUser, userStore } from "$lib/stores/userStore"; import Profile from "$components/util/Profile.svelte"; - import { shortenBech32 } from "$lib/nostr/format.ts"; import type { NavItem } from "$lib/a/nav/nav-types.ts"; import { goto } from "$app/navigation"; import { ChevronDownOutline } from "flowbite-svelte-icons"; + import { AThemeToggleMini } from "$lib/a"; let { currentPath = "", @@ -47,7 +46,7 @@ } - +

Alexandria

@@ -78,5 +77,6 @@ +
diff --git a/src/lib/a/primitives/AAlert.svelte b/src/lib/a/primitives/AAlert.svelte new file mode 100644 index 0000000..9fe0261 --- /dev/null +++ b/src/lib/a/primitives/AAlert.svelte @@ -0,0 +1,9 @@ + + + + {@render children()} + \ No newline at end of file diff --git a/src/lib/a/primitives/AThemeToggleMini.svelte b/src/lib/a/primitives/AThemeToggleMini.svelte index 672280b..0d7c172 100644 --- a/src/lib/a/primitives/AThemeToggleMini.svelte +++ b/src/lib/a/primitives/AThemeToggleMini.svelte @@ -1,10 +1,25 @@ - - + + Theme {theme} + + + +
  • + Papyrus +
  • +
  • + Ocean +
  • +
  • + Forrest +
  • +
    +
    diff --git a/src/theme-tokens.css b/src/theme-tokens.css index 74916e1..ce16508 100644 --- a/src/theme-tokens.css +++ b/src/theme-tokens.css @@ -38,3 +38,27 @@ --brand-primary-400: #7ccdfc; --brand-primary-500: #38bdf8; } + +/* Example alternative theme: forrest */ +:root[data-theme="forrest"] { + --brand-primary-0: #eaf7ea; + --brand-primary-50: #d6eed6; + --brand-primary-100: #bfe3bf; + --brand-primary-200: #9fd49f; + --brand-primary-300: #7fc57f; + --brand-primary-400: #5fa65f; + --brand-primary-500: #3f863f; /* forest green */ + --brand-primary-600: #2e6b2e; + --brand-primary-700: #205120; + --brand-primary-800: #153a15; + --brand-primary-900: #0c230c; + --brand-primary-950: #071507; + --brand-primary-1000: #041004; +} + +/* (Optional) per-theme dark tweaks — applied when is set */ +:root.dark[data-theme="forrest"] { + /* nudge the mid tones brighter for contrast */ + --brand-primary-400: #7fc97f; + --brand-primary-500: #4caf50; +}