Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
"svelte-doc-llm": "^0.5.1",
"svelte-lib-helpers": "^0.4.31",
"svelte-meta-tags": "^4.5.0",
"svelte-rune-highlight": "^0.7.1",
"svelte-rune-highlight": "^0.11.0",
"tailwindcss": "^4.1.16",
"tsx": "^4.20.6",
"typescript": "^5.9.3",
Expand Down
10 changes: 5 additions & 5 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions src/lib/buttons/Button.svelte
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
<script lang="ts">
import { getContext } from "svelte";
import clsx from "clsx";
import { Spinner } from "$lib";
import type { SizeType, ButtonProps } from "$lib";
import { getTheme } from "$lib/theme/themeUtils";
import { button } from "./theme";

const group: SizeType = getContext("group");
const ctxDisabled: boolean | undefined = getContext("disabled");

let { children, pill, outline = false, size = "md", color, shadow = false, tag = "button", disabled, loading = false, class: className, ...restProps }: ButtonProps = $props();
let { children, pill, outline = false, size = "md", color, shadow = false, tag = "button", disabled, loading = false, spinnerProps = { size: "4" }, class: className, ...restProps }: ButtonProps = $props();

const theme = getTheme("button");

let actualSize = $derived(group ? "sm" : size);
let actualColor = $derived(color ?? (group ? (outline ? "dark" : "alternative") : "primary"));
let isDisabled = $derived(Boolean(ctxDisabled) || Boolean(disabled) || loading);

const { base, outline: outline_, shadow: shadow_ } = $derived(button({ color: actualColor, size: actualSize, disabled: isDisabled, pill, group: !!group }));
const { base, outline: outline_, shadow: shadow_, spinner } = $derived(button({ color: actualColor, size: actualSize, disabled: isDisabled, pill, group: !!group }));

let btnCls = $derived(base({ class: clsx(outline && outline_(), shadow && shadow_(), theme?.base, className) }));
</script>

