@@ -139,22 +171,23 @@
option.isLabel && 'text-xs mt-2',
]}
>
- {#if option.value == value}
+ {#if option.icon}
- {:else if option.icon}
+ {/if}
+ {option.label}
+ {#if option.value == value}
{/if}
- {option.label}
{/if}
{/each}
diff --git a/src/lib/ui/kit/forms/select/context.ts b/src/lib/ui/kit/forms/select/context.ts
index fbdc26d9..7a1ce237 100644
--- a/src/lib/ui/kit/forms/select/context.ts
+++ b/src/lib/ui/kit/forms/select/context.ts
@@ -1,5 +1,4 @@
-import type { IconSource } from '@xylightdev/svelte-hero-icons'
-
+import type { IconSource } from '$lib/ui/kit/icon'
export interface SelectOption {
value: string
label: string
diff --git a/src/lib/ui/kit/icon/Icon.svelte b/src/lib/ui/kit/icon/Icon.svelte
new file mode 100644
index 00000000..0d49a5e7
--- /dev/null
+++ b/src/lib/ui/kit/icon/Icon.svelte
@@ -0,0 +1,15 @@
+
+
+
diff --git a/src/lib/ui/kit/icon/index.ts b/src/lib/ui/kit/icon/index.ts
new file mode 100644
index 00000000..d37f334d
--- /dev/null
+++ b/src/lib/ui/kit/icon/index.ts
@@ -0,0 +1,118 @@
+/**
+ * The Kelp icon vocabulary: every icon the app uses, re-exported from
+ * Lucide's per-icon paths so Vite only ever transforms the icons we ship.
+ *
+ * Names match Lucide's own (https://lucide.dev) — the set the mobile app is
+ * standardising on — so a glyph name means the same thing across Coves
+ * clients. Add icons here as they're needed.
+ */
+export { default as Icon } from './Icon.svelte'
+export type { LucideIcon as IconSource } from '@lucide/svelte'
+
+export { default as Archive } from '@lucide/svelte/icons/archive'
+export { default as ArrowDownWideNarrow } from '@lucide/svelte/icons/arrow-down-wide-narrow'
+export { default as ArrowLeft } from '@lucide/svelte/icons/arrow-left'
+export { default as ArrowRight } from '@lucide/svelte/icons/arrow-right'
+export { default as ArrowRightLeft } from '@lucide/svelte/icons/arrow-right-left'
+export { default as ArrowUpDown } from '@lucide/svelte/icons/arrow-up-down'
+export { default as Ban } from '@lucide/svelte/icons/ban'
+export { default as Bold } from '@lucide/svelte/icons/bold'
+export { default as Bookmark } from '@lucide/svelte/icons/bookmark'
+export { default as BookmarkX } from '@lucide/svelte/icons/bookmark-x'
+export { default as Bug } from '@lucide/svelte/icons/bug'
+export { default as Building } from '@lucide/svelte/icons/building'
+export { default as Calendar } from '@lucide/svelte/icons/calendar'
+export { default as ChartColumn } from '@lucide/svelte/icons/chart-column'
+export { default as Check } from '@lucide/svelte/icons/check'
+export { default as ChevronDown } from '@lucide/svelte/icons/chevron-down'
+export { default as ChevronLeft } from '@lucide/svelte/icons/chevron-left'
+export { default as ChevronRight } from '@lucide/svelte/icons/chevron-right'
+export { default as ChevronUp } from '@lucide/svelte/icons/chevron-up'
+export { default as ChevronsDown } from '@lucide/svelte/icons/chevrons-down'
+export { default as ChevronsUp } from '@lucide/svelte/icons/chevrons-up'
+export { default as ChevronsUpDown } from '@lucide/svelte/icons/chevrons-up-down'
+export { default as CircleAlert } from '@lucide/svelte/icons/circle-alert'
+export { default as CircleArrowDown } from '@lucide/svelte/icons/circle-arrow-down'
+export { default as CircleArrowRight } from '@lucide/svelte/icons/circle-arrow-right'
+export { default as CircleCheck } from '@lucide/svelte/icons/circle-check'
+export { default as CircleHelp } from '@lucide/svelte/icons/circle-help'
+export { default as CirclePlus } from '@lucide/svelte/icons/circle-plus'
+export { default as CircleUser } from '@lucide/svelte/icons/circle-user'
+export { default as CircleX } from '@lucide/svelte/icons/circle-x'
+export { default as Clock } from '@lucide/svelte/icons/clock'
+export { default as CloudDrizzle } from '@lucide/svelte/icons/cloud-drizzle'
+export { default as Code } from '@lucide/svelte/icons/code'
+export { default as Columns3 } from '@lucide/svelte/icons/columns-3'
+export { default as Compass } from '@lucide/svelte/icons/compass'
+export { default as Copy } from '@lucide/svelte/icons/copy'
+export { default as CornerDownRight } from '@lucide/svelte/icons/corner-down-right'
+export { default as Dock } from '@lucide/svelte/icons/dock'
+export { default as Download } from '@lucide/svelte/icons/download'
+export { default as Earth } from '@lucide/svelte/icons/earth'
+export { default as Ellipsis } from '@lucide/svelte/icons/ellipsis'
+export { default as Equal } from '@lucide/svelte/icons/equal'
+export { default as ExternalLink } from '@lucide/svelte/icons/external-link'
+export { default as FilePlus } from '@lucide/svelte/icons/file-plus'
+export { default as FileText } from '@lucide/svelte/icons/file-text'
+export { default as Flag } from '@lucide/svelte/icons/flag'
+export { default as Flame } from '@lucide/svelte/icons/flame'
+export { default as Forward } from '@lucide/svelte/icons/forward'
+export { default as Globe } from '@lucide/svelte/icons/globe'
+export { default as Heading1 } from '@lucide/svelte/icons/heading-1'
+export { default as House } from '@lucide/svelte/icons/house'
+export { default as IdCard } from '@lucide/svelte/icons/id-card'
+export { default as Image } from '@lucide/svelte/icons/image'
+export { default as Info } from '@lucide/svelte/icons/info'
+export { default as Italic } from '@lucide/svelte/icons/italic'
+export { default as Languages } from '@lucide/svelte/icons/languages'
+export { default as LayoutList } from '@lucide/svelte/icons/layout-list'
+export { default as Link } from '@lucide/svelte/icons/link'
+export { default as List } from '@lucide/svelte/icons/list'
+export { default as Lock } from '@lucide/svelte/icons/lock'
+export { default as LogIn } from '@lucide/svelte/icons/log-in'
+export { default as Mail } from '@lucide/svelte/icons/mail'
+export { default as MapPin } from '@lucide/svelte/icons/map-pin'
+export { default as Maximize2 } from '@lucide/svelte/icons/maximize-2'
+export { default as Megaphone } from '@lucide/svelte/icons/megaphone'
+export { default as Menu } from '@lucide/svelte/icons/menu'
+export { default as MessageSquare } from '@lucide/svelte/icons/message-square'
+export { default as MessageSquareMore } from '@lucide/svelte/icons/message-square-more'
+export { default as MessageSquareText } from '@lucide/svelte/icons/message-square-text'
+export { default as Mic } from '@lucide/svelte/icons/mic'
+export { default as Minus } from '@lucide/svelte/icons/minus'
+export { default as Monitor } from '@lucide/svelte/icons/monitor'
+export { default as Moon } from '@lucide/svelte/icons/moon'
+export { default as MousePointerClick } from '@lucide/svelte/icons/mouse-pointer-click'
+export { default as Newspaper } from '@lucide/svelte/icons/newspaper'
+export { default as Paintbrush } from '@lucide/svelte/icons/paintbrush'
+export { default as Pencil } from '@lucide/svelte/icons/pencil'
+export { default as Play } from '@lucide/svelte/icons/play'
+export { default as Plus } from '@lucide/svelte/icons/plus'
+export { default as Puzzle } from '@lucide/svelte/icons/puzzle'
+export { default as QrCode } from '@lucide/svelte/icons/qr-code'
+export { default as RefreshCw } from '@lucide/svelte/icons/refresh-cw'
+export { default as Rows4 } from '@lucide/svelte/icons/rows-4'
+export { default as Search } from '@lucide/svelte/icons/search'
+export { default as Send } from '@lucide/svelte/icons/send'
+export { default as Server } from '@lucide/svelte/icons/server'
+export { default as Settings } from '@lucide/svelte/icons/settings'
+export { default as SlidersHorizontal } from '@lucide/svelte/icons/sliders-horizontal'
+export { default as Smartphone } from '@lucide/svelte/icons/smartphone'
+export { default as Sparkles } from '@lucide/svelte/icons/sparkles'
+export { default as SquarePen } from '@lucide/svelte/icons/square-pen'
+export { default as Star } from '@lucide/svelte/icons/star'
+export { default as Strikethrough } from '@lucide/svelte/icons/strikethrough'
+export { default as Sun } from '@lucide/svelte/icons/sun'
+export { default as SwatchBook } from '@lucide/svelte/icons/swatch-book'
+export { default as Table } from '@lucide/svelte/icons/table'
+export { default as Tablet } from '@lucide/svelte/icons/tablet'
+export { default as Tag } from '@lucide/svelte/icons/tag'
+export { default as Terminal } from '@lucide/svelte/icons/terminal'
+export { default as Trash2 } from '@lucide/svelte/icons/trash-2'
+export { default as TriangleAlert } from '@lucide/svelte/icons/triangle-alert'
+export { default as Trophy } from '@lucide/svelte/icons/trophy'
+export { default as Undo2 } from '@lucide/svelte/icons/undo-2'
+export { default as Upload } from '@lucide/svelte/icons/upload'
+export { default as Users } from '@lucide/svelte/icons/users'
+export { default as Video } from '@lucide/svelte/icons/video'
+export { default as X } from '@lucide/svelte/icons/x'
diff --git a/src/lib/ui/kit/materials/Material.svelte b/src/lib/ui/kit/materials/Material.svelte
index ee86f2a5..483aa467 100644
--- a/src/lib/ui/kit/materials/Material.svelte
+++ b/src/lib/ui/kit/materials/Material.svelte
@@ -1,5 +1,5 @@
@@ -12,7 +12,7 @@
class="w-max hover:underline text-slate-600 dark:text-zinc-400"
onclick={() => history?.back()}
>
-
+
{$t('account.accounts')}
diff --git a/src/routes/c/[handle=handle]/post/[rkey]/+page.svelte b/src/routes/c/[handle=handle]/post/[rkey]/+page.svelte
index c8f2b619..6fd2e3d0 100644
--- a/src/routes/c/[handle=handle]/post/[rkey]/+page.svelte
+++ b/src/routes/c/[handle=handle]/post/[rkey]/+page.svelte
@@ -11,11 +11,7 @@
import { postTextFallback } from '$lib/feature/post/helpers'
import Placeholder from '$lib/ui/info/Placeholder.svelte'
import { Material, Spinner, toast } from '$lib/ui/kit'
- import {
- ChatBubbleOvalLeft,
- Icon,
- NoSymbol,
- } from '@xylightdev/svelte-hero-icons'
+ import { Icon, Ban, MessageSquare } from '$lib/ui/kit/icon'
import { tick } from 'svelte'
import type { PageData } from './$types'
@@ -185,7 +181,7 @@
-
+
Comments
{#if post.stats?.commentCount}
@@ -226,7 +222,7 @@
{:else if data.data.value?.unavailable}
{$t('comment.permalink.allComments')}
@@ -93,7 +93,7 @@
href={commentLink(post, focused.parentUri)}
rounding="pill"
color="secondary"
- icon={ArrowUturnUp}
+ icon={Undo2}
>
{$t('comment.permalink.context')}
diff --git a/src/routes/c/[handle=handle]/settings/team/+page.svelte b/src/routes/c/[handle=handle]/settings/team/+page.svelte
index 69219f29..7126c187 100644
--- a/src/routes/c/[handle=handle]/settings/team/+page.svelte
+++ b/src/routes/c/[handle=handle]/settings/team/+page.svelte
@@ -8,7 +8,7 @@
import Avatar from '$lib/ui/generic/Avatar.svelte'
import { CommonList, Header } from '$lib/ui/layout'
import { action, Button, modal, toast } from '$lib/ui/kit'
- import { Icon, Plus, Trash } from '@xylightdev/svelte-hero-icons'
+ import { Icon, Plus, Trash2 } from '$lib/ui/kit/icon'
import type { PageData } from '../$types'
interface Props {
@@ -122,7 +122,7 @@
})
}}
>
-
+
{/snippet}
diff --git a/src/routes/explore/+layout.svelte b/src/routes/explore/+layout.svelte
index b824c9e9..2cacdaa2 100644
--- a/src/routes/explore/+layout.svelte
+++ b/src/routes/explore/+layout.svelte
@@ -6,14 +6,13 @@
import { Option, Select } from '$lib/ui/kit'
import { untrack } from 'svelte'
import {
- ChartBar,
- Fire,
Icon,
- Language,
+ ChartColumn,
+ Flame,
+ Languages,
Star,
- UserGroup,
- } from '@xylightdev/svelte-hero-icons'
-
+ Users,
+ } from '$lib/ui/kit/icon'
let { data, children } = $props()
// Navigating within /explore re-runs load() but reuses this layout, so a
@@ -74,16 +73,16 @@
>
{#snippet customLabel()}
-
+
{$t('filter.sort.label')}
{/snippet}
-
-
+
+
-
+
diff --git a/src/routes/explore/communities/+page.svelte b/src/routes/explore/communities/+page.svelte
index 97dc1e38..58e6587c 100644
--- a/src/routes/explore/communities/+page.svelte
+++ b/src/routes/explore/communities/+page.svelte
@@ -8,7 +8,7 @@
import { CommonList } from '$lib/ui/layout'
import EndPlaceholder from '$lib/ui/layout/EndPlaceholder.svelte'
import { Material } from '$lib/ui/kit'
- import { QuestionMarkCircle } from '@xylightdev/svelte-hero-icons'
+ import { CircleHelp } from '$lib/ui/kit/icon'
import { expoOut } from 'svelte/easing'
import { fly } from 'svelte/transition'
@@ -40,7 +40,7 @@
{#if data.communities.length == 0}
diff --git a/src/routes/profile/(local_user)/blocks/communities/+page.svelte b/src/routes/profile/(local_user)/blocks/communities/+page.svelte
index f97b1d03..2d618065 100644
--- a/src/routes/profile/(local_user)/blocks/communities/+page.svelte
+++ b/src/routes/profile/(local_user)/blocks/communities/+page.svelte
@@ -6,8 +6,7 @@
import ItemList from '$lib/ui/generic/ItemList.svelte'
import Placeholder from '$lib/ui/info/Placeholder.svelte'
import { Button } from '$lib/ui/kit'
- import { ArrowUturnUp, Check, Trash } from '@xylightdev/svelte-hero-icons'
-
+ import { Check, Trash2, Undo2 } from '$lib/ui/kit/icon'
let { data } = $props()
async function unblock(id: number) {
@@ -41,13 +40,13 @@
size="square-md"
href={block.url}
color="primary"
- icon={ArrowUturnUp}
+ icon={Undo2}
/>
unblock(block.id)}
- icon={Trash}
+ icon={Trash2}
/>
{/snippet}
diff --git a/src/routes/profile/(local_user)/blocks/instances/+page.svelte b/src/routes/profile/(local_user)/blocks/instances/+page.svelte
index 9a812638..84bd7cf7 100644
--- a/src/routes/profile/(local_user)/blocks/instances/+page.svelte
+++ b/src/routes/profile/(local_user)/blocks/instances/+page.svelte
@@ -7,8 +7,7 @@
import ItemList from '$lib/ui/generic/ItemList.svelte'
import Placeholder from '$lib/ui/info/Placeholder.svelte'
import { Button } from '$lib/ui/kit'
- import { Check, Trash } from '@xylightdev/svelte-hero-icons'
-
+ import { Check, Trash2 } from '$lib/ui/kit/icon'
let { data } = $props()
// TODO(coves-migration): Needs Coves instance block API — my_user is undefined during migration
@@ -50,7 +49,7 @@
title="Unblock"
size="square-md"
onclick={() => unblock(Number(block.id))}
- icon={Trash}
+ icon={Trash2}
/>
{/snippet}
diff --git a/src/routes/profile/(local_user)/blocks/users/+page.svelte b/src/routes/profile/(local_user)/blocks/users/+page.svelte
index 14c8eabd..b6210c68 100644
--- a/src/routes/profile/(local_user)/blocks/users/+page.svelte
+++ b/src/routes/profile/(local_user)/blocks/users/+page.svelte
@@ -6,7 +6,7 @@
import ItemList from '$lib/ui/generic/ItemList.svelte'
import Placeholder from '$lib/ui/info/Placeholder.svelte'
import { Button, toast } from '$lib/ui/kit'
- import { ArrowUturnUp, Check, Trash } from '@xylightdev/svelte-hero-icons'
+ import { Check, Trash2, Undo2 } from '$lib/ui/kit/icon'
import type { PageData } from './$types'
interface Props {
@@ -45,13 +45,13 @@
size="square-md"
href={item.url}
color="primary"
- icon={ArrowUturnUp}
+ icon={Undo2}
/>
unblock(item.id as DID)}
- icon={Trash}
+ icon={Trash2}
/>
{/snippet}
diff --git a/src/routes/profile/(local_user)/settings/+page.svelte b/src/routes/profile/(local_user)/settings/+page.svelte
index ad623391..90fe4942 100644
--- a/src/routes/profile/(local_user)/settings/+page.svelte
+++ b/src/routes/profile/(local_user)/settings/+page.svelte
@@ -18,7 +18,7 @@
TextInput,
toast,
} from '$lib/ui/kit'
- import { Icon, Plus } from '@xylightdev/svelte-hero-icons'
+ import { Icon, Plus } from '$lib/ui/kit/icon'
import type { PageData } from './$types'
interface Props {
@@ -127,7 +127,7 @@
{#snippet target(attachment)}
-
+
{$t('common.add')}
diff --git a/src/routes/profile/[handle=actor]/+page.svelte b/src/routes/profile/[handle=actor]/+page.svelte
index 22cfdb8a..8d5c65d0 100644
--- a/src/routes/profile/[handle=actor]/+page.svelte
+++ b/src/routes/profile/[handle=actor]/+page.svelte
@@ -11,11 +11,11 @@
import { Option, Select } from '$lib/ui/kit'
import { formatRelativeDate } from '$lib/ui/util/RelativeDate.svelte'
import {
- AdjustmentsHorizontal,
- ChatBubbleOvalLeft,
Icon,
- PencilSquare,
- } from '@xylightdev/svelte-hero-icons'
+ MessageSquare,
+ SlidersHorizontal,
+ SquarePen,
+ } from '$lib/ui/kit/icon'
import { type PageData } from './$types'
import UserActions from './UserActions.svelte'
@@ -100,7 +100,7 @@
>
{#snippet customLabel()}
-
+
{$t('filter.type')}
{/snippet}
@@ -123,7 +123,7 @@
{:else if filterType === 'posts'}
@@ -140,7 +140,7 @@