twintrinsic 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/LICENSE +674 -0
- package/README.md +150 -0
- package/dist/App/App.svelte +54 -0
- package/dist/App/App.svelte.d.ts +65 -0
- package/dist/Section.svelte +25 -0
- package/dist/Section.svelte.d.ts +34 -0
- package/dist/actions/clickOutside.d.ts +9 -0
- package/dist/actions/clickOutside.js +19 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.js +1 -0
- package/dist/components/Accordion/Accordion.svelte +75 -0
- package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
- package/dist/components/Accordion/AccordionItem.svelte +150 -0
- package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
- package/dist/components/App/App.story.md +8 -0
- package/dist/components/App/App.story.svelte +170 -0
- package/dist/components/App/App.story.svelte.d.ts +22 -0
- package/dist/components/App/App.svelte +77 -0
- package/dist/components/App/App.svelte.d.ts +66 -0
- package/dist/components/App/Split.svelte +346 -0
- package/dist/components/App/Split.svelte.d.ts +54 -0
- package/dist/components/App/index.d.ts +2 -0
- package/dist/components/App/index.js +3 -0
- package/dist/components/AppHeader/AppHeader.svelte +439 -0
- package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
- package/dist/components/Avatar/Avatar.svelte +300 -0
- package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
- package/dist/components/Avatar/AvatarGroup.svelte +185 -0
- package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
- package/dist/components/Badge/Badge.svelte +186 -0
- package/dist/components/Badge/Badge.svelte.d.ts +51 -0
- package/dist/components/BottomBar/BottomBar.svelte +146 -0
- package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
- package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
- package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
- package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
- package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
- package/dist/components/Button/Button.svelte +252 -0
- package/dist/components/Button/Button.svelte.d.ts +80 -0
- package/dist/components/Button/ButtonGroup.svelte +127 -0
- package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
- package/dist/components/Card/Card.svelte +152 -0
- package/dist/components/Card/Card.svelte.d.ts +55 -0
- package/dist/components/Carousel/Carousel.svelte +461 -0
- package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
- package/dist/components/Carousel/CarouselItem.svelte +149 -0
- package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
- package/dist/components/Chip/Chip.svelte +288 -0
- package/dist/components/Chip/Chip.svelte.d.ts +71 -0
- package/dist/components/Chip/ChipGroup.svelte +190 -0
- package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
- package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
- package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
- package/dist/components/CodeBlock/index.d.ts +1 -0
- package/dist/components/CodeBlock/index.js +1 -0
- package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
- package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
- package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
- package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
- package/dist/components/Combobox/Combobox.svelte +279 -0
- package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
- package/dist/components/Container/Container.svelte +45 -0
- package/dist/components/Container/Container.svelte.d.ts +36 -0
- package/dist/components/DataTable/DataTable.svelte +879 -0
- package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
- package/dist/components/Form/AutoComplete.svelte +357 -0
- package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
- package/dist/components/Form/Calendar.svelte +429 -0
- package/dist/components/Form/Calendar.svelte.d.ts +53 -0
- package/dist/components/Form/Checkbox.svelte +196 -0
- package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
- package/dist/components/Form/ColorPicker.svelte +396 -0
- package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
- package/dist/components/Form/Combobox.svelte +645 -0
- package/dist/components/Form/Combobox.svelte.d.ts +93 -0
- package/dist/components/Form/Dropdown.svelte +773 -0
- package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
- package/dist/components/Form/FileUpload.svelte +796 -0
- package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
- package/dist/components/Form/FloatLabel.svelte +245 -0
- package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
- package/dist/components/Form/Form.svelte +281 -0
- package/dist/components/Form/Form.svelte.d.ts +54 -0
- package/dist/components/Form/FormField.svelte +218 -0
- package/dist/components/Form/FormField.svelte.d.ts +47 -0
- package/dist/components/Form/Input.svelte +340 -0
- package/dist/components/Form/Input.svelte.d.ts +79 -0
- package/dist/components/Form/InputSwitch.svelte +189 -0
- package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
- package/dist/components/Form/InvalidState.svelte +97 -0
- package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
- package/dist/components/Form/Knob.svelte +537 -0
- package/dist/components/Form/Knob.svelte.d.ts +78 -0
- package/dist/components/Form/ListInput.svelte +469 -0
- package/dist/components/Form/ListInput.svelte.d.ts +70 -0
- package/dist/components/Form/Listbox.svelte +513 -0
- package/dist/components/Form/Listbox.svelte.d.ts +74 -0
- package/dist/components/Form/NumberInput.svelte +452 -0
- package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
- package/dist/components/Form/Radio.svelte +192 -0
- package/dist/components/Form/Radio.svelte.d.ts +53 -0
- package/dist/components/Form/RadioGroup.svelte +155 -0
- package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
- package/dist/components/Form/Rating.svelte +380 -0
- package/dist/components/Form/Rating.svelte.d.ts +64 -0
- package/dist/components/Form/Select.svelte +436 -0
- package/dist/components/Form/Select.svelte.d.ts +49 -0
- package/dist/components/Form/SelectGroup.svelte +34 -0
- package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
- package/dist/components/Form/Slider.svelte +622 -0
- package/dist/components/Form/Slider.svelte.d.ts +73 -0
- package/dist/components/Form/Switch.svelte +192 -0
- package/dist/components/Form/Switch.svelte.d.ts +46 -0
- package/dist/components/Form/TextInput.svelte +274 -0
- package/dist/components/Form/TextInput.svelte.d.ts +74 -0
- package/dist/components/Form/Textarea.svelte +207 -0
- package/dist/components/Form/Textarea.svelte.d.ts +62 -0
- package/dist/components/Icon/Icon.svelte +140 -0
- package/dist/components/Icon/Icon.svelte.d.ts +25 -0
- package/dist/components/Icon/index.d.ts +1 -0
- package/dist/components/Icon/index.js +1 -0
- package/dist/components/Lazy/Lazy.svelte +158 -0
- package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
- package/dist/components/Masonry/Masonry.svelte +299 -0
- package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
- package/dist/components/Menu/Menu/Menu.svelte +65 -0
- package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
- package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
- package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
- package/dist/components/Modal/Modal.svelte +334 -0
- package/dist/components/Modal/Modal.svelte.d.ts +55 -0
- package/dist/components/Panel/Card.svelte +141 -0
- package/dist/components/Panel/Card.svelte.d.ts +52 -0
- package/dist/components/Panel/Hero/Hero.story.md +9 -0
- package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
- package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
- package/dist/components/Panel/Hero/Hero.svelte +24 -0
- package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
- package/dist/components/Panel/LazyPanel.svelte +110 -0
- package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
- package/dist/components/Panel/Panel.svelte +205 -0
- package/dist/components/Panel/Panel.svelte.d.ts +23 -0
- package/dist/components/Progress/Progress.svelte +220 -0
- package/dist/components/Progress/Progress.svelte.d.ts +61 -0
- package/dist/components/Separator/Separator.svelte +109 -0
- package/dist/components/Separator/Separator.svelte.d.ts +35 -0
- package/dist/components/Sidebar/Sidebar.svelte +213 -0
- package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
- package/dist/components/Skeleton/Skeleton.svelte +170 -0
- package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
- package/dist/components/Stepper/Stepper.svelte +111 -0
- package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
- package/dist/components/Stepper/StepperStep.svelte +369 -0
- package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
- package/dist/components/Table/Table.svelte +167 -0
- package/dist/components/Table/Table.svelte.d.ts +56 -0
- package/dist/components/Table/TableBody.svelte +41 -0
- package/dist/components/Table/TableBody.svelte.d.ts +33 -0
- package/dist/components/Table/TableCell.svelte +76 -0
- package/dist/components/Table/TableCell.svelte.d.ts +36 -0
- package/dist/components/Table/TableHead.svelte +41 -0
- package/dist/components/Table/TableHead.svelte.d.ts +32 -0
- package/dist/components/Table/TableHeader.svelte +148 -0
- package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
- package/dist/components/Table/TableRow.svelte +99 -0
- package/dist/components/Table/TableRow.svelte.d.ts +40 -0
- package/dist/components/Tabs/Tab.svelte +145 -0
- package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
- package/dist/components/Tabs/TabList.svelte +60 -0
- package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
- package/dist/components/Tabs/TabPanel.svelte +118 -0
- package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
- package/dist/components/Tabs/Tabs.svelte +287 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
- package/dist/components/Tag/Tag.svelte +260 -0
- package/dist/components/Tag/Tag.svelte.d.ts +54 -0
- package/dist/components/Tag/TagGroup.svelte +147 -0
- package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
- package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
- package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
- package/dist/components/Timeline/Timeline.svelte +144 -0
- package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
- package/dist/components/Timeline/TimelineItem.svelte +391 -0
- package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
- package/dist/components/Toast/Toast.svelte +313 -0
- package/dist/components/Toast/Toast.svelte.d.ts +44 -0
- package/dist/components/Toast/toastStore.d.ts +40 -0
- package/dist/components/Toast/toastStore.js +293 -0
- package/dist/components/Tooltip/Tooltip.svelte +282 -0
- package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
- package/dist/components/Tree/Tree.svelte +129 -0
- package/dist/components/Tree/Tree.svelte.d.ts +61 -0
- package/dist/components/Tree/TreeNode.svelte +332 -0
- package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
- package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
- package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
- package/dist/components/icons/twintrinsic-source.svg +73 -0
- package/dist/components/icons/twintrinsic.svg +38 -0
- package/dist/docs/EventsTable.svelte +86 -0
- package/dist/docs/EventsTable.svelte.d.ts +27 -0
- package/dist/docs/PropsTable.svelte +103 -0
- package/dist/docs/PropsTable.svelte.d.ts +28 -0
- package/dist/docs/index.d.ts +2 -0
- package/dist/docs/index.js +2 -0
- package/dist/helpers/detectLanguage.d.ts +6 -0
- package/dist/helpers/detectLanguage.js +60 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +1 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +94 -0
- package/dist/twintrinsic.css +347 -0
- package/package.json +98 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
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> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: Props & {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
|
|
15
|
+
default: any;
|
|
16
|
+
} ? Props extends Record<string, never> ? any : {
|
|
17
|
+
children?: any;
|
|
18
|
+
} : {});
|
|
19
|
+
declare const Hero: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
|
|
20
|
+
[x: string]: any;
|
|
21
|
+
heading?: string | null | undefined;
|
|
22
|
+
type?: TypeLevel;
|
|
23
|
+
class?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
default: {};
|
|
26
|
+
}>, {
|
|
27
|
+
[evt: string]: CustomEvent<any>;
|
|
28
|
+
}, {
|
|
29
|
+
default: {};
|
|
30
|
+
}, {}, string>;
|
|
31
|
+
type Hero = InstanceType<typeof Hero>;
|
|
32
|
+
export default Hero;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
LazyPanel - A Panel component that only loads its content when it becomes visible in the viewport.
|
|
4
|
+
Built on top of the Panel component with intersection observer for lazy loading.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<LazyPanel>
|
|
9
|
+
<svelte:fragment slot="header">Lazy Content</svelte:fragment>
|
|
10
|
+
<svelte:fragment slot="loading">Loading...</svelte:fragment>
|
|
11
|
+
<ExpensiveComponent />
|
|
12
|
+
</LazyPanel>
|
|
13
|
+
```
|
|
14
|
+
-->
|
|
15
|
+
<script>
|
|
16
|
+
import { onMount } from "svelte"
|
|
17
|
+
import Panel from "./Panel.svelte"
|
|
18
|
+
|
|
19
|
+
const {
|
|
20
|
+
/** @type {boolean} - Whether the panel is expanded */
|
|
21
|
+
expanded = true,
|
|
22
|
+
|
|
23
|
+
/** @type {string} - Additional CSS classes */
|
|
24
|
+
class: className = "",
|
|
25
|
+
|
|
26
|
+
/** @type {string} - HTML id for accessibility */
|
|
27
|
+
id = crypto.randomUUID(),
|
|
28
|
+
|
|
29
|
+
/** @type {string} - ARIA label */
|
|
30
|
+
ariaLabel,
|
|
31
|
+
|
|
32
|
+
/** @type {boolean} - Whether to disable the panel controls */
|
|
33
|
+
disabled = false,
|
|
34
|
+
|
|
35
|
+
/** @type {boolean} - Whether to show a border */
|
|
36
|
+
bordered = true,
|
|
37
|
+
|
|
38
|
+
/** @type {boolean} - Whether to show the expand/collapse icon */
|
|
39
|
+
showIcon = true,
|
|
40
|
+
|
|
41
|
+
/** @type {number} - Root margin for intersection observer */
|
|
42
|
+
rootMargin = "50px",
|
|
43
|
+
|
|
44
|
+
/** @type {number} - Threshold for intersection observer */
|
|
45
|
+
threshold = 0,
|
|
46
|
+
|
|
47
|
+
children,
|
|
48
|
+
header,
|
|
49
|
+
loading,
|
|
50
|
+
} = $props()
|
|
51
|
+
|
|
52
|
+
let isVisible = $state(false)
|
|
53
|
+
let panelElement
|
|
54
|
+
let observer
|
|
55
|
+
|
|
56
|
+
onMount(() => {
|
|
57
|
+
observer = new IntersectionObserver(
|
|
58
|
+
(entries) => {
|
|
59
|
+
const [entry] = entries
|
|
60
|
+
if (entry.isIntersecting) {
|
|
61
|
+
isVisible = true
|
|
62
|
+
// Once visible, disconnect the observer
|
|
63
|
+
observer.disconnect()
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
rootMargin,
|
|
68
|
+
threshold,
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
if (panelElement) {
|
|
73
|
+
observer.observe(panelElement)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return () => {
|
|
77
|
+
if (observer) {
|
|
78
|
+
observer.disconnect()
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
</script>
|
|
83
|
+
|
|
84
|
+
<div bind:this={panelElement}>
|
|
85
|
+
<Panel
|
|
86
|
+
{expanded}
|
|
87
|
+
class={className}
|
|
88
|
+
{id}
|
|
89
|
+
{ariaLabel}
|
|
90
|
+
{disabled}
|
|
91
|
+
{bordered}
|
|
92
|
+
{showIcon}
|
|
93
|
+
>
|
|
94
|
+
<svelte:fragment slot="header">
|
|
95
|
+
{@render header?.()}
|
|
96
|
+
</svelte:fragment>
|
|
97
|
+
|
|
98
|
+
{#if isVisible}
|
|
99
|
+
{@render children?.()}
|
|
100
|
+
{:else if loading}
|
|
101
|
+
{@render loading()}
|
|
102
|
+
{:else}
|
|
103
|
+
Loading...
|
|
104
|
+
{/if}
|
|
105
|
+
</Panel>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<style>
|
|
109
|
+
@reference "../../twintrinsic.css";
|
|
110
|
+
</style>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export default LazyPanel;
|
|
2
|
+
type LazyPanel = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* LazyPanel - A Panel component that only loads its content when it becomes visible in the viewport.
|
|
8
|
+
* Built on top of the Panel component with intersection observer for lazy loading.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <LazyPanel>
|
|
13
|
+
* <svelte:fragment slot="header">Lazy Content</svelte:fragment>
|
|
14
|
+
* <svelte:fragment slot="loading">Loading...</svelte:fragment>
|
|
15
|
+
* <ExpensiveComponent />
|
|
16
|
+
* </LazyPanel>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare const LazyPanel: import("svelte").Component<{
|
|
20
|
+
expanded?: boolean;
|
|
21
|
+
class?: string;
|
|
22
|
+
id?: any;
|
|
23
|
+
ariaLabel: any;
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
bordered?: boolean;
|
|
26
|
+
showIcon?: boolean;
|
|
27
|
+
rootMargin?: string;
|
|
28
|
+
threshold?: number;
|
|
29
|
+
children: any;
|
|
30
|
+
header: any;
|
|
31
|
+
loading: any;
|
|
32
|
+
}, {}, "">;
|
|
33
|
+
type $$ComponentProps = {
|
|
34
|
+
expanded?: boolean;
|
|
35
|
+
class?: string;
|
|
36
|
+
id?: any;
|
|
37
|
+
ariaLabel: any;
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
bordered?: boolean;
|
|
40
|
+
showIcon?: boolean;
|
|
41
|
+
rootMargin?: string;
|
|
42
|
+
threshold?: number;
|
|
43
|
+
children: any;
|
|
44
|
+
header: any;
|
|
45
|
+
loading: any;
|
|
46
|
+
};
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Panel - A collapsible container with header and content sections.
|
|
4
|
+
Provides smooth animations and keyboard accessibility.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Panel>
|
|
9
|
+
<svelte:fragment slot="header">Panel Title</svelte:fragment>
|
|
10
|
+
Content goes here
|
|
11
|
+
</Panel>
|
|
12
|
+
|
|
13
|
+
<Panel expanded={false} class="custom-class">
|
|
14
|
+
<svelte:fragment slot="header">
|
|
15
|
+
<Icon name="settings" />
|
|
16
|
+
Settings
|
|
17
|
+
</svelte:fragment>
|
|
18
|
+
Settings content
|
|
19
|
+
</Panel>
|
|
20
|
+
```
|
|
21
|
+
-->
|
|
22
|
+
<script lang="ts">
|
|
23
|
+
import { slide } from "svelte/transition"
|
|
24
|
+
import type { Snippet } from "svelte"
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @slot header Renders custom header content for the panel button
|
|
28
|
+
* @slot default Provides the main panel body content
|
|
29
|
+
* @slot footer Displays supplemental content below the body (e.g., actions)
|
|
30
|
+
*/
|
|
31
|
+
type PanelProps = {
|
|
32
|
+
/** Whether the panel is expanded */
|
|
33
|
+
expanded?: boolean
|
|
34
|
+
/** Additional CSS classes */
|
|
35
|
+
class?: string
|
|
36
|
+
/** HTML id for accessibility */
|
|
37
|
+
id?: string
|
|
38
|
+
/** ARIA label for the header button */
|
|
39
|
+
ariaLabel?: string | null
|
|
40
|
+
/** Whether to disable the panel controls */
|
|
41
|
+
disabled?: boolean
|
|
42
|
+
/** Whether to show a border */
|
|
43
|
+
bordered?: boolean
|
|
44
|
+
/** Whether to show the expand/collapse icon */
|
|
45
|
+
showIcon?: boolean
|
|
46
|
+
/** Slot content for the panel body */
|
|
47
|
+
children?: Snippet | null
|
|
48
|
+
/** Slot content for the header */
|
|
49
|
+
header?: Snippet | null
|
|
50
|
+
/** Slot content rendered below the body */
|
|
51
|
+
footer?: Snippet | null
|
|
52
|
+
/** Callback invoked whenever the panel toggles expanded state */
|
|
53
|
+
ontoggle?: (payload: { expanded: boolean }) => void
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const {
|
|
57
|
+
/** @type {boolean} - Whether the panel is expanded */
|
|
58
|
+
expanded = true,
|
|
59
|
+
|
|
60
|
+
/** @type {string} - Additional CSS classes */
|
|
61
|
+
class: className = "",
|
|
62
|
+
|
|
63
|
+
/** @type {string} - HTML id for accessibility */
|
|
64
|
+
id = crypto.randomUUID(),
|
|
65
|
+
|
|
66
|
+
/** @type {string} - ARIA label for the header button */
|
|
67
|
+
ariaLabel = null,
|
|
68
|
+
|
|
69
|
+
/** @type {boolean} - Whether to disable the panel controls */
|
|
70
|
+
disabled = false,
|
|
71
|
+
|
|
72
|
+
/** @type {boolean} - Whether to show a border */
|
|
73
|
+
bordered = true,
|
|
74
|
+
|
|
75
|
+
/** @type {boolean} - Whether to show the expand/collapse icon */
|
|
76
|
+
showIcon = true,
|
|
77
|
+
|
|
78
|
+
children = null,
|
|
79
|
+
header = null,
|
|
80
|
+
footer = null,
|
|
81
|
+
} = $props() satisfies PanelProps
|
|
82
|
+
|
|
83
|
+
let isExpanded = $state(true)
|
|
84
|
+
|
|
85
|
+
// Internal state
|
|
86
|
+
let headerEl = $state<HTMLButtonElement | null>(null)
|
|
87
|
+
let contentEl = $state<HTMLDivElement | null>(null)
|
|
88
|
+
|
|
89
|
+
// Update expanded state when prop changes
|
|
90
|
+
$effect(() => {
|
|
91
|
+
isExpanded = expanded
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
// Handle toggle
|
|
95
|
+
function handleToggle() {
|
|
96
|
+
if (disabled) return
|
|
97
|
+
|
|
98
|
+
isExpanded = !isExpanded
|
|
99
|
+
ontoggle?.({ expanded: isExpanded })
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Handle keyboard navigation
|
|
103
|
+
function handleKeydown(event: KeyboardEvent) {
|
|
104
|
+
if (disabled) return
|
|
105
|
+
|
|
106
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
107
|
+
event.preventDefault()
|
|
108
|
+
handleToggle()
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
</script>
|
|
112
|
+
|
|
113
|
+
<div
|
|
114
|
+
class="panel {bordered ? 'border border-border dark:border-border rounded-lg' : ''} {className}"
|
|
115
|
+
class:disabled
|
|
116
|
+
>
|
|
117
|
+
<button
|
|
118
|
+
type="button"
|
|
119
|
+
id="{id}-header"
|
|
120
|
+
class="
|
|
121
|
+
w-full flex items-center justify-between
|
|
122
|
+
px-4 py-3
|
|
123
|
+
text-left
|
|
124
|
+
bg-surface dark:bg-surface
|
|
125
|
+
hover:bg-hover dark:hover:bg-hover
|
|
126
|
+
focus:outline-none focus:ring-2 focus:ring-focus-ring dark:focus:ring-focus-ring
|
|
127
|
+
disabled:opacity-50 disabled:cursor-not-allowed
|
|
128
|
+
text-text dark:text-text
|
|
129
|
+
{bordered ? 'rounded-t-lg' : 'rounded-lg'}
|
|
130
|
+
"
|
|
131
|
+
aria-expanded={isExpanded}
|
|
132
|
+
aria-controls="{id}-content"
|
|
133
|
+
aria-label={ariaLabel}
|
|
134
|
+
{disabled}
|
|
135
|
+
onclick={handleToggle}
|
|
136
|
+
onkeydown={handleKeydown}
|
|
137
|
+
bind:this={headerEl}
|
|
138
|
+
>
|
|
139
|
+
<div class="flex items-center gap-2">
|
|
140
|
+
{#if header}
|
|
141
|
+
{@render header()}
|
|
142
|
+
{:else}
|
|
143
|
+
Panel
|
|
144
|
+
{/if}
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
{#if showIcon}
|
|
148
|
+
<svg
|
|
149
|
+
class="w-5 h-5 transform transition-transform duration-200 text-muted dark:text-muted {isExpanded ? 'rotate-180' : ''}"
|
|
150
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
151
|
+
viewBox="0 0 20 20"
|
|
152
|
+
fill="currentColor"
|
|
153
|
+
aria-hidden="true"
|
|
154
|
+
>
|
|
155
|
+
<path
|
|
156
|
+
fill-rule="evenodd"
|
|
157
|
+
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
|
158
|
+
clip-rule="evenodd"
|
|
159
|
+
/>
|
|
160
|
+
</svg>
|
|
161
|
+
{/if}
|
|
162
|
+
</button>
|
|
163
|
+
|
|
164
|
+
{#if isExpanded}
|
|
165
|
+
<div
|
|
166
|
+
id="{id}-content"
|
|
167
|
+
class="px-4 py-3 bg-background dark:bg-background text-text dark:text-text"
|
|
168
|
+
role="region"
|
|
169
|
+
aria-labelledby="{id}-header"
|
|
170
|
+
transition:slide={{ duration: 200 }}
|
|
171
|
+
bind:this={contentEl}
|
|
172
|
+
class:rounded-b-lg={!footer && bordered}
|
|
173
|
+
>
|
|
174
|
+
{@render children?.()}
|
|
175
|
+
</div>
|
|
176
|
+
|
|
177
|
+
{#if footer}
|
|
178
|
+
<div
|
|
179
|
+
class="px-4 py-3 bg-background dark:bg-background text-muted dark:text-muted"
|
|
180
|
+
class:border-t={bordered}
|
|
181
|
+
class:border-border={bordered}
|
|
182
|
+
class:rounded-b-lg={bordered}
|
|
183
|
+
>
|
|
184
|
+
{@render footer()}
|
|
185
|
+
</div>
|
|
186
|
+
{/if}
|
|
187
|
+
{/if}
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<style>
|
|
191
|
+
@reference "../../twintrinsic.css";
|
|
192
|
+
/* Base styles that work with Tailwind */
|
|
193
|
+
.panel {
|
|
194
|
+
@apply overflow-hidden;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.panel.disabled {
|
|
198
|
+
@apply opacity-50 cursor-not-allowed;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* Ensure the content area has proper spacing when collapsed */
|
|
202
|
+
.panel :global(.svelte-collapse-content) {
|
|
203
|
+
@apply overflow-hidden;
|
|
204
|
+
}
|
|
205
|
+
</style>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Panel - A collapsible container with header and content sections.
|
|
3
|
+
* Provides smooth animations and keyboard accessibility.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* ```svelte
|
|
7
|
+
* <Panel>
|
|
8
|
+
* <svelte:fragment slot="header">Panel Title</svelte:fragment>
|
|
9
|
+
* Content goes here
|
|
10
|
+
* </Panel>
|
|
11
|
+
*
|
|
12
|
+
* <Panel expanded={false} class="custom-class">
|
|
13
|
+
* <svelte:fragment slot="header">
|
|
14
|
+
* <Icon name="settings" />
|
|
15
|
+
* Settings
|
|
16
|
+
* </svelte:fragment>
|
|
17
|
+
* Settings content
|
|
18
|
+
* </Panel>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare const Panel: import("svelte").Component<Record<string, never>, {}, "">;
|
|
22
|
+
type Panel = ReturnType<typeof Panel>;
|
|
23
|
+
export default Panel;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Progress - A component for displaying progress bars and indicators.
|
|
4
|
+
Provides consistent styling, accessibility features, and various display options.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Progress value={75} />
|
|
9
|
+
|
|
10
|
+
<Progress
|
|
11
|
+
value={42}
|
|
12
|
+
max={100}
|
|
13
|
+
variant="primary"
|
|
14
|
+
showValue
|
|
15
|
+
/>
|
|
16
|
+
|
|
17
|
+
<Progress
|
|
18
|
+
value={0.8}
|
|
19
|
+
max={1}
|
|
20
|
+
variant="success"
|
|
21
|
+
size="lg"
|
|
22
|
+
format={(v) => `${Math.round(v * 100)}%`}
|
|
23
|
+
/>
|
|
24
|
+
```
|
|
25
|
+
-->
|
|
26
|
+
<script>
|
|
27
|
+
const {
|
|
28
|
+
/** @type {string} - Additional CSS classes */
|
|
29
|
+
class: className = "",
|
|
30
|
+
|
|
31
|
+
/** @type {string} - HTML id for accessibility */
|
|
32
|
+
id = crypto.randomUUID(),
|
|
33
|
+
|
|
34
|
+
/** @type {number} - Current value */
|
|
35
|
+
value = 0,
|
|
36
|
+
|
|
37
|
+
/** @type {number} - Maximum value */
|
|
38
|
+
max = 100,
|
|
39
|
+
|
|
40
|
+
/** @type {number} - Minimum value */
|
|
41
|
+
min = 0,
|
|
42
|
+
|
|
43
|
+
/** @type {string} - Visual style variant */
|
|
44
|
+
variant = "primary",
|
|
45
|
+
|
|
46
|
+
/** @type {string} - Size of the progress bar (sm, md, lg) */
|
|
47
|
+
size = "md",
|
|
48
|
+
|
|
49
|
+
/** @type {boolean} - Whether to show the value as text */
|
|
50
|
+
showValue = false,
|
|
51
|
+
|
|
52
|
+
/** @type {boolean} - Whether to show the value inside the progress bar */
|
|
53
|
+
valueInside = false,
|
|
54
|
+
|
|
55
|
+
/** @type {boolean} - Whether to show a striped pattern */
|
|
56
|
+
striped = false,
|
|
57
|
+
|
|
58
|
+
/** @type {boolean} - Whether to animate the striped pattern */
|
|
59
|
+
animated = false,
|
|
60
|
+
|
|
61
|
+
/** @type {boolean} - Whether to show an indeterminate loading animation */
|
|
62
|
+
indeterminate = false,
|
|
63
|
+
|
|
64
|
+
/** @type {Function} - Custom function to format the displayed value */
|
|
65
|
+
format,
|
|
66
|
+
|
|
67
|
+
/** @type {string} - ARIA label for accessibility */
|
|
68
|
+
ariaLabel,
|
|
69
|
+
} = $props()
|
|
70
|
+
|
|
71
|
+
// Calculate percentage for width
|
|
72
|
+
const percentage = $derived(Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100)))
|
|
73
|
+
|
|
74
|
+
// Format value for display
|
|
75
|
+
const formattedValue = $derived(format ? format(value, min, max) : `${Math.round(percentage)}%`)
|
|
76
|
+
|
|
77
|
+
// Determine size classes
|
|
78
|
+
const sizeClasses = $derived(
|
|
79
|
+
{
|
|
80
|
+
sm: "h-1.5",
|
|
81
|
+
md: "h-2.5",
|
|
82
|
+
lg: "h-4",
|
|
83
|
+
}[size] || "h-2.5"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
// Determine text size classes
|
|
87
|
+
const textSizeClasses = $derived(
|
|
88
|
+
{
|
|
89
|
+
sm: "text-xs",
|
|
90
|
+
md: "text-sm",
|
|
91
|
+
lg: "text-base",
|
|
92
|
+
}[size] || "text-sm"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
// Determine variant classes
|
|
96
|
+
const variantClasses = $derived(
|
|
97
|
+
{
|
|
98
|
+
default: "bg-muted/20 dark:bg-muted/20",
|
|
99
|
+
primary: "bg-primary-500 dark:bg-primary-500",
|
|
100
|
+
secondary: "bg-secondary-500 dark:bg-secondary-500",
|
|
101
|
+
success: "bg-success-500 dark:bg-success-500",
|
|
102
|
+
warning: "bg-warning-500 dark:bg-warning-500",
|
|
103
|
+
error: "bg-error-500 dark:bg-error-500",
|
|
104
|
+
info: "bg-info-500 dark:bg-info-500",
|
|
105
|
+
}[variant] || "bg-primary-500 dark:bg-primary-500"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
// Determine track classes
|
|
109
|
+
const trackClasses = $derived("bg-muted/10 dark:bg-muted/10")
|
|
110
|
+
|
|
111
|
+
// Generate ARIA label
|
|
112
|
+
const progressAriaLabel = $derived(ariaLabel || `Progress: ${formattedValue}`)
|
|
113
|
+
</script>
|
|
114
|
+
|
|
115
|
+
<div
|
|
116
|
+
class="progress-container {className}"
|
|
117
|
+
>
|
|
118
|
+
{#if showValue && !valueInside}
|
|
119
|
+
<div class="progress-label {textSizeClasses}">
|
|
120
|
+
{formattedValue}
|
|
121
|
+
</div>
|
|
122
|
+
{/if}
|
|
123
|
+
|
|
124
|
+
<div
|
|
125
|
+
{id}
|
|
126
|
+
class="
|
|
127
|
+
progress
|
|
128
|
+
{sizeClasses}
|
|
129
|
+
{trackClasses}
|
|
130
|
+
"
|
|
131
|
+
role="progressbar"
|
|
132
|
+
aria-valuenow={indeterminate ? undefined : value}
|
|
133
|
+
aria-valuemin={min}
|
|
134
|
+
aria-valuemax={max}
|
|
135
|
+
aria-label={progressAriaLabel}
|
|
136
|
+
>
|
|
137
|
+
<div
|
|
138
|
+
class="
|
|
139
|
+
progress-bar
|
|
140
|
+
{variantClasses}
|
|
141
|
+
{striped ? 'progress-striped' : ''}
|
|
142
|
+
{animated ? 'progress-animated' : ''}
|
|
143
|
+
{indeterminate ? 'progress-indeterminate' : ''}
|
|
144
|
+
"
|
|
145
|
+
style={indeterminate ? '' : `width: ${percentage}%`}
|
|
146
|
+
>
|
|
147
|
+
{#if showValue && valueInside}
|
|
148
|
+
<span class="progress-value {textSizeClasses}">
|
|
149
|
+
{formattedValue}
|
|
150
|
+
</span>
|
|
151
|
+
{/if}
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
<style>
|
|
157
|
+
@reference "../../twintrinsic.css";
|
|
158
|
+
|
|
159
|
+
.progress-container {
|
|
160
|
+
@apply w-full;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.progress-label {
|
|
164
|
+
@apply mb-1 font-medium text-text dark:text-text;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.progress {
|
|
168
|
+
@apply w-full overflow-hidden rounded-full;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.progress-bar {
|
|
172
|
+
@apply h-full rounded-full transition-all duration-300 ease-out;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.progress-value {
|
|
176
|
+
@apply text-white dark:text-white font-medium px-2;
|
|
177
|
+
@apply flex items-center h-full;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.progress-striped {
|
|
181
|
+
background-image: linear-gradient(
|
|
182
|
+
45deg,
|
|
183
|
+
rgba(255, 255, 255, 0.15) 25%,
|
|
184
|
+
transparent 25%,
|
|
185
|
+
transparent 50%,
|
|
186
|
+
rgba(255, 255, 255, 0.15) 50%,
|
|
187
|
+
rgba(255, 255, 255, 0.15) 75%,
|
|
188
|
+
transparent 75%,
|
|
189
|
+
transparent
|
|
190
|
+
);
|
|
191
|
+
background-size: 1rem 1rem;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.progress-animated {
|
|
195
|
+
animation: progress-stripes 1s linear infinite;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.progress-indeterminate {
|
|
199
|
+
width: 50%;
|
|
200
|
+
animation: progress-indeterminate 1.5s ease-in-out infinite;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
@keyframes progress-stripes {
|
|
204
|
+
from {
|
|
205
|
+
background-position: 1rem 0;
|
|
206
|
+
}
|
|
207
|
+
to {
|
|
208
|
+
background-position: 0 0;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@keyframes progress-indeterminate {
|
|
213
|
+
0% {
|
|
214
|
+
transform: translateX(-100%);
|
|
215
|
+
}
|
|
216
|
+
100% {
|
|
217
|
+
transform: translateX(200%);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
</style>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export default Progress;
|
|
2
|
+
type Progress = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Progress - A component for displaying progress bars and indicators.
|
|
8
|
+
* Provides consistent styling, accessibility features, and various display options.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <Progress value={75} />
|
|
13
|
+
*
|
|
14
|
+
* <Progress
|
|
15
|
+
* value={42}
|
|
16
|
+
* max={100}
|
|
17
|
+
* variant="primary"
|
|
18
|
+
* showValue
|
|
19
|
+
* />
|
|
20
|
+
*
|
|
21
|
+
* <Progress
|
|
22
|
+
* value={0.8}
|
|
23
|
+
* max={1}
|
|
24
|
+
* variant="success"
|
|
25
|
+
* size="lg"
|
|
26
|
+
* format={(v) => `${Math.round(v * 100)}%`}
|
|
27
|
+
* />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare const Progress: import("svelte").Component<{
|
|
31
|
+
class?: string;
|
|
32
|
+
id?: any;
|
|
33
|
+
value?: number;
|
|
34
|
+
max?: number;
|
|
35
|
+
min?: number;
|
|
36
|
+
variant?: string;
|
|
37
|
+
size?: string;
|
|
38
|
+
showValue?: boolean;
|
|
39
|
+
valueInside?: boolean;
|
|
40
|
+
striped?: boolean;
|
|
41
|
+
animated?: boolean;
|
|
42
|
+
indeterminate?: boolean;
|
|
43
|
+
format: any;
|
|
44
|
+
ariaLabel: any;
|
|
45
|
+
}, {}, "">;
|
|
46
|
+
type $$ComponentProps = {
|
|
47
|
+
class?: string;
|
|
48
|
+
id?: any;
|
|
49
|
+
value?: number;
|
|
50
|
+
max?: number;
|
|
51
|
+
min?: number;
|
|
52
|
+
variant?: string;
|
|
53
|
+
size?: string;
|
|
54
|
+
showValue?: boolean;
|
|
55
|
+
valueInside?: boolean;
|
|
56
|
+
striped?: boolean;
|
|
57
|
+
animated?: boolean;
|
|
58
|
+
indeterminate?: boolean;
|
|
59
|
+
format: any;
|
|
60
|
+
ariaLabel: any;
|
|
61
|
+
};
|