sdocs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -0
- package/bin/sdocs.js +2 -0
- package/dist/Sdocs.svelte +1210 -0
- package/dist/Sdocs.svelte.d.ts +5 -0
- package/dist/cli/app-plugin.d.ts +7 -0
- package/dist/cli/app-plugin.js +69 -0
- package/dist/cli/config.d.ts +12 -0
- package/dist/cli/config.js +34 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +72 -0
- package/dist/cli/server.d.ts +2 -0
- package/dist/cli/server.js +62 -0
- package/dist/docgen.d.ts +47 -0
- package/dist/docgen.js +463 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/internal/ComponentPreview.svelte +58 -0
- package/dist/internal/ComponentPreview.svelte.d.ts +17 -0
- package/dist/internal/CssPropsTable.svelte +239 -0
- package/dist/internal/CssPropsTable.svelte.d.ts +11 -0
- package/dist/internal/Home.svelte +92 -0
- package/dist/internal/Home.svelte.d.ts +9 -0
- package/dist/internal/MethodsTable.svelte +72 -0
- package/dist/internal/MethodsTable.svelte.d.ts +7 -0
- package/dist/internal/PropsTable.svelte +342 -0
- package/dist/internal/PropsTable.svelte.d.ts +12 -0
- package/dist/internal/Showcase.svelte +130 -0
- package/dist/internal/Showcase.svelte.d.ts +21 -0
- package/dist/types.d.ts +162 -0
- package/dist/types.js +1 -0
- package/dist/ui/Badge/Badge.docs.svelte +46 -0
- package/dist/ui/Badge/Badge.docs.svelte.d.ts +26 -0
- package/dist/ui/Badge/Badge.svelte +59 -0
- package/dist/ui/Badge/Badge.svelte.d.ts +17 -0
- package/dist/ui/Badge/index.d.ts +1 -0
- package/dist/ui/Badge/index.js +1 -0
- package/dist/ui/Checkbox/Checkbox.docs.svelte +51 -0
- package/dist/ui/Checkbox/Checkbox.docs.svelte.d.ts +27 -0
- package/dist/ui/Checkbox/Checkbox.svelte +169 -0
- package/dist/ui/Checkbox/Checkbox.svelte.d.ts +18 -0
- package/dist/ui/Checkbox/index.d.ts +1 -0
- package/dist/ui/Checkbox/index.js +1 -0
- package/dist/ui/CodeBlock/CodeBlock.docs.svelte +28 -0
- package/dist/ui/CodeBlock/CodeBlock.docs.svelte.d.ts +24 -0
- package/dist/ui/CodeBlock/CodeBlock.svelte +101 -0
- package/dist/ui/CodeBlock/CodeBlock.svelte.d.ts +7 -0
- package/dist/ui/CodeBlock/index.d.ts +1 -0
- package/dist/ui/CodeBlock/index.js +1 -0
- package/dist/ui/Frame/Frame.docs.svelte +140 -0
- package/dist/ui/Frame/Frame.docs.svelte.d.ts +26 -0
- package/dist/ui/Frame/Frame.svelte +88 -0
- package/dist/ui/Frame/Frame.svelte.d.ts +15 -0
- package/dist/ui/Frame/index.d.ts +1 -0
- package/dist/ui/Frame/index.js +1 -0
- package/dist/ui/InputNumber/InputNumber.docs.svelte +50 -0
- package/dist/ui/InputNumber/InputNumber.docs.svelte.d.ts +26 -0
- package/dist/ui/InputNumber/InputNumber.svelte +275 -0
- package/dist/ui/InputNumber/InputNumber.svelte.d.ts +26 -0
- package/dist/ui/InputNumber/index.d.ts +1 -0
- package/dist/ui/InputNumber/index.js +1 -0
- package/dist/ui/InputText/InputText.docs.svelte +43 -0
- package/dist/ui/InputText/InputText.docs.svelte.d.ts +26 -0
- package/dist/ui/InputText/InputText.svelte +116 -0
- package/dist/ui/InputText/InputText.svelte.d.ts +22 -0
- package/dist/ui/InputText/index.d.ts +1 -0
- package/dist/ui/InputText/index.js +1 -0
- package/dist/ui/Panel/CollapsiblePanel.docs.svelte +45 -0
- package/dist/ui/Panel/CollapsiblePanel.docs.svelte.d.ts +25 -0
- package/dist/ui/Panel/CollapsiblePanel.svelte +93 -0
- package/dist/ui/Panel/CollapsiblePanel.svelte.d.ts +14 -0
- package/dist/ui/Panel/index.d.ts +1 -0
- package/dist/ui/Panel/index.js +1 -0
- package/dist/ui/Placeholder/Placeholder.docs.svelte +49 -0
- package/dist/ui/Placeholder/Placeholder.docs.svelte.d.ts +26 -0
- package/dist/ui/Placeholder/Placeholder.svelte +99 -0
- package/dist/ui/Placeholder/Placeholder.svelte.d.ts +21 -0
- package/dist/ui/Placeholder/index.d.ts +1 -0
- package/dist/ui/Placeholder/index.js +1 -0
- package/dist/ui/Radio/Radio.docs.svelte +67 -0
- package/dist/ui/Radio/Radio.docs.svelte.d.ts +27 -0
- package/dist/ui/Radio/Radio.svelte +165 -0
- package/dist/ui/Radio/Radio.svelte.d.ts +22 -0
- package/dist/ui/Radio/RadioGroup.docs.svelte +70 -0
- package/dist/ui/Radio/RadioGroup.docs.svelte.d.ts +27 -0
- package/dist/ui/Radio/RadioGroup.svelte +98 -0
- package/dist/ui/Radio/RadioGroup.svelte.d.ts +27 -0
- package/dist/ui/Radio/index.d.ts +2 -0
- package/dist/ui/Radio/index.js +2 -0
- package/dist/ui/SegmentControl/SegmentControl.docs.svelte +54 -0
- package/dist/ui/SegmentControl/SegmentControl.docs.svelte.d.ts +25 -0
- package/dist/ui/SegmentControl/SegmentControl.svelte +120 -0
- package/dist/ui/SegmentControl/SegmentControl.svelte.d.ts +18 -0
- package/dist/ui/SegmentControl/index.d.ts +1 -0
- package/dist/ui/SegmentControl/index.js +1 -0
- package/dist/ui/Stack/Stack.docs.svelte +63 -0
- package/dist/ui/Stack/Stack.docs.svelte.d.ts +26 -0
- package/dist/ui/Stack/Stack.svelte +45 -0
- package/dist/ui/Stack/Stack.svelte.d.ts +19 -0
- package/dist/ui/Stack/index.d.ts +1 -0
- package/dist/ui/Stack/index.js +1 -0
- package/dist/ui/Table/Body.svelte +17 -0
- package/dist/ui/Table/Body.svelte.d.ts +11 -0
- package/dist/ui/Table/Caption.svelte +17 -0
- package/dist/ui/Table/Caption.svelte.d.ts +11 -0
- package/dist/ui/Table/Cell.svelte +24 -0
- package/dist/ui/Table/Cell.svelte.d.ts +15 -0
- package/dist/ui/Table/Foot.svelte +17 -0
- package/dist/ui/Table/Foot.svelte.d.ts +11 -0
- package/dist/ui/Table/Head.svelte +17 -0
- package/dist/ui/Table/Head.svelte.d.ts +11 -0
- package/dist/ui/Table/Header.svelte +27 -0
- package/dist/ui/Table/Header.svelte.d.ts +17 -0
- package/dist/ui/Table/Row.svelte +19 -0
- package/dist/ui/Table/Row.svelte.d.ts +13 -0
- package/dist/ui/Table/Table.docs.svelte +197 -0
- package/dist/ui/Table/Table.docs.svelte.d.ts +28 -0
- package/dist/ui/Table/Table.svelte +140 -0
- package/dist/ui/Table/Table.svelte.d.ts +27 -0
- package/dist/ui/Table/index.js +10 -0
- package/dist/ui/css/colors.css +377 -0
- package/dist/ui/css/global.css +10 -0
- package/dist/ui/index.d.ts +12 -0
- package/dist/ui/index.js +12 -0
- package/dist/virtual-sdocs.d.ts +20 -0
- package/dist/vite-plugin.d.ts +18 -0
- package/dist/vite-plugin.js +206 -0
- package/dist/vite.d.ts +2 -0
- package/dist/vite.js +2 -0
- package/package.json +76 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import Badge from './Badge.svelte';
|
|
3
|
+
import type { DocMeta } from '../../types.js';
|
|
4
|
+
|
|
5
|
+
export const meta: DocMeta = {
|
|
6
|
+
title: 'Badge',
|
|
7
|
+
component: Badge,
|
|
8
|
+
args: {
|
|
9
|
+
label: 'Badge',
|
|
10
|
+
size: 'm',
|
|
11
|
+
radius: 4
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { Default, Sizes, Colors, Rounded };
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
{#snippet Default(args: any)}
|
|
19
|
+
<Badge {...args} />
|
|
20
|
+
{/snippet}
|
|
21
|
+
|
|
22
|
+
{#snippet Sizes()}
|
|
23
|
+
<div style="display: flex; align-items: center; gap: 8px;">
|
|
24
|
+
<Badge label="xs" size="xs" />
|
|
25
|
+
<Badge label="s" size="s" />
|
|
26
|
+
<Badge label="m" size="m" />
|
|
27
|
+
<Badge label="l" size="l" />
|
|
28
|
+
</div>
|
|
29
|
+
{/snippet}
|
|
30
|
+
|
|
31
|
+
{#snippet Colors()}
|
|
32
|
+
<div style="display: flex; align-items: center; gap: 8px;">
|
|
33
|
+
<Badge label="string" --Badge-bg="var(--pink-50)" --Badge-color="var(--pink-600)" />
|
|
34
|
+
<Badge label="number" --Badge-bg="var(--sky-50)" --Badge-color="var(--sky-600)" />
|
|
35
|
+
<Badge label="boolean" --Badge-bg="var(--success-50)" --Badge-color="var(--success-600)" />
|
|
36
|
+
<Badge label="any" />
|
|
37
|
+
</div>
|
|
38
|
+
{/snippet}
|
|
39
|
+
|
|
40
|
+
{#snippet Rounded()}
|
|
41
|
+
<div style="display: flex; align-items: center; gap: 8px;">
|
|
42
|
+
<Badge label="default" radius={4} --Badge-bg="var(--pink-50)" --Badge-color="var(--pink-600)" />
|
|
43
|
+
<Badge label="rounded" radius={8} --Badge-bg="var(--sky-50)" --Badge-color="var(--sky-600)" />
|
|
44
|
+
<Badge label="pill" radius={100} --Badge-bg="var(--success-50)" --Badge-color="var(--success-600)" />
|
|
45
|
+
</div>
|
|
46
|
+
{/snippet}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Badge from './Badge.svelte';
|
|
2
|
+
import type { DocMeta } from '../../types.js';
|
|
3
|
+
declare const Default: (args: any) => ReturnType<import("svelte").Snippet>;
|
|
4
|
+
declare const Sizes: () => ReturnType<import("svelte").Snippet>;
|
|
5
|
+
declare const Colors: () => ReturnType<import("svelte").Snippet>;
|
|
6
|
+
declare const Rounded: () => ReturnType<import("svelte").Snippet>;
|
|
7
|
+
export declare const meta: DocMeta;
|
|
8
|
+
export { Default, Sizes, Colors, Rounded };
|
|
9
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
10
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
11
|
+
$$bindings?: Bindings;
|
|
12
|
+
} & Exports;
|
|
13
|
+
(internal: unknown, props: {
|
|
14
|
+
$$events?: Events;
|
|
15
|
+
$$slots?: Slots;
|
|
16
|
+
}): Exports & {
|
|
17
|
+
$set?: any;
|
|
18
|
+
$on?: any;
|
|
19
|
+
};
|
|
20
|
+
z_$$bindings?: Bindings;
|
|
21
|
+
}
|
|
22
|
+
declare const Badge: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
23
|
+
[evt: string]: CustomEvent<any>;
|
|
24
|
+
}, {}, {}, string>;
|
|
25
|
+
type Badge = InstanceType<typeof Badge>;
|
|
26
|
+
export default Badge;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* A small inline label for displaying metadata like types, status, or categories.
|
|
4
|
+
*
|
|
5
|
+
* @cssvar {color} --Badge-bg - Background color (default: var(--base-100))
|
|
6
|
+
* @cssvar {color} --Badge-color - Text color (default: var(--base-600))
|
|
7
|
+
*/
|
|
8
|
+
interface Props {
|
|
9
|
+
/** Text to display */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Size variant */
|
|
12
|
+
size?: 'xs' | 's' | 'm' | 'l';
|
|
13
|
+
/** Border radius in pixels */
|
|
14
|
+
radius?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let { label = 'label', size = 'm', radius = 4 }: Props = $props();
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<span class="Badge {size}" style:border-radius="{radius}px">
|
|
21
|
+
{label}
|
|
22
|
+
</span>
|
|
23
|
+
|
|
24
|
+
<style>
|
|
25
|
+
.Badge {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
font-family: var(--font-mono);
|
|
29
|
+
font-weight: 500;
|
|
30
|
+
white-space: nowrap;
|
|
31
|
+
background: var(--Badge-bg, var(--base-100));
|
|
32
|
+
color: var(--Badge-color, var(--base-600));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Size variants */
|
|
36
|
+
.xs {
|
|
37
|
+
height: 18px;
|
|
38
|
+
padding: 0 5px;
|
|
39
|
+
font-size: 10px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.s {
|
|
43
|
+
height: 20px;
|
|
44
|
+
padding: 0 6px;
|
|
45
|
+
font-size: 11px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.m {
|
|
49
|
+
height: 22px;
|
|
50
|
+
padding: 0 7px;
|
|
51
|
+
font-size: 12px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.l {
|
|
55
|
+
height: 26px;
|
|
56
|
+
padding: 0 9px;
|
|
57
|
+
font-size: 13px;
|
|
58
|
+
}
|
|
59
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small inline label for displaying metadata like types, status, or categories.
|
|
3
|
+
*
|
|
4
|
+
* @cssvar {color} --Badge-bg - Background color (default: var(--base-100))
|
|
5
|
+
* @cssvar {color} --Badge-color - Text color (default: var(--base-600))
|
|
6
|
+
*/
|
|
7
|
+
interface Props {
|
|
8
|
+
/** Text to display */
|
|
9
|
+
label: string;
|
|
10
|
+
/** Size variant */
|
|
11
|
+
size?: 'xs' | 's' | 'm' | 'l';
|
|
12
|
+
/** Border radius in pixels */
|
|
13
|
+
radius?: number;
|
|
14
|
+
}
|
|
15
|
+
declare const Badge: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type Badge = ReturnType<typeof Badge>;
|
|
17
|
+
export default Badge;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Badge } from './Badge.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Badge } from './Badge.svelte';
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import Checkbox from './Checkbox.svelte';
|
|
3
|
+
import type { DocMeta } from '../../types.js';
|
|
4
|
+
|
|
5
|
+
export const meta: DocMeta = {
|
|
6
|
+
title: 'Checkbox',
|
|
7
|
+
component: Checkbox,
|
|
8
|
+
args: {
|
|
9
|
+
checked: false,
|
|
10
|
+
label: 'Accept terms and conditions',
|
|
11
|
+
size: 'm',
|
|
12
|
+
disabled: false
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { Default, Sizes, WithoutLabel, Disabled, Checked };
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
{#snippet Default(args: any)}
|
|
20
|
+
<Checkbox {...args} />
|
|
21
|
+
{/snippet}
|
|
22
|
+
|
|
23
|
+
{#snippet Sizes()}
|
|
24
|
+
<div style="display: flex; flex-direction: column; gap: 12px;">
|
|
25
|
+
<Checkbox label="Extra small" size="xs" />
|
|
26
|
+
<Checkbox label="Small" size="s" />
|
|
27
|
+
<Checkbox label="Medium (default)" size="m" />
|
|
28
|
+
<Checkbox label="Large" size="l" />
|
|
29
|
+
</div>
|
|
30
|
+
{/snippet}
|
|
31
|
+
|
|
32
|
+
{#snippet WithoutLabel()}
|
|
33
|
+
<div style="display: flex; gap: 12px;">
|
|
34
|
+
<Checkbox size="m" />
|
|
35
|
+
<Checkbox size="m" checked />
|
|
36
|
+
</div>
|
|
37
|
+
{/snippet}
|
|
38
|
+
|
|
39
|
+
{#snippet Disabled()}
|
|
40
|
+
<div style="display: flex; flex-direction: column; gap: 12px;">
|
|
41
|
+
<Checkbox label="Disabled unchecked" disabled />
|
|
42
|
+
<Checkbox label="Disabled checked" checked disabled />
|
|
43
|
+
</div>
|
|
44
|
+
{/snippet}
|
|
45
|
+
|
|
46
|
+
{#snippet Checked()}
|
|
47
|
+
<div style="display: flex; flex-direction: column; gap: 12px;">
|
|
48
|
+
<Checkbox label="Remember me" checked />
|
|
49
|
+
<Checkbox label="Subscribe to newsletter" checked />
|
|
50
|
+
</div>
|
|
51
|
+
{/snippet}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import Checkbox from './Checkbox.svelte';
|
|
2
|
+
import type { DocMeta } from '../../types.js';
|
|
3
|
+
declare const Default: (args: any) => ReturnType<import("svelte").Snippet>;
|
|
4
|
+
declare const Sizes: () => ReturnType<import("svelte").Snippet>;
|
|
5
|
+
declare const WithoutLabel: () => ReturnType<import("svelte").Snippet>;
|
|
6
|
+
declare const Disabled: () => ReturnType<import("svelte").Snippet>;
|
|
7
|
+
declare const Checked: () => ReturnType<import("svelte").Snippet>;
|
|
8
|
+
export declare const meta: DocMeta;
|
|
9
|
+
export { Default, Sizes, WithoutLabel, Disabled, Checked };
|
|
10
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
11
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
12
|
+
$$bindings?: Bindings;
|
|
13
|
+
} & Exports;
|
|
14
|
+
(internal: unknown, props: {
|
|
15
|
+
$$events?: Events;
|
|
16
|
+
$$slots?: Slots;
|
|
17
|
+
}): Exports & {
|
|
18
|
+
$set?: any;
|
|
19
|
+
$on?: any;
|
|
20
|
+
};
|
|
21
|
+
z_$$bindings?: Bindings;
|
|
22
|
+
}
|
|
23
|
+
declare const Checkbox: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
24
|
+
[evt: string]: CustomEvent<any>;
|
|
25
|
+
}, {}, {}, string>;
|
|
26
|
+
type Checkbox = InstanceType<typeof Checkbox>;
|
|
27
|
+
export default Checkbox;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* A customizable checkbox component with support for labels, sizes, and disabled states.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
/** Whether the checkbox is checked */
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
/** Label text */
|
|
9
|
+
label?: string;
|
|
10
|
+
/** Size variant */
|
|
11
|
+
size?: 'xs' | 's' | 'm' | 'l';
|
|
12
|
+
/** Disable the checkbox */
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
/** Callback when checked state changes */
|
|
15
|
+
onchange?: (checked: boolean) => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
checked = false,
|
|
20
|
+
label,
|
|
21
|
+
size = 'm',
|
|
22
|
+
disabled = false,
|
|
23
|
+
onchange
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
26
|
+
let isChecked = $state(checked);
|
|
27
|
+
|
|
28
|
+
// Sync with external changes
|
|
29
|
+
$effect(() => {
|
|
30
|
+
isChecked = checked;
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
function handleClick() {
|
|
34
|
+
if (disabled) return;
|
|
35
|
+
isChecked = !isChecked;
|
|
36
|
+
onchange?.(isChecked);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function handleKeyDown(e: KeyboardEvent) {
|
|
40
|
+
if (e.key === ' ' || e.key === 'Enter') {
|
|
41
|
+
e.preventDefault();
|
|
42
|
+
handleClick();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Size-based dimensions (matching Radio pattern)
|
|
47
|
+
const sizes = {
|
|
48
|
+
xs: { box: 14, mark: 6, gap: 6 },
|
|
49
|
+
s: { box: 16, mark: 7, gap: 8 },
|
|
50
|
+
m: { box: 18, mark: 8, gap: 8 },
|
|
51
|
+
l: { box: 22, mark: 10, gap: 10 }
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
let sizeConfig = $derived(sizes[size]);
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<button
|
|
58
|
+
type="button"
|
|
59
|
+
class="Checkbox {size}"
|
|
60
|
+
class:checked={isChecked}
|
|
61
|
+
class:disabled
|
|
62
|
+
{disabled}
|
|
63
|
+
role="checkbox"
|
|
64
|
+
aria-checked={isChecked}
|
|
65
|
+
onclick={handleClick}
|
|
66
|
+
onkeydown={handleKeyDown}
|
|
67
|
+
style="--box-size: {sizeConfig.box}px; --mark-size: {sizeConfig.mark}px; --gap: {sizeConfig.gap}px;"
|
|
68
|
+
>
|
|
69
|
+
<span class="Checkbox-box">
|
|
70
|
+
<span class="Checkbox-mark"></span>
|
|
71
|
+
</span>
|
|
72
|
+
{#if label}
|
|
73
|
+
<span class="Checkbox-label">{label}</span>
|
|
74
|
+
{/if}
|
|
75
|
+
</button>
|
|
76
|
+
|
|
77
|
+
<style>
|
|
78
|
+
.Checkbox {
|
|
79
|
+
display: inline-flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
gap: var(--gap);
|
|
82
|
+
background: none;
|
|
83
|
+
border: none;
|
|
84
|
+
padding: 0;
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
font-family: var(--font-sans);
|
|
87
|
+
color: var(--color-text);
|
|
88
|
+
transition: opacity 0.15s ease;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.Checkbox:focus-visible {
|
|
92
|
+
outline: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.Checkbox:focus-visible .Checkbox-box {
|
|
96
|
+
box-shadow: 0 0 0 2px var(--action-200);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.Checkbox.disabled {
|
|
100
|
+
opacity: 0.5;
|
|
101
|
+
cursor: not-allowed;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.Checkbox-box {
|
|
105
|
+
display: flex;
|
|
106
|
+
align-items: center;
|
|
107
|
+
justify-content: center;
|
|
108
|
+
width: var(--box-size);
|
|
109
|
+
height: var(--box-size);
|
|
110
|
+
border-radius: 4px;
|
|
111
|
+
border: 1.5px solid var(--base-300);
|
|
112
|
+
background: var(--base-0);
|
|
113
|
+
transition: all 0.15s ease;
|
|
114
|
+
flex-shrink: 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.Checkbox:not(.disabled):hover .Checkbox-box {
|
|
118
|
+
border-color: var(--base-400);
|
|
119
|
+
background: var(--base-50);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.Checkbox.checked .Checkbox-box {
|
|
123
|
+
border-color: var(--action-500);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.Checkbox.checked:not(.disabled):hover .Checkbox-box {
|
|
127
|
+
border-color: var(--action-600);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.Checkbox-mark {
|
|
131
|
+
width: var(--mark-size);
|
|
132
|
+
height: var(--mark-size);
|
|
133
|
+
border-radius: 2px;
|
|
134
|
+
background: var(--action-500);
|
|
135
|
+
opacity: 0;
|
|
136
|
+
transform: scale(0);
|
|
137
|
+
transition: all 0.15s ease;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.Checkbox.checked .Checkbox-mark {
|
|
141
|
+
opacity: 1;
|
|
142
|
+
transform: scale(1);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.Checkbox.checked:not(.disabled):hover .Checkbox-mark {
|
|
146
|
+
background: var(--action-600);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.Checkbox-label {
|
|
150
|
+
user-select: none;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* Size-specific label font sizes */
|
|
154
|
+
.xs .Checkbox-label {
|
|
155
|
+
font-size: 11px;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.s .Checkbox-label {
|
|
159
|
+
font-size: 12px;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.m .Checkbox-label {
|
|
163
|
+
font-size: 13px;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.l .Checkbox-label {
|
|
167
|
+
font-size: 14px;
|
|
168
|
+
}
|
|
169
|
+
</style>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A customizable checkbox component with support for labels, sizes, and disabled states.
|
|
3
|
+
*/
|
|
4
|
+
interface Props {
|
|
5
|
+
/** Whether the checkbox is checked */
|
|
6
|
+
checked?: boolean;
|
|
7
|
+
/** Label text */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Size variant */
|
|
10
|
+
size?: 'xs' | 's' | 'm' | 'l';
|
|
11
|
+
/** Disable the checkbox */
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
/** Callback when checked state changes */
|
|
14
|
+
onchange?: (checked: boolean) => void;
|
|
15
|
+
}
|
|
16
|
+
declare const Checkbox: import("svelte").Component<Props, {}, "">;
|
|
17
|
+
type Checkbox = ReturnType<typeof Checkbox>;
|
|
18
|
+
export default Checkbox;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Checkbox } from './Checkbox.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Checkbox } from './Checkbox.svelte';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import CodeBlock from './CodeBlock.svelte';
|
|
3
|
+
import type { DocMeta } from '../../types.js';
|
|
4
|
+
|
|
5
|
+
export const meta: DocMeta = {
|
|
6
|
+
title: 'CodeBlock',
|
|
7
|
+
component: CodeBlock,
|
|
8
|
+
args: {
|
|
9
|
+
code: `function greet(name: string) {\n return \`Hello, \${name}!\`;\n}`
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { Default, Multiline };
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
{#snippet Default(args: any)}
|
|
17
|
+
<CodeBlock {...args} />
|
|
18
|
+
{/snippet}
|
|
19
|
+
|
|
20
|
+
{#snippet Multiline()}
|
|
21
|
+
<CodeBlock code={`export function formatDate(date: Date): string {
|
|
22
|
+
return date.toLocaleDateString('en-US', {
|
|
23
|
+
year: 'numeric',
|
|
24
|
+
month: 'long',
|
|
25
|
+
day: 'numeric'
|
|
26
|
+
});
|
|
27
|
+
}`} />
|
|
28
|
+
{/snippet}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import CodeBlock from './CodeBlock.svelte';
|
|
2
|
+
import type { DocMeta } from '../../types.js';
|
|
3
|
+
declare const Default: (args: any) => ReturnType<import("svelte").Snippet>;
|
|
4
|
+
declare const Multiline: () => ReturnType<import("svelte").Snippet>;
|
|
5
|
+
export declare const meta: DocMeta;
|
|
6
|
+
export { Default, Multiline };
|
|
7
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
8
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
9
|
+
$$bindings?: Bindings;
|
|
10
|
+
} & Exports;
|
|
11
|
+
(internal: unknown, props: {
|
|
12
|
+
$$events?: Events;
|
|
13
|
+
$$slots?: Slots;
|
|
14
|
+
}): Exports & {
|
|
15
|
+
$set?: any;
|
|
16
|
+
$on?: any;
|
|
17
|
+
};
|
|
18
|
+
z_$$bindings?: Bindings;
|
|
19
|
+
}
|
|
20
|
+
declare const CodeBlock: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
21
|
+
[evt: string]: CustomEvent<any>;
|
|
22
|
+
}, {}, {}, string>;
|
|
23
|
+
type CodeBlock = InstanceType<typeof CodeBlock>;
|
|
24
|
+
export default CodeBlock;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Copy from 'lucide-svelte/icons/copy';
|
|
3
|
+
import Check from 'lucide-svelte/icons/check';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
/** Code string to display */
|
|
7
|
+
code: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let { code }: Props = $props();
|
|
11
|
+
|
|
12
|
+
let copied = $state(false);
|
|
13
|
+
let copyTimeout: ReturnType<typeof setTimeout>;
|
|
14
|
+
|
|
15
|
+
async function copyCode() {
|
|
16
|
+
try {
|
|
17
|
+
await navigator.clipboard.writeText(code);
|
|
18
|
+
copied = true;
|
|
19
|
+
clearTimeout(copyTimeout);
|
|
20
|
+
copyTimeout = setTimeout(() => {
|
|
21
|
+
copied = false;
|
|
22
|
+
}, 2000);
|
|
23
|
+
} catch {
|
|
24
|
+
const textarea = document.createElement('textarea');
|
|
25
|
+
textarea.value = code;
|
|
26
|
+
document.body.appendChild(textarea);
|
|
27
|
+
textarea.select();
|
|
28
|
+
document.execCommand('copy');
|
|
29
|
+
document.body.removeChild(textarea);
|
|
30
|
+
copied = true;
|
|
31
|
+
clearTimeout(copyTimeout);
|
|
32
|
+
copyTimeout = setTimeout(() => {
|
|
33
|
+
copied = false;
|
|
34
|
+
}, 2000);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<div class="CodeBlock">
|
|
40
|
+
<button type="button" class="CodeBlock-copy" onclick={copyCode} class:copied>
|
|
41
|
+
{#if copied}
|
|
42
|
+
<Check size={14} strokeWidth={2} />
|
|
43
|
+
{:else}
|
|
44
|
+
<Copy size={14} strokeWidth={1.75} />
|
|
45
|
+
{/if}
|
|
46
|
+
</button>
|
|
47
|
+
<pre><code>{code}</code></pre>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<style>
|
|
51
|
+
.CodeBlock {
|
|
52
|
+
position: relative;
|
|
53
|
+
width: 100%;
|
|
54
|
+
box-sizing: border-box;
|
|
55
|
+
background: var(--base-800);
|
|
56
|
+
border-radius: 0;
|
|
57
|
+
overflow: hidden;
|
|
58
|
+
border: none;
|
|
59
|
+
padding: 12px 16px;
|
|
60
|
+
padding-right: 48px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.CodeBlock-copy {
|
|
64
|
+
position: absolute;
|
|
65
|
+
top: 8px;
|
|
66
|
+
right: 8px;
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
justify-content: center;
|
|
70
|
+
width: 28px;
|
|
71
|
+
height: 28px;
|
|
72
|
+
background: var(--base-800);
|
|
73
|
+
border: none;
|
|
74
|
+
border-radius: 6px;
|
|
75
|
+
color: var(--base-400);
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
transition: all 0.15s ease;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.CodeBlock-copy:hover {
|
|
81
|
+
background: var(--base-700);
|
|
82
|
+
color: var(--base-200);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.CodeBlock-copy.copied {
|
|
86
|
+
color: var(--success-400);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
pre {
|
|
90
|
+
margin: 0;
|
|
91
|
+
overflow-x: auto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
code {
|
|
95
|
+
font-family: var(--font-mono);
|
|
96
|
+
font-size: 13px;
|
|
97
|
+
line-height: 1.2;
|
|
98
|
+
color: var(--base-50);
|
|
99
|
+
white-space: pre;
|
|
100
|
+
}
|
|
101
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as CodeBlock } from './CodeBlock.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as CodeBlock } from './CodeBlock.svelte';
|