Expand All @@ -28,10 +30,7 @@
<button type="button" {...restProps} class={btnCls} disabled={isDisabled}>
{@render children?.()}
{#if loading}
<svg class="ml-2 h-4 w-4 animate-spin text-white" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" />
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z" />
</svg>
<Spinner {...spinnerProps} class={spinner()}/>
{/if}
</button>
{:else}
Expand All @@ -55,6 +54,7 @@
@prop tag = "button"
@prop disabled
@prop loading = false
@prop spinnerProps = { size: "4" }
@prop class: className
@prop ...restProps
-->
3 changes: 2 additions & 1 deletion src/lib/buttons/theme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ export const button = tv({
slots: {
base: "text-center font-medium inline-flex items-center justify-center",
outline: "bg-transparent border hover:text-white dark:bg-transparent dark:hover-text-white",
shadow: "shadow-lg"
shadow: "shadow-lg",
spinner: "ms-2"
},
variants: {
color: {
Expand Down
46 changes: 23 additions & 23 deletions src/lib/datepicker/theme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,29 +22,29 @@ export const datepicker = tv({
},
variants: {
color: {
primary: { input: "focus:ring-primary-500 dark:focus:ring-primary-400", dayButton: "bg-primary-100 dark:bg-primary-900" },
blue: { input: "focus:ring-blue-500 dark:focus:ring-blue-400", dayButton: "bg-blue-100 dark:bg-blue-900" },
red: { input: "focus:ring-red-500 dark:focus:ring-red-400", dayButton: "bg-red-100 dark:bg-red-900" },
green: { input: "focus:ring-green-500 dark:focus:ring-green-400", dayButton: "bg-green-100 dark:bg-green-900" },
yellow: { input: "focus:ring-yellow-500 dark:focus:ring-yellow-400", dayButton: "bg-yellow-100 dark:bg-yellow-900" },
purple: { input: "focus:ring-purple-500 dark:focus:ring-purple-400", dayButton: "bg-purple-100 dark:bg-purple-900" },
dark: { input: "focus:ring-gray-500 dark:focus:ring-gray-400", dayButton: "bg-gray-100 dark:bg-gray-900" },
light: { input: "focus:ring-gray-500 dark:focus:ring-gray-400", dayButton: "bg-gray-100 dark:bg-gray-900" },
alternative: { input: "focus:ring-alternative-500 dark:focus:ring-alternative-400", dayButton: "bg-alternative-100 dark:bg-alternative-900" },
secondary: { input: "focus:ring-secondary-500 dark:focus:ring-secondary-400", dayButton: "bg-secondary-100 dark:bg-secondary-900" },
gray: { input: "focus:ring-gray-500 dark:focus:ring-gray-400", dayButton: "bg-gray-100 dark:bg-gray-900" },
orange: { input: "focus:ring-orange-500 dark:focus:ring-orange-400", dayButton: "bg-orange-100 dark:bg-orange-900" },
amber: { input: "focus:ring-amber-500 dark:focus:ring-amber-400", dayButton: "bg-amber-100 dark:bg-amber-900" },
lime: { input: "focus:ring-lime-500 dark:focus:ring-lime-400", dayButton: "bg-lime-100 dark:bg-lime-900" },
emerald: { input: "focus:ring-emerald-500 dark:focus:ring-emerald-400", dayButton: "bg-emerald-100 dark:bg-emerald-900" },
teal: { input: "focus:ring-teal-500 dark:focus:ring-teal-400", dayButton: "bg-teal-100 dark:bg-teal-900" },
cyan: { input: "focus:ring-cyan-500 dark:focus:ring-cyan-400", dayButton: "bg-cyan-100 dark:bg-cyan-900" },
sky: { input: "focus:ring-sky-500 dark:focus:ring-sky-400", dayButton: "bg-sky-100 dark:bg-sky-900" },
indigo: { input: "focus:ring-indigo-500 dark:focus:ring-indigo-400", dayButton: "bg-indigo-100 dark:bg-indigo-900" },
violet: { input: "focus:ring-violet-500 dark:focus:ring-violet-400", dayButton: "bg-violet-100 dark:bg-violet-900" },
fuchsia: { input: "focus:ring-fuchsia-500 dark:focus:ring-fuchsia-400", dayButton: "bg-fuchsia-100 dark:bg-fuchsia-900" },
pink: { input: "focus:ring-pink-500 dark:focus:ring-pink-400", dayButton: "bg-pink-100 dark:bg-pink-900" },
rose: { input: "focus:ring-rose-500 dark:focus:ring-rose-400", dayButton: "bg-rose-100 dark:bg-rose-900" }
primary: { input: "focus:ring-primary-500 dark:focus:ring-primary-400", dayButton: "bg-primary-300 dark:bg-primary-900" },
blue: { input: "focus:ring-blue-500 dark:focus:ring-blue-400", dayButton: "bg-blue-300 dark:bg-blue-900" },
red: { input: "focus:ring-red-500 dark:focus:ring-red-400", dayButton: "bg-red-300 dark:bg-red-900" },
green: { input: "focus:ring-green-500 dark:focus:ring-green-400", dayButton: "bg-green-300 dark:bg-green-900" },
yellow: { input: "focus:ring-yellow-500 dark:focus:ring-yellow-400", dayButton: "bg-yellow-300 dark:bg-yellow-900" },
purple: { input: "focus:ring-purple-500 dark:focus:ring-purple-400", dayButton: "bg-purple-300 dark:bg-purple-900" },
dark: { input: "focus:ring-gray-500 dark:focus:ring-gray-400", dayButton: "bg-gray-300 dark:bg-gray-900" },
light: { input: "focus:ring-gray-500 dark:focus:ring-gray-400", dayButton: "bg-gray-300 dark:bg-gray-900" },
alternative: { input: "focus:ring-alternative-500 dark:focus:ring-alternative-400", dayButton: "bg-alternative-300 dark:bg-alternative-900" },
secondary: { input: "focus:ring-secondary-500 dark:focus:ring-secondary-400", dayButton: "bg-secondary-300 dark:bg-secondary-900" },
gray: { input: "focus:ring-gray-500 dark:focus:ring-gray-400", dayButton: "bg-gray-300 dark:bg-gray-900" },
orange: { input: "focus:ring-orange-500 dark:focus:ring-orange-400", dayButton: "bg-orange-300 dark:bg-orange-900" },
amber: { input: "focus:ring-amber-500 dark:focus:ring-amber-400", dayButton: "bg-amber-300 dark:bg-amber-900" },
lime: { input: "focus:ring-lime-500 dark:focus:ring-lime-400", dayButton: "bg-lime-300 dark:bg-lime-900" },
emerald: { input: "focus:ring-emerald-500 dark:focus:ring-emerald-400", dayButton: "bg-emerald-300 dark:bg-emerald-900" },
teal: { input: "focus:ring-teal-500 dark:focus:ring-teal-400", dayButton: "bg-teal-300 dark:bg-teal-900" },
cyan: { input: "focus:ring-cyan-500 dark:focus:ring-cyan-400", dayButton: "bg-cyan-300 dark:bg-cyan-900" },
sky: { input: "focus:ring-sky-500 dark:focus:ring-sky-400", dayButton: "bg-sky-300 dark:bg-sky-900" },
indigo: { input: "focus:ring-indigo-500 dark:focus:ring-indigo-400", dayButton: "bg-indigo-300 dark:bg-indigo-900" },
violet: { input: "focus:ring-violet-500 dark:focus:ring-violet-400", dayButton: "bg-violet-300 dark:bg-violet-900" },
fuchsia: { input: "focus:ring-fuchsia-500 dark:focus:ring-fuchsia-400", dayButton: "bg-fuchsia-300 dark:bg-fuchsia-900" },
pink: { input: "focus:ring-pink-500 dark:focus:ring-pink-400", dayButton: "bg-pink-300 dark:bg-pink-900" },
rose: { input: "focus:ring-rose-500 dark:focus:ring-rose-400", dayButton: "bg-rose-300 dark:bg-rose-900" }
},
inline: {
false: { base: "absolute z-10 mt-1" }
Expand Down
2 changes: 1 addition & 1 deletion src/lib/spinner/theme.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { tv, type VariantProps } from "tailwind-variants";

export type SpinnerVaraiants = VariantProps<typeof spinner>;
export type SpinnerVariants = VariantProps<typeof spinner>;

export const spinner = tv({
base: "inline-block",
Expand Down
21 changes: 11 additions & 10 deletions src/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ import type {
WidgetPlaceholderVariants
} from "$lib/skeleton/theme";
import type { SpeedDialVariants, SpeedDialButtonVariants } from "$lib/speed-dial/theme";
import type { SpinnerVaraiants } from "$lib/spinner/theme";
import type { SpinnerVariants } from "$lib/spinner/theme";
import type { StepIndicatorVariants } from "$lib/step-indicator/theme";
import type { StepperVariants, ProgressStepperVariants, DetailedStepperVariants, VerticalStepperVariants, BreadcrumbStepperVariants, TimelineStepperVariants } from "$lib/stepper/theme";
import type { PaginationItemVariants, PaginationVariants } from "$lib/pagination/theme";
Expand Down Expand Up @@ -348,6 +348,7 @@ export type ButtonProps = ButtonVariants &
outline?: boolean;
shadow?: boolean;
loading?: boolean;
spinnerProps?: SpinnerProps;
};

export interface GradientButtonProps extends GradientButtonVariantes, HTMLButtonOrAnchorAttributes {
Expand Down Expand Up @@ -623,7 +624,7 @@ export interface DrawerProps extends DrawerVariants, Omit<DialogProps, "hidden"
offset?: string;
}

export interface DrawerHandleProps extends DrawerHandleVariants, HTMLButtonAttributes {}
export interface DrawerHandleProps extends DrawerHandleVariants, HTMLButtonAttributes { }

export interface DrawerheadProps extends DrawerheadVariants, HTMLButtonAttributes {
closeIcon?: Snippet;
Expand Down Expand Up @@ -782,7 +783,7 @@ export interface FloatingLabelInputProps extends FloatingLabelInputVaratiants, O
}

// helper
export interface HelperProps extends HelperVariants, Omit<HTMLAttributes<HTMLParagraphElement>, "color"> {}
export interface HelperProps extends HelperVariants, Omit<HTMLAttributes<HTMLParagraphElement>, "color"> { }

// input
export type InputValue = string | number | string[] | undefined;
Expand Down Expand Up @@ -978,7 +979,7 @@ export interface TimepickerProps {
timeIntervals?: string[];
columns?: ColumnCount;
// Callback props instead of events
onselect?: (data: { time: string; endTime: string; [key: string]: string }) => void;
onselect?: (data: { time: string; endTime: string;[key: string]: string }) => void;
}

// textarea
Expand Down Expand Up @@ -1167,7 +1168,7 @@ export interface ToolbarProps extends ToolbarVariants, Omit<HTMLAttributes<HTMLD
end?: Snippet;
}

export interface ToolbarGroupProps extends ToolbarGroupVariants, HTMLAttributes<HTMLDivElement> {}
export interface ToolbarGroupProps extends ToolbarGroupVariants, HTMLAttributes<HTMLDivElement> { }

export type ToolbarButtonProps = ToolbarButtonVariants &
AnchorButtonAttributes & {
Expand Down Expand Up @@ -1484,7 +1485,7 @@ export interface SkeletonProps extends SkeletonVariants, HTMLAttributes<HTMLDivE
size?: SkeletonVariants["size"];
}

export interface TestimonialPlaceholderProps extends TestimonialPlaceholderVariants, HTMLAttributes<HTMLDivElement> {}
export interface TestimonialPlaceholderProps extends TestimonialPlaceholderVariants, HTMLAttributes<HTMLDivElement> { }

export interface TextPlaceholderProps extends TextPlaceholderVariants, HTMLAttributes<HTMLDivElement> {
size?: TextPlaceholderVariants["size"];
Expand All @@ -1494,7 +1495,7 @@ export interface VideoPlaceholderProps extends VideoPlaceholderVariants, HTMLAtt
size?: VideoPlaceholderVariants["size"];
}

export interface WidgetPlaceholderProps extends WidgetPlaceholderVariants, HTMLAttributes<HTMLDivElement> {}
export interface WidgetPlaceholderProps extends WidgetPlaceholderVariants, HTMLAttributes<HTMLDivElement> { }

// speeddial
export interface SpeedCtxType {
Expand Down Expand Up @@ -1553,8 +1554,8 @@ export type SpeedDialButtonProps = ButtonProps &
// spinner
export interface SpinnerProps extends SVGAttributes<SVGSVGElement> {
type?: "default" | "dots" | "bars" | "pulse" | "orbit";
color?: SpinnerVaraiants["color"];
size?: SpinnerVaraiants["size"];
color?: SpinnerVariants["color"];
size?: SpinnerVariants["size"];
currentFill?: string;
currentColor?: string;
}
Expand Down Expand Up @@ -1895,7 +1896,7 @@ export interface ToastContainerProps extends HTMLAttributes<HTMLDivElement> {
}

// tooltip
export interface TooltipProps extends TooltipVariants, PopperProps {}
export interface TooltipProps extends TooltipVariants, PopperProps { }

// typography
// anchor
Expand Down
4 changes: 2 additions & 2 deletions src/routes/admin-dashboard/(sidebar)/quickstart/+page.svelte
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script lang="ts">
import { Breadcrumb, BreadcrumbItem, Heading } from "flowbite-svelte";
import { HighlightCompo } from "../../utils";
import { HighlightAuto } from "svelte-rune-highlight";

const modules = import.meta.glob("./md/*.md", {
query: "?raw",
Expand All @@ -18,6 +18,6 @@
<Heading tag="h1" class="mb-8 text-xl font-semibold text-gray-900 sm:text-2xl dark:text-white">Flowbite Svelte Admin Dashboard</Heading>

<Heading tag="h2" class="my-8 text-xl font-semibold text-gray-900 sm:text-2xl dark:text-white">Installation</Heading>
<HighlightCompo class="mb-8" codeLang="js" code={modules["./md/installation.md"] as string} />
<HighlightAuto class="mb-8" code={modules["./md/installation.md"] as string} />
</div>
</main>
2 changes: 1 addition & 1 deletion src/routes/builder/skeleton/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
type ImagePlaceholderProps,
type VideoPlaceholderProps
} from "$lib";
import HighlightCompo from "../utils/HighlightCompo.svelte";
import { HighlightCompo } from "svelte-rune-highlight";
import DynamicCodeBlockHighlight from "../utils/DynamicCodeBlockHighlight.svelte";
import CodeWrapper from "../utils/CodeWrapper.svelte";
import H1 from "../utils/H1.svelte";
Expand Down
6 changes: 6 additions & 0 deletions src/routes/docs-examples/components/buttons/Loader.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@
import { Button, Spinner } from "flowbite-svelte";
</script>

<Button loading>
Loading ...
</Button>
<Button loading spinnerProps={{size:"4", color:"green"}}>
Loading ...
</Button>
<Button>
<Spinner class="me-3" size="4" color="gray" />Loading ...
</Button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
</script>

<div class="mb-64 md:w-1/2">
<Datepicker range bind:rangeFrom={dateRange.from} bind:rangeTo={dateRange.to} color="pink" />
<Datepicker range bind:rangeFrom={dateRange.from} bind:rangeTo={dateRange.to} color="blue" />
<P class="mt-4">
Selected range:
{dateRange.from ? dateRange.from.toLocaleDateString() : "None"} -
Expand Down
Loading