[READ-ONLY] Mirror of https://github.com/flo-bit/ui-kit. 🦊 fox ui, svelte 5 and tailwind 4 flo-bit.dev/ui-kit/
svelte tailwindcss ui-components
0

Configure Feed

Select the types of activity you want to include in your feed.

add emoji picker, small fixes

Florian (May 3, 2025, 8:30 AM +0200) 741c2083 0970b27e

+410 -55
+14
pnpm-lock.yaml
··· 408 408 bits-ui: 409 409 specifier: ^1.4.3 410 410 version: 1.4.3(svelte@5.28.1) 411 + emoji-picker-element: 412 + specifier: ^1.26.3 413 + version: 1.26.3 411 414 hls.js: 412 415 specifier: ^1.6.2 413 416 version: 1.6.2 417 + is-emoji-supported: 418 + specifier: ^0.0.5 419 + version: 0.0.5 414 420 plyr: 415 421 specifier: ^3.7.8 416 422 version: 3.7.8 ··· 2255 2261 resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==, tarball: https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz} 2256 2262 dev: false 2257 2263 2264 + /emoji-picker-element@1.26.3: 2265 + resolution: {integrity: sha512-fOMG44d/3OqTe1pPqlu5H4ZtWg7gK4Le6Bt24JTKtDyce5+EO3Mo8WA95cKHbPSsSsg7ehM12M1x3Y6U6fgvTQ==, tarball: https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.26.3.tgz} 2266 + dev: false 2267 + 2258 2268 /encoding-sniffer@0.2.0: 2259 2269 resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==, tarball: https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz} 2260 2270 dependencies: ··· 2711 2721 2712 2722 /inline-style-parser@0.2.4: 2713 2723 resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==, tarball: https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz} 2724 + dev: false 2725 + 2726 + /is-emoji-supported@0.0.5: 2727 + resolution: {integrity: sha512-WOlXUhDDHxYqcSmFZis+xWhhqXiK2SU0iYiqmth5Ip0FHLZQAt9rKL5ahnilE8/86WH8tZ3bmNNNC+bTzamqlw==, tarball: https://registry.npmjs.org/is-emoji-supported/-/is-emoji-supported-0.0.5.tgz} 2714 2728 dev: false 2715 2729 2716 2730 /is-extglob@2.1.1:
+10
.changeset/sour-crabs-taste.md
··· 1 + --- 2 + '@fuxui/colors': patch 3 + '@fuxui/social': patch 4 + '@fuxui/visual': patch 5 + '@fuxui/base': patch 6 + '@fuxui/time': patch 7 + '@fuxui/3d': patch 8 + --- 9 + 10 + bump
+17 -4
packages/3d/package.json
··· 23 23 ], 24 24 "exports": { 25 25 ".": { 26 - "types": "./dist/types.d.ts", 27 - "svelte": "./dist/index.js" 26 + "types": "./src/lib/types.d.ts", 27 + "svelte": "./src/lib/index.ts" 28 28 } 29 29 }, 30 - "types": "./dist/types.d.ts", 31 - "svelte": "./dist/index.js", 30 + "types": "./src/lib/types.d.ts", 31 + "svelte": "./src/lib/index.ts", 32 + "publishOverrides": { 33 + "files": [ 34 + "dist" 35 + ], 36 + "svelte": "./dist/index.js", 37 + "exports": { 38 + ".": { 39 + "types": "./dist/types.d.ts", 40 + "svelte": "./dist/index.js" 41 + } 42 + }, 43 + "types": "./dist/types.d.ts" 44 + }, 32 45 "devDependencies": { 33 46 "@eslint/compat": "^1.2.5", 34 47 "@eslint/js": "^9.18.0",
+17 -4
packages/base/package.json
··· 23 23 ], 24 24 "exports": { 25 25 ".": { 26 - "types": "./dist/types.d.ts", 27 - "svelte": "./dist/index.js" 26 + "types": "./src/lib/types.d.ts", 27 + "svelte": "./src/lib/index.ts" 28 28 } 29 29 }, 30 - "types": "./dist/types.d.ts", 31 - "svelte": "./dist/index.js", 30 + "types": "./src/lib/types.d.ts", 31 + "svelte": "./src/lib/index.ts", 32 + "publishOverrides": { 33 + "files": [ 34 + "dist" 35 + ], 36 + "svelte": "./dist/index.js", 37 + "exports": { 38 + ".": { 39 + "types": "./dist/types.d.ts", 40 + "svelte": "./dist/index.js" 41 + } 42 + }, 43 + "types": "./dist/types.d.ts" 44 + }, 32 45 "devDependencies": { 33 46 "@eslint/compat": "^1.2.5", 34 47 "@eslint/js": "^9.18.0",
+17 -4
packages/colors/package.json
··· 24 24 ], 25 25 "exports": { 26 26 ".": { 27 - "types": "./dist/types.d.ts", 28 - "svelte": "./dist/index.js" 27 + "types": "./src/lib/types.d.ts", 28 + "svelte": "./src/lib/index.ts" 29 29 } 30 30 }, 31 - "types": "./dist/types.d.ts", 32 - "svelte": "./dist/index.js", 31 + "types": "./src/lib/types.d.ts", 32 + "svelte": "./src/lib/index.ts", 33 + "publishOverrides": { 34 + "files": [ 35 + "dist" 36 + ], 37 + "svelte": "./dist/index.js", 38 + "exports": { 39 + ".": { 40 + "types": "./dist/types.d.ts", 41 + "svelte": "./dist/index.js" 42 + } 43 + }, 44 + "types": "./dist/types.d.ts" 45 + }, 33 46 "devDependencies": { 34 47 "@eslint/compat": "^1.2.5", 35 48 "@eslint/js": "^9.18.0",
+19 -4
packages/social/package.json
··· 23 23 ], 24 24 "exports": { 25 25 ".": { 26 - "types": "./dist/types.d.ts", 27 - "svelte": "./dist/index.js" 26 + "types": "./src/lib/types.d.ts", 27 + "svelte": "./src/lib/index.ts" 28 28 } 29 29 }, 30 - "types": "./dist/types.d.ts", 31 - "svelte": "./dist/index.js", 30 + "types": "./src/lib/types.d.ts", 31 + "svelte": "./src/lib/index.ts", 32 + "publishOverrides": { 33 + "files": [ 34 + "dist" 35 + ], 36 + "svelte": "./dist/index.js", 37 + "exports": { 38 + ".": { 39 + "types": "./dist/types.d.ts", 40 + "svelte": "./dist/index.js" 41 + } 42 + }, 43 + "types": "./dist/types.d.ts" 44 + }, 32 45 "devDependencies": { 33 46 "@eslint/compat": "^1.2.5", 34 47 "@eslint/js": "^9.18.0", ··· 59 72 "@fuxui/base": "workspace:*", 60 73 "@use-gesture/vanilla": "^10.3.1", 61 74 "bits-ui": "^1.4.3", 75 + "emoji-picker-element": "^1.26.3", 62 76 "hls.js": "^1.6.2", 77 + "is-emoji-supported": "^0.0.5", 63 78 "plyr": "^3.7.8" 64 79 }, 65 80 "peerDependencies": {
+17 -4
packages/time/package.json
··· 23 23 ], 24 24 "exports": { 25 25 ".": { 26 - "types": "./dist/types.d.ts", 27 - "svelte": "./dist/index.js" 26 + "types": "./src/lib/types.d.ts", 27 + "svelte": "./src/lib/index.ts" 28 28 } 29 29 }, 30 - "types": "./dist/types.d.ts", 31 - "svelte": "./dist/index.js", 30 + "types": "./src/lib/types.d.ts", 31 + "svelte": "./src/lib/index.ts", 32 + "publishOverrides": { 33 + "files": [ 34 + "dist" 35 + ], 36 + "svelte": "./dist/index.js", 37 + "exports": { 38 + ".": { 39 + "types": "./dist/types.d.ts", 40 + "svelte": "./dist/index.js" 41 + } 42 + }, 43 + "types": "./dist/types.d.ts" 44 + }, 32 45 "devDependencies": { 33 46 "@eslint/compat": "^1.2.5", 34 47 "@eslint/js": "^9.18.0",
+17 -4
packages/visual/package.json
··· 23 23 ], 24 24 "exports": { 25 25 ".": { 26 - "types": "./dist/types.d.ts", 27 - "svelte": "./dist/index.js" 26 + "types": "./src/lib/types.d.ts", 27 + "svelte": "./src/lib/index.ts" 28 28 } 29 29 }, 30 - "types": "./dist/types.d.ts", 31 - "svelte": "./dist/index.js", 30 + "types": "./src/lib/types.d.ts", 31 + "svelte": "./src/lib/index.ts", 32 + "publishOverrides": { 33 + "files": [ 34 + "dist" 35 + ], 36 + "svelte": "./dist/index.js", 37 + "exports": { 38 + ".": { 39 + "types": "./dist/types.d.ts", 40 + "svelte": "./dist/index.js" 41 + } 42 + }, 43 + "types": "./dist/types.d.ts" 44 + }, 32 45 "devDependencies": { 33 46 "@eslint/compat": "^1.2.5", 34 47 "@eslint/js": "^9.18.0",
-2
apps/docs/src/lib/site-components/API.svelte
··· 3 3 import { Button, Popover, Badge } from '@fuxui/base'; 4 4 5 5 const { props }: { props: APISchema } = $props(); 6 - 7 - console.log(props); 8 6 </script> 9 7 10 8 <h4 class="not-prose text-base-900 dark:text-base-50 mt-12 mb-2 text-lg font-semibold">
+10
apps/docs/src/routes/(main)/+layout.svelte
··· 2 2 import Navbar from '$lib/site-components/Navbar.svelte'; 3 3 import Sidebar from '$lib/site-components/Sidebar.svelte'; 4 4 import Container from '$lib/site-components/Container.svelte'; 5 + import { AddCopyCodeButtons } from '@fuxui/base'; 6 + import { afterNavigate } from '$app/navigation'; 5 7 6 8 let { children } = $props(); 9 + 10 + let addButton = $state(() => {}) 11 + 12 + afterNavigate(() => { 13 + addButton?.(); 14 + }); 7 15 </script> 8 16 9 17 <Navbar hasSidebar showLogo={false} /> ··· 12 20 <Container id="content"> 13 21 {@render children()} 14 22 </Container> 23 + 24 + <AddCopyCodeButtons bind:addButton />
+1
packages/base/src/lib/components/index.ts
··· 7 7 export * from './card'; 8 8 export * from './chat-bubble'; 9 9 export * from './checkbox'; 10 + export * from './copy-code-button'; 10 11 export * from './head'; 11 12 export * from './heading'; 12 13 export * from './image';
+2 -1
packages/social/src/lib/components/index.ts
··· 5 5 export * from './swiper-cards'; 6 6 export * from './user-profile'; 7 7 export * from './github-corner'; 8 - export * from './chat'; 8 + export * from './chat'; 9 + export * from './emoji-picker';
+4 -6
packages/base/src/lib/components/copy-code-button/AddCopyCodeButtons.svelte
··· 3 3 import CopyCodeButton from './CopyCodeButton.svelte'; 4 4 5 5 onMount(() => { 6 - addButtons(); 6 + addButton?.(); 7 7 }); 8 8 9 - // afterNavigate(() => { 10 - // addButtons(); 11 - // }); 9 + let { addButton = $bindable(() => {}) }: { addButton?: () => void } = $props(); 12 10 13 11 let codeblocks: { element: HTMLElement; text?: string }[] = $state([]); 14 12 15 - function addButtons() { 13 + addButton = () => { 16 14 const preElements = Array.from(document.querySelectorAll('pre')); 17 15 for (let pre of preElements) { 18 16 if (pre.classList.contains('wrapped')) continue; ··· 29 27 30 28 codeblocks.push({ element: wrapper, text: pre.innerText }); 31 29 } 32 - } 30 + }; 33 31 </script> 34 32 35 33 {#each codeblocks as codeblock}
+1 -1
packages/base/src/lib/components/navbar/Navbar.svelte
··· 14 14 <div 15 15 class={cn( 16 16 'header fixed top-0 right-0 left-0 z-50 flex h-16 items-center justify-between p-2', 17 - hasSidebar ? 'lg:left-72 xl:left-80' : '', 17 + hasSidebar ? 'lg:left-72' : '', 18 18 className 19 19 )} 20 20 {...restProps}
+27 -12
packages/base/src/lib/components/prose/Prose.svelte
··· 1 1 <script lang="ts"> 2 - import { AddCopyCodeButtons } from '../copy-code-button'; 2 + import type { Snippet } from 'svelte'; 3 + import { cn } from '../../utils'; 3 4 4 - let { children } = $props(); 5 - 6 - // this is fucking hacky, todo fix that 5 + let { children, class: className }: { children: Snippet; class?: string } = $props(); 7 6 </script> 8 7 9 8 <div 10 - class="prose prose-base prose-sm prose-a:no-underline prose-a:text-accent-600 dark:prose-a:text-accent-600 prose-pre:rounded-2xl w-full max-w-2xl dark:hidden" 9 + class={cn( 10 + 'prose dark:prose-invert prose-sm prose-a:no-underline prose-a:text-accent-600 dark:prose-a:text-accent-600 prose-pre:rounded-2xl w-full max-w-2xl', 11 + className 12 + )} 11 13 > 12 14 {@render children?.()} 13 15 </div> 14 - <div 15 - class="prose prose-sm prose-base-dark dark:prose-invert prose-a:no-underline prose-a:text-accent-600 dark:prose-a:text-accent-400 prose-pre:rounded-2xl hidden w-full max-w-2xl dark:block" 16 - > 17 - {@render children?.()} 18 - </div> 19 - 20 - <AddCopyCodeButtons /> 21 16 22 17 <style> 23 18 .prose-base { ··· 39 34 --tw-prose-pre-bg: var(--color-base-800); 40 35 --tw-prose-th-borders: var(--color-base-300); 41 36 --tw-prose-td-borders: var(--color-base-200); 37 + 38 + 39 + --tw-prose-invert-body: var(--color-base-300); 40 + --tw-prose-invert-headings: var(--color-white); 41 + --tw-prose-invert-lead: var(--color-base-400); 42 + --tw-prose-invert-links: var(--color-white); 43 + --tw-prose-invert-bold: var(--color-white); 44 + --tw-prose-invert-counters: var(--color-base-400); 45 + --tw-prose-invert-bullets: var(--color-base-600); 46 + --tw-prose-invert-hr: var(--color-base-700); 47 + --tw-prose-invert-quotes: var(--color-base-100); 48 + --tw-prose-invert-quote-borders: var(--color-base-700); 49 + --tw-prose-invert-captions: var(--color-base-400); 50 + --tw-prose-invert-kbd: var(--color-white); 51 + --tw-prose-invert-kbd-shadows: var(--color-white); 52 + --tw-prose-invert-code: var(--color-white); 53 + --tw-prose-invert-pre-code: var(--color-base-300); 54 + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); 55 + --tw-prose-invert-th-borders: var(--color-base-600); 56 + --tw-prose-invert-td-borders: var(--color-base-700); 42 57 } 43 58 44 59 .prose-base-dark {
+12
packages/base/src/lib/components/prose/ProseCopyButton.svelte
··· 1 + <script lang="ts"> 2 + import { AddCopyCodeButtons } from "../copy-code-button"; 3 + import Prose from "./Prose.svelte"; 4 + import type { Snippet } from "svelte"; 5 + 6 + let { children, class: className }: { children: Snippet; class?: string } = $props(); 7 + </script> 8 + <Prose class={className}> 9 + {@render children?.()} 10 + </Prose> 11 + 12 + <AddCopyCodeButtons />
+1 -1
packages/base/src/lib/components/sidebar/Sidebar.svelte
··· 36 36 <div 37 37 class={cn( 38 38 'border-base-200 bg-base-50 dark:border-base-300/10 dark:bg-base-950 fixed top-0 bottom-0 left-0 z-40', 39 - 'hidden -translate-x-72 border-r lg:block lg:w-72 lg:translate-x-0 xl:w-80', 39 + 'hidden -translate-x-72 border-r lg:block lg:w-72 lg:translate-x-0', 40 40 className 41 41 )} 42 42 {...restProps}
+68
packages/social/src/lib/components/emoji-picker/EmojiPicker.svelte
··· 1 + <script lang="ts"> 2 + import { cn, ScrollArea } from '@fuxui/base'; 3 + import { onMount } from 'svelte'; 4 + import { isEmojiSupported } from 'is-emoji-supported'; 5 + import { allGroups, type Emoji } from './emoji'; 6 + 7 + onMount(async () => { 8 + initEmojiPicker(); 9 + }); 10 + 11 + let emojiGroups: { [key: number]: any[] } = $state({}); 12 + 13 + let currentGroup = $state(allGroups[0].id); 14 + 15 + let { onpicked }: { onpicked?: (emoji: Emoji) => void } = $props(); 16 + 17 + async function initEmojiPicker() { 18 + const { Database } = await import('emoji-picker-element'); 19 + 20 + const db = new Database(); 21 + 22 + let allEmojis: { [key: number]: any[] } = {}; 23 + for (let group of allGroups) { 24 + const emojis = await db.getEmojiByGroup(group.id); 25 + let validEmojis = []; 26 + for (let emoji of emojis) { 27 + if (isEmojiSupported(emoji.unicode)) { 28 + validEmojis.push(emoji); 29 + } 30 + } 31 + allEmojis[group.id] = validEmojis; 32 + } 33 + 34 + emojiGroups = allEmojis; 35 + } 36 + </script> 37 + 38 + <div class="flex w-[344px] flex-col"> 39 + <ScrollArea class="grid h-[250px] w-full select-none grid-cols-8 space-y-3 px-2"> 40 + {#if !emojiGroups[currentGroup] || emojiGroups[currentGroup].length === 0} 41 + <div class="col-span-8 flex h-full w-full"> 42 + <p class="text-base-500 dark:text-base-400 text-sm">Loading emojis...</p> 43 + </div> 44 + {/if} 45 + {#each emojiGroups[currentGroup] as emoji} 46 + <button 47 + onclick={() => { 48 + onpicked?.(emoji); 49 + }} 50 + class="hover:bg-accent-300/20 dark:hover:bg-accent-700/20 hover:scale-110 transition-transform duration-100 cursor-pointer rounded-full text-center text-xl size-10" 51 + >{emoji.unicode}</button 52 + > 53 + {/each} 54 + </ScrollArea> 55 + <div class="border-base-300/50 dark:border-base-700/50 flex justify-between gap-2 border-t px-3 py-2"> 56 + {#each allGroups as group} 57 + <button 58 + onclick={() => (currentGroup = group.id)} 59 + class={cn( 60 + '[&>svg]:size-4.5 cursor-pointer hover:scale-105 transition-all duration-100', 61 + group.id === currentGroup ? 'text-accent-600 dark:text-accent-400' : 'hover:text-accent-700 dark:hover:text-accent-300' 62 + )} 63 + >{@html group.svg} 64 + <span class="sr-only">{group.name}</span> 65 + </button> 66 + {/each} 67 + </div> 68 + </div>
+22
packages/social/src/lib/components/emoji-picker/PopoverEmojiPicker.svelte
··· 1 + <script lang="ts"> 2 + import { Popover, type PopoverProps, cn } from '@fuxui/base'; 3 + import EmojiPicker from './EmojiPicker.svelte'; 4 + import type { Emoji } from './emoji'; 5 + import type { Snippet } from 'svelte'; 6 + 7 + let { 8 + onpicked, 9 + children, 10 + class: className, 11 + ...props 12 + }: { 13 + onpicked?: (emoji: Emoji) => void; 14 + children?: Snippet; 15 + class?: string; 16 + } & PopoverProps = $props(); 17 + </script> 18 + 19 + <Popover {...props} class={cn('px-0 pb-0 pt-1', className)}> 20 + {@render children?.()} 21 + <EmojiPicker {onpicked} /> 22 + </Popover>
+70
packages/social/src/lib/components/emoji-picker/emoji.ts
··· 1 + export const allGroups = [ 2 + [ 3 + 0, 4 + '😀', 5 + 'smileys-emotion', 6 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M8 14s1.5 2 4 2 4-2 4-2"/><line x1="9" x2="9.01" y1="9" y2="9"/><line x1="15" x2="15.01" y1="9" y2="9"/></svg>` 7 + ], 8 + [ 9 + 1, 10 + '👋', 11 + 'people-body', 12 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-hand-icon lucide-hand"><path d="M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2"/><path d="M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2"/><path d="M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8"/><path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"/></svg>` 13 + ], 14 + [ 15 + 3, 16 + '🐱', 17 + 'animals-nature', 18 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-dog-icon lucide-dog"><path d="M11.25 16.25h1.5L12 17z"/><path d="M16 14v.5"/><path d="M4.42 11.247A13.152 13.152 0 0 0 4 14.556C4 18.728 7.582 21 12 21s8-2.272 8-6.444a11.702 11.702 0 0 0-.493-3.309"/><path d="M8 14v.5"/><path d="M8.5 8.5c-.384 1.05-1.083 2.028-2.344 2.5-1.931.722-3.576-.297-3.656-1-.113-.994 1.177-6.53 4-7 1.923-.321 3.651.845 3.651 2.235A7.497 7.497 0 0 1 14 5.277c0-1.39 1.844-2.598 3.767-2.277 2.823.47 4.113 6.006 4 7-.08.703-1.725 1.722-3.656 1-1.261-.472-1.855-1.45-2.239-2.5"/></svg>` 19 + ], 20 + [ 21 + 4, 22 + '🍎', 23 + 'food-drink', 24 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-apple-icon lucide-apple"><path d="M12 20.94c1.5 0 2.75 1.06 4 1.06 3 0 6-8 6-12.22A4.91 4.91 0 0 0 17 5c-2.22 0-4 1.44-5 2-1-.56-2.78-2-5-2a4.9 4.9 0 0 0-5 4.78C2 14 5 22 8 22c1.25 0 2.5-1.06 4-1.06Z"/><path d="M10 2c1 .5 2 2 2 5"/></svg> ` 25 + ], 26 + [ 27 + 5, 28 + '🏠️', 29 + 'travel-places', 30 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-house-icon lucide-house"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"/><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg>` 31 + ], 32 + [ 33 + 6, 34 + '⚽', 35 + 'activities', 36 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-volleyball-icon lucide-volleyball"><path d="M11.1 7.1a16.55 16.55 0 0 1 10.9 4"/><path d="M12 12a12.6 12.6 0 0 1-8.7 5"/><path d="M16.8 13.6a16.55 16.55 0 0 1-9 7.5"/><path d="M20.7 17a12.8 12.8 0 0 0-8.7-5 13.3 13.3 0 0 1 0-10"/><path d="M6.3 3.8a16.55 16.55 0 0 0 1.9 11.5"/><circle cx="12" cy="12" r="10"/></svg>` 37 + ], 38 + [ 39 + 7, 40 + '📝', 41 + 'objects', 42 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-lightbulb-icon lucide-lightbulb"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg>` 43 + ], 44 + [ 45 + 8, 46 + '⛔️', 47 + 'symbols', 48 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-square-pi-icon lucide-square-pi"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M7 7h10"/><path d="M10 7v10"/><path d="M16 17a2 2 0 0 1-2-2V7"/></svg>` 49 + ], 50 + [ 51 + 9, 52 + '🏁', 53 + 'flags', 54 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flag-icon lucide-flag"><path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/><line x1="4" x2="4" y1="22" y2="15"/></svg>` 55 + ] 56 + ].map(([id, emoji, name, svg]) => ({ id, emoji, name, svg })) as { 57 + id: number; 58 + emoji: string; 59 + name: string; 60 + svg: string; 61 + }[]; 62 + 63 + export type Emoji = { 64 + annotation: string; 65 + group: number; 66 + order: number; 67 + shortcodes: string[]; 68 + tags: string[]; 69 + unicode: string; 70 + };
+2
packages/social/src/lib/components/emoji-picker/index.ts
··· 1 + export { default as EmojiPicker } from './EmojiPicker.svelte'; 2 + export { default as PopoverEmojiPicker } from './PopoverEmojiPicker.svelte';
-1
packages/visual/src/lib/components/image-masonry/ImageMasonry.svelte
··· 81 81 <button 82 82 class="z-20 cursor-pointer" 83 83 onclick={() => { 84 - console.log('clicked'); 85 84 image.onclick?.(); 86 85 }} 87 86 >
-4
apps/docs/src/routes/(main)/components/colors/color-gradient-picker/Example.svelte
··· 27 27 updateColors(oklch); 28 28 29 29 theme.subscribe(() => { 30 - console.log('theme changed'); 31 30 const accentColor = theme.getCSSVar('--color-accent-500'); 32 31 let oklch = oklch_string_to_oklch(accentColor); 33 32 updateColors(oklch); ··· 59 58 <ColorGradientPicker 60 59 class="not-prose mt-8" 61 60 bind:colors 62 - onchange={() => { 63 - console.log('hello there'); 64 - }} 65 61 /> 66 62 67 63 <h3>Small</h3>
+1 -1
apps/docs/src/routes/(main)/components/social/bluesky-login/Example.svelte
··· 4 4 </script> 5 5 6 6 7 - <BlueskyLogin login={async (handle) => { 7 + <BlueskyLogin login={async (handle: string) => { 8 8 if(!handle) { 9 9 toast.error('Please enter a handle'); 10 10 return false;
+8
apps/docs/src/routes/(main)/components/social/emoji-picker/+page.svelte
··· 1 + <script lang="ts"> 2 + import EmojiPickerDocs from './EmojiPicker.md'; 3 + import { Prose } from '@fuxui/base'; 4 + </script> 5 + 6 + <Prose> 7 + <EmojiPickerDocs /> 8 + </Prose>
+19
apps/docs/src/routes/(main)/components/social/emoji-picker/EmojiPicker.md
··· 1 + <script lang="ts"> 2 + import Example from './Example.svelte'; 3 + </script> 4 + 5 + # Emoji Picker 6 + 7 + ## Example 8 + 9 + <Example /> 10 + 11 + ## Usage 12 + 13 + ```svelte 14 + <script lang="ts"> 15 + import { EmojiPicker } from '@fuxui/social'; 16 + </script> 17 + 18 + <EmojiPicker /> 19 + ```
+34
apps/docs/src/routes/(main)/components/social/emoji-picker/Example.svelte
··· 1 + <script lang="ts"> 2 + import { Button, toast } from '@fuxui/base'; 3 + import { EmojiPicker, PopoverEmojiPicker } from '@fuxui/social'; 4 + </script> 5 + 6 + <EmojiPicker onpicked={(emoji) => toast('selected emoji: ' + emoji.unicode)} /> 7 + 8 + <h3>Popover Emoji Picker</h3> 9 + 10 + <PopoverEmojiPicker 11 + onpicked={(emoji) => toast('selected emoji: ' + emoji.unicode)} 12 + triggerText="Emoji Picker" 13 + > 14 + {#snippet child({ props })} 15 + <Button size="iconLg" {...props}> 16 + <svg 17 + xmlns="http://www.w3.org/2000/svg" 18 + viewBox="0 0 24 24" 19 + fill="none" 20 + stroke="currentColor" 21 + stroke-width="1.5" 22 + stroke-linecap="round" 23 + stroke-linejoin="round" 24 + class="lucide lucide-smile-icon lucide-smile" 25 + ><circle cx="12" cy="12" r="10" /><path d="M8 14s1.5 2 4 2 4-2 4-2" /><line 26 + x1="9" 27 + x2="9.01" 28 + y1="9" 29 + y2="9" 30 + /><line x1="15" x2="15.01" y1="9" y2="9" /></svg 31 + > 32 + </Button> 33 + {/snippet} 34 + </PopoverEmojiPicker>
-2
apps/docs/src/routes/(main)/components/visual/image-masonry/Example.svelte
··· 62 62 toast.success('clicked'); 63 63 } 64 64 })); 65 - 66 - console.log(images); 67 65 </script> 68 66 69 67 <ImageMasonry {images} />