···11{
22 "name": "fuchs",
33- "version": "0.0.8",
33+ "version": "0.0.9",
44 "type": "module",
55 "description": "Beautiful UI components built with Tailwind 4 and Svelte 5",
66 "homepage": "https://flo-bit.dev/ui-kit",
+1
src/lib/index.ts
···2020export { default as Prose } from '$lib/components/base/prose/Prose.svelte';
2121export { default as ScrollArea } from '$lib/components/base/scroll-area/ScrollArea.svelte';
2222export { Slider } from '$lib/components/base/slider';
2323+export { Select } from '$lib/components/base/select/';
2324export { default as SliderNumber } from '$lib/components/base/slider/SliderNumber.svelte';
2425export { Toaster } from '$lib/components/base/sonner/';
2526export { toast } from 'svelte-sonner';
-10
src/docs/preview/ExcalidrawPreview.svelte
···11-<script>
22- import Excalidraw from '$lib/components/extra/excalidraw/Excalidraw.svelte';
33- import Heading from '$lib/components/base/heading/Heading.svelte';
44-55- import svg from '$docs/assets/demo.svg?raw';
66-</script>
77-88-<Heading class="mb-4">Excalidraw</Heading>
99-1010-<Excalidraw {svg} alt="Excalidraw Demo" caption="This is a demo of the Excalidraw component." />
···11-<script>
22- import Box from '$lib/components/base/box/Box.svelte';
33- import Subheading from '$lib/components/base/heading/Subheading.svelte';
44-</script>
55-66-<Subheading class="mb-4">Box</Subheading>
77-88-<Box class="text-sm">This is a box, put your stuff here.</Box>
···11-<script>
22- import Box from '$lib/components/base/box/Box.svelte';
33- import ChatBubble from '$lib/components/base/chat-bubble/ChatBubble.svelte';
44- import Heading from '$lib/components/base/heading/Heading.svelte';
55-66- import ImageContainer from '$lib/components/base/image-container/ImageContainer.svelte';
77-88- import cute from '$docs/assets/images/cute.jpg?as=run';
99-</script>
1010-1111-<Heading class="mb-4">Chat Bubble</Heading>
1212-1313-<Box class="flex flex-col gap-3">
1414- <ChatBubble side="right" variant="secondary">
1515- <p>Hello there</p>
1616- </ChatBubble>
1717-1818- <ChatBubble>
1919- <p>General Kenobi</p>
2020- </ChatBubble>
2121-2222- <ChatBubble side="right" variant="secondary">
2323- <p>This is a really long message that should wrap around the chat bubble and not overflow</p>
2424- </ChatBubble>
2525- <ChatBubble>
2626- <p>
2727- This is another really long message that should wrap around the chat bubble and not overflow
2828- </p>
2929- </ChatBubble>
3030-3131- <ChatBubble side="right" variant="secondary">
3232- <p>This is me sending you an image</p>
3333-3434- <ImageContainer src={cute} alt="cute cat" containerClasses="-mx-1.5 rounded-xl" />
3535- </ChatBubble>
3636-</Box>
-34
src/docs/preview/base/CheckboxPreview.svelte
···11-<script>
22- import { Subheading } from '$lib/components/base/heading';
33- import { Text } from '$lib/components/base/text';
44- import { Checkbox } from '$lib/components/base/checkbox';
55- import { Label } from '$lib/components/base/label';
66-</script>
77-88-<Subheading>Checkboxes</Subheading>
99-1010-<Text class="mt-4 mb-2">Primary</Text>
1111-<div class="flex items-center gap-2">
1212- <Checkbox sizeVariant="sm" variant="primary" />
1313- <Checkbox sizeVariant="default" variant="primary" />
1414- <Checkbox sizeVariant="lg" variant="primary" />
1515-</div>
1616-1717-<Text class="mt-4 mb-2">Secondary</Text>
1818-<div class="flex items-center gap-2">
1919- <Checkbox sizeVariant="sm" variant="secondary" />
2020- <Checkbox sizeVariant="default" variant="secondary" />
2121- <Checkbox sizeVariant="lg" variant="secondary" />
2222-</div>
2323-2424-<Text class="mt-4 mb-2">With Label</Text>
2525-<div class="flex items-center space-x-2">
2626- <Checkbox id="terms" aria-labelledby="terms-label" variant="secondary" />
2727- <Label
2828- id="terms-label"
2929- for="terms"
3030- class="text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
3131- >
3232- Yes, I agree to the terms and sell my soul (and no I didn't read the terms)
3333- </Label>
3434-</div>
-45
src/docs/preview/base/ImageCardPreview.svelte
···11-<script>
22- import ImageCard from '$lib/components/base/card/ImageCard.svelte';
33- import { Subheading } from '$lib/components/base/heading';
44- import { Text } from '$lib/components/base/text';
55-66- import nature1 from '$docs/assets/images/nature1.jpg?as=run';
77- import nature2 from '$docs/assets/images/nature2.jpg?as=run';
88- import nature3 from '$docs/assets/images/nature3.jpg?as=run';
99- import { toast } from 'svelte-sonner';
1010-</script>
1111-1212-<Subheading class="mt-8 mb-4">Image card</Subheading>
1313-1414-<Text class="mt-4">Full width</Text>
1515-<ImageCard
1616- src={nature1}
1717- alt="Nature 1"
1818- title="Hello World"
1919- description="Just wanted to say hello to everyone on this beautiful planet, been traveling a lot lately and wanted to share some of the places I've been to."
2020- href="#"
2121-/>
2222-2323-<Text class="mt-8 mb-4">In a grid</Text>
2424-<div class="grid w-full grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3">
2525- <ImageCard
2626- src={nature1}
2727- alt="Nature 1"
2828- title="Best places to visit"
2929- description="This is such a long description, that it will probably be cut off and truncated after the first two lines."
3030- href="#"
3131- />
3232- <ImageCard
3333- src={nature2}
3434- alt="Nature 2"
3535- title="This is a beautiful place"
3636- description="This card will show a toast when clicked"
3737- onclick={() => toast('Hello World')}
3838- />
3939- <ImageCard
4040- src={nature3}
4141- alt="Nature 3"
4242- title="Traveling is fun"
4343- description="But this card is not clickable"
4444- />
4545-</div>
-24
src/docs/preview/base/ImagePreview.svelte
···11-<script>
22- import Subheading from '$lib/components/base/heading/Subheading.svelte';
33- import ImageContainer from '$lib/components/base/image-container/ImageContainer.svelte';
44- import Text from '$lib/components/base/text/Text.svelte';
55-66- import cute from '$docs/assets/images/cute.jpg?as=run';
77- import cute2 from '$docs/assets/images/cute2.jpg?as=run';
88-</script>
99-1010-<Subheading class="mb-4">Images</Subheading>
1111-1212-<ImageContainer src={cute} alt="Such a cute animal" />
1313-1414-<Text class="mt-4">Overlay theme color</Text>
1515-<ImageContainer src={cute2} alt="Another cute animal" useThemeColor={true} class="max-w-64" />
1616-1717-<Text class="mt-4">Show normal image on hover</Text>
1818-<ImageContainer
1919- src={cute2}
2020- alt="Another cute animal"
2121- useThemeColor={true}
2222- class="max-w-64"
2323- showNormalOnHover={true}
2424-/>
-19
src/docs/preview/base/InputPreview.svelte
···11-<script>
22- import { Subheading } from '$lib/components/base/heading';
33- import { Input } from '$lib/components/base/input';
44- import { Text } from '$lib/components/base/text';
55-</script>
66-77-<Subheading>Input</Subheading>
88-99-<Text class="mt-4 mb-2">Primary</Text>
1010-1111-<Input sizeVariant="sm" placeholder="Enter text here (small)" />
1212-<Input placeholder="Enter text here (default)" />
1313-<Input sizeVariant="lg" placeholder="Enter text here (large)" />
1414-1515-<Text class="mt-4 mb-2">Secondary</Text>
1616-1717-<Input variant="secondary" sizeVariant="sm" placeholder="Enter text here (small)" />
1818-<Input variant="secondary" placeholder="Enter text here (default)" />
1919-<Input variant="secondary" sizeVariant="lg" placeholder="Enter text here (large)" />
-55
src/docs/preview/base/ModalPreview.svelte
···11-<script>
22- import Button from '$lib/components/base/button/Button.svelte';
33- import Subheading from '$lib/components/base/heading/Subheading.svelte';
44- import Modal from '$lib/components/base/modal/Modal.svelte';
55- import Text from '$lib/components/base/text/Text.svelte';
66- import { toast } from 'svelte-sonner';
77-88- import cute from '$docs/assets/images/cute.jpg?as=run';
99- import BlueskyLoginModal, {
1010- blueskyLoginModalState
1111- } from '$lib/components/base/modal/BlueskyLoginModal.svelte';
1212- import ImageContainer from '$lib/components/base/image-container/ImageContainer.svelte';
1313-1414- let openDefault = $state(false);
1515- let openCustom = $state(false);
1616-</script>
1717-1818-<Subheading class="mb-4">Modal</Subheading>
1919-2020-<Button onclick={() => (openDefault = true)}>Default Modal</Button>
2121-2222-<Button onclick={() => (openCustom = true)} variant="secondary">Custom Modal</Button>
2323-2424-<Button onclick={() => (blueskyLoginModalState.open = true)} variant="secondary"
2525- >Bluesky Login Modal</Button
2626->
2727-2828-<Modal
2929- bind:open={openDefault}
3030- title="This is the default modal"
3131- description="It has a title, description, and two buttons (yes and no)"
3232- yesButton={{ label: 'Yes', onclick: () => toast('Yes', { description: 'Smart choice' }) }}
3333- noButton={{ label: 'No', onclick: () => toast('No', { description: 'Why not though?' }) }}
3434-/>
3535-3636-<Modal bind:open={openCustom} closeButton={false}>
3737- <Subheading>Custom modal</Subheading>
3838-3939- <Text>You can put anything in here... Like an image:</Text>
4040-4141- <ImageContainer src={cute} alt="image in modal" useThemeColor />
4242-4343- <Button onclick={() => (openCustom = false)}>Cool</Button>
4444-</Modal>
4545-4646-<BlueskyLoginModal
4747- login={async (handle) => {
4848- await new Promise((resolve, reject) =>
4949- setTimeout(
5050- () => reject('This is just for UI testing, login is not actually implemented :/'),
5151- 1000
5252- )
5353- );
5454- }}
5555-/>
-8
src/docs/preview/base/NumberInputPreview.svelte
···11-<script>
22- import Subheading from '$lib/components/base/heading/Subheading.svelte';
33- import NumberInput from '$lib/components/base/number-input/NumberInput.svelte';
44-</script>
55-66-<Subheading class="mb-4">Number Input</Subheading>
77-88-<NumberInput />
···11-<script lang="ts">
22- import Prose from '$lib/components/base/prose/Prose.svelte';
33-44- let { children } = $props();
55-</script>
66-77-<Prose>
88- {@render children?.()}
99-</Prose>
-46
src/docs/preview/base/ScrollAreaPreview.svelte
···11-<script>
22- import Subheading from '$lib/components/base/heading/Subheading.svelte';
33- import ScrollArea from '$lib/components/base/scroll-area/ScrollArea.svelte';
44- import Text from '$lib/components/base/text/Text.svelte';
55-66- let content = `Doggo ipsum puggorino shoob I am bekom fat. Clouds such treat big ol pupper vvv, porgo. Aqua
77- doggo ur givin me a spook corgo heckin good boys heck much ruin diet, ur givin me a spook doggo
88- such treat ur givin me a spook. What a nice floof extremely cuuuuuute waggy wags floofs dat
99- tungg tho puggorino, smol aqua doggo dat tungg tho h*ck, sub woofer long doggo snoot you are
1010- doing me a frighten. Boofers heck porgo adorable doggo, many pats heckin good boys. Big ol blop
1111- very good spot aqua doggo, dat tungg tho pats smol borking doggo with a long snoot for pats,
1212- long bois smol. Lotsa pats borkf stop it fren heckin pupperino woofer, such treat very hand that
1313- feed shibe doge fluffer. what a nice floof vvv you are doin me a concern. Ruff you are doing me
1414- the shock boofers borkf smol borking doggo with a long snoot for pats, fluffer stop it fren many
1515- pats, doing me a frighten mlem ur givin me a spook. Stop it fren smol wow such tempt blep long
1616- woofer boofers, lotsa pats shooberino doge. corgo maximum borkdrive shibe. Many pats shoob
1717- heckin good boys I am bekom fat woofer, sub woofer long woofer. Very taste wow boof you are
1818- doing me a frighten very good spot boofers, stop it fren mlem. Length boy lotsa pats wow very
1919- biscit, blop. Snoot doggo length boy blep, length boy doing me a frighten. Big ol smol very
2020- taste wow adorable doggo, extremely cuuuuuute. borking doggo boofers. Long woofer porgo dat
2121- tungg tho boofers, blop borkdrive, h*ck mlem. Doing me a frighten long doggo blep such treat,
2222- adorable doggo smol. Such treat smol long bois most angery pupper I have ever seen, big ol
2323- pupper. Tungg much ruin diet fluffer shooberino blep aqua doggo, very taste wow very good spot
2424- aqua doggo big ol pupper pupper, long doggo very taste wow borking doggo puggo. Much ruin diet
2525- corgo you are doing me a frighten doing me a frighten, pupperino. Tungg waggy wags porgo heckin
2626- angery woofer ruff smol borking doggo with a long snoot for pats I am bekom fat, noodle horse
2727- thicc porgo many pats very hand that feed shibe, boof stop it fren heckin good boys and girls
2828- length boy super chub. Blop long water shoob puggorino yapper borkf, long woofer blep. I am
2929- bekom fat aqua doggo heck blep doggorino most angery pupper I have ever seen, pupper shoob
3030- floofs. Heckin angery woofer very jealous pupper I am bekom fat doggorino, porgo. Aqua doggo
3131- length boy ruff long bois shooberino, dat tungg tho very taste wow pupper. Clouds many pats doge
3232- heckin snoot, maximum borkdrive wow such tempt you are doin me a concern. Corgo puggorino smol
3333- borking doggo with a long snoot for pats super chub, fat boi h*ck. Dat tungg tho shoob much ruin
3434- diet very jealous pupper, floofs shibe he made many woofs woofer, heckin good boys pupperino.`;
3535-3636- let classes =
3737- 'h-[200px] w-[350px] rounded-2xl border border-base-200 dark:border-base-800 text-base-900 dark:text-base-100 bg-base-100 dark:bg-base-900';
3838-</script>
3939-4040-<Subheading class="mb-4">Scroll Area</Subheading>
4141-4242-<ScrollArea class={classes}>
4343- <div class="p-4">
4444- {content}
4545- </div>
4646-</ScrollArea>
-8
src/docs/preview/base/SelectPreview.svelte
···11-<script lang="ts">
22- import Subheading from '$lib/components/base/heading/Subheading.svelte';
33- import Select from '$lib/components/base/select/Select.svelte';
44-</script>
55-66-<Subheading class="mb-4">Select</Subheading>
77-88-<Select items={['Apple', 'Orange', 'Banana']} />
-10
src/docs/preview/base/SliderPreview.svelte
···11-<script lang="ts">
22- import { Subheading } from '$lib/components/base/heading';
33- import { Slider } from '$lib/components/base/slider';
44-55- let value = $state(50);
66-</script>
77-88-<Subheading class="mb-6">Slider</Subheading>
99-1010-<Slider bind:value type="single" />
-38
src/docs/preview/base/SonnerPreview.svelte
···11-<script lang="ts">
22- import { Button } from '$lib/components/base/button';
33- import Subheading from '$lib/components/base/heading/Subheading.svelte';
44- import { toast } from 'svelte-sonner';
55-</script>
66-77-<Subheading class="mb-4">Sonner</Subheading>
88-99-<div class="flex flex-wrap gap-4">
1010- <Button
1111- onclick={() =>
1212- toast('Hello there', {
1313- description: 'General Kenobi!'
1414- })}>Default</Button
1515- >
1616-1717- <Button
1818- variant="green"
1919- onclick={() =>
2020- toast.success('Success!', {
2121- description: "You are strong and wise and I'm very proud of you!"
2222- })}>Success</Button
2323- >
2424- <Button
2525- variant="red"
2626- onclick={() =>
2727- toast.error('Error!', {
2828- description: 'These are not the droids you are looking for.'
2929- })}>Error</Button
3030- >
3131- <Button
3232- variant="blue"
3333- onclick={() =>
3434- toast.info('Info!', {
3535- description: 'I heard spinning is a good trick.'
3636- })}>Info</Button
3737- >
3838-</div>
-28
src/docs/preview/base/SwitchPreview.svelte
···11-<script>
22- import { Subheading } from '$lib/components/base/heading';
33- import { Switch } from '$lib/components/base/switch';
44- import { Label } from '$lib/components/base/label';
55- import { Text } from '$lib/components/base/text';
66-77- let checked = $state(false);
88-99- let checked2 = $state(true);
1010-</script>
1111-1212-<Subheading class="mb-4">Switch</Subheading>
1313-1414-<Switch bind:checked onCheckedChange={() => (checked2 = !checked2)} />
1515-<Switch bind:checked={checked2} onCheckedChange={() => (checked = !checked)} />
1616-<Switch disabled />
1717-1818-<Text class="mt-4 mb-2">With Label</Text>
1919-<div class="flex items-center space-x-2">
2020- <Switch id="terms-switch" aria-labelledby="terms-switch-label" />
2121- <Label
2222- id="terms-switch-label"
2323- for="terms-switch"
2424- class="text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
2525- >
2626- Yes, I agree to the terms and sell my soul (and no I didn't read the terms)
2727- </Label>
2828-</div>
-19
src/docs/preview/base/TextareaPreview.svelte
···11-<script>
22- import { Subheading } from '$lib/components/base/heading';
33- import { Text } from '$lib/components/base/text';
44- import { Textarea } from '$lib/components/base/textarea';
55-</script>
66-77-<Subheading>Textarea</Subheading>
88-99-<Text class="mt-4 mb-2">Primary</Text>
1010-1111-<Textarea placeholder="Enter text here (small)" sizeVariant="sm" />
1212-<Textarea placeholder="Enter text here (default)" />
1313-<Textarea placeholder="Enter text here (large)" sizeVariant="lg" />
1414-1515-<Text class="mt-4 mb-2">Secondary</Text>
1616-1717-<Textarea placeholder="Enter text here (small)" variant="secondary" sizeVariant="sm" />
1818-<Textarea placeholder="Enter text here (default)" variant="secondary" />
1919-<Textarea placeholder="Enter text here (large)" variant="secondary" sizeVariant="lg" />
-17
src/docs/preview/base/TooltipPreview.svelte
···11-<script>
22- import { Subheading } from '$lib/components/base/heading';
33- import { Tooltip } from '$lib/components/base/tooltip';
44- import { Text } from '$lib/components/base/text';
55-</script>
66-77-<Subheading>Tooltip</Subheading>
88-99-<Text class="mt-4 mb-2">Primary</Text>
1010-<div class="flex w-full flex-col items-start gap-2 py-12">
1111- <Tooltip triggerText="Hover me" triggerVariant="primary" withContext>Hello there!</Tooltip>
1212-</div>
1313-1414-<Text class="mt-4 mb-2">Secondary</Text>
1515-<div class="flex w-full flex-col items-start gap-2 py-12">
1616- <Tooltip triggerText="Hover me" triggerVariant="secondary" withContext>Hello there!</Tooltip>
1717-</div>
+3-3
src/routes/docs/philosophy/Philosophy.md
···6565- [model-picker](/ui-kit/components/3d/model-picker/)
6666- [voxel-art](/ui-kit/components/3d/voxel-art/)
67676868-## Works without javascript when possible / is accessible
6868+## Works without javascript when possible & is accessible
69697070Whenever possible components should work without javascript.
7171-Also all components should be accessible to the best of my knowledge.
7272-Please let me know [if you find any issues](https://github.com/flo-bit/ui-kit/issues).
7171+Also all components should be accessible (to the best of my knowledge).
7272+Please let me know [if you find any issues there](https://github.com/flo-bit/ui-kit/issues).
73737474## Dark mode
7575