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,109 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Separator - A visual divider that can be horizontal or vertical with optional text/icon content.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
```svelte
|
|
7
|
+
<Separator />
|
|
8
|
+
<Separator>or</Separator>
|
|
9
|
+
<Separator vertical />
|
|
10
|
+
<Separator>
|
|
11
|
+
<Icon name="star" />
|
|
12
|
+
Featured Content
|
|
13
|
+
</Separator>
|
|
14
|
+
```
|
|
15
|
+
-->
|
|
16
|
+
<script>
|
|
17
|
+
const {
|
|
18
|
+
/** @type {boolean} - Whether the separator should be vertical */
|
|
19
|
+
vertical = false,
|
|
20
|
+
|
|
21
|
+
/** @type {string} - Additional CSS classes */
|
|
22
|
+
class: className = "",
|
|
23
|
+
|
|
24
|
+
/** @type {string} - ARIA label */
|
|
25
|
+
ariaLabel,
|
|
26
|
+
|
|
27
|
+
/** @type {string} - Color variant */
|
|
28
|
+
color = "default",
|
|
29
|
+
|
|
30
|
+
/** @type {"div" | "hr"} - HTML element to render */
|
|
31
|
+
as,
|
|
32
|
+
|
|
33
|
+
children,
|
|
34
|
+
} = $props()
|
|
35
|
+
|
|
36
|
+
// Color variants mapping
|
|
37
|
+
const colorClasses = {
|
|
38
|
+
default: "border-border",
|
|
39
|
+
primary: "border-primary-200 dark:border-primary-800",
|
|
40
|
+
success: "border-success/30",
|
|
41
|
+
warning: "border-warning/30",
|
|
42
|
+
error: "border-error/30",
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Determine if we have content and element type
|
|
46
|
+
const hasContent = $derived(children !== undefined)
|
|
47
|
+
const element = $derived(as ?? (hasContent ? "div" : "hr"))
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<svelte:element
|
|
51
|
+
this={element}
|
|
52
|
+
class="separator {colorClasses[color]} {vertical ? 'separator-vertical' : 'separator-horizontal'} {hasContent ? 'separator-with-content' : ''} {className}"
|
|
53
|
+
role={element === 'div' ? 'separator' : undefined}
|
|
54
|
+
aria-orientation={vertical ? 'vertical' : 'horizontal'}
|
|
55
|
+
aria-label={ariaLabel}
|
|
56
|
+
>
|
|
57
|
+
{#if hasContent}
|
|
58
|
+
<div class="separator-content">
|
|
59
|
+
{@render children()}
|
|
60
|
+
</div>
|
|
61
|
+
{/if}
|
|
62
|
+
</svelte:element>
|
|
63
|
+
|
|
64
|
+
<style>
|
|
65
|
+
@reference "../../twintrinsic.css";
|
|
66
|
+
/* Base separator styles */
|
|
67
|
+
.separator {
|
|
68
|
+
@apply relative border-0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Horizontal separator */
|
|
72
|
+
.separator-horizontal {
|
|
73
|
+
@apply w-full h-px mt-4 mb-4;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.separator-horizontal:not(.separator-with-content) {
|
|
77
|
+
@apply border-t;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.separator-horizontal.separator-with-content {
|
|
81
|
+
@apply flex items-center text-center before:content-[''] after:content-[''];
|
|
82
|
+
@apply before:flex-1 before:border-t;
|
|
83
|
+
@apply after:flex-1 after:border-t;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Vertical separator */
|
|
87
|
+
.separator-vertical {
|
|
88
|
+
@apply h-full w-px mx-4 inline-block align-middle;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.separator-vertical:not(.separator-with-content) {
|
|
92
|
+
@apply border-l;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.separator-vertical.separator-with-content {
|
|
96
|
+
@apply flex flex-col items-center text-center before:content-[''] after:content-[''];
|
|
97
|
+
@apply before:flex-1 before:border-l;
|
|
98
|
+
@apply after:flex-1 after:border-l;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Content styles */
|
|
102
|
+
.separator-content {
|
|
103
|
+
@apply flex items-center gap-2 px-3 text-muted;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.separator-vertical .separator-content {
|
|
107
|
+
@apply py-3 px-0 rotate-180 [writing-mode:vertical-lr];
|
|
108
|
+
}
|
|
109
|
+
</style>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export default Separator;
|
|
2
|
+
type Separator = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Separator - A visual divider that can be horizontal or vertical with optional text/icon content.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```svelte
|
|
11
|
+
* <Separator />
|
|
12
|
+
* <Separator>or</Separator>
|
|
13
|
+
* <Separator vertical />
|
|
14
|
+
* <Separator>
|
|
15
|
+
* <Icon name="star" />
|
|
16
|
+
* Featured Content
|
|
17
|
+
* </Separator>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
declare const Separator: import("svelte").Component<{
|
|
21
|
+
vertical?: boolean;
|
|
22
|
+
class?: string;
|
|
23
|
+
ariaLabel: any;
|
|
24
|
+
color?: string;
|
|
25
|
+
as: any;
|
|
26
|
+
children: any;
|
|
27
|
+
}, {}, "">;
|
|
28
|
+
type $$ComponentProps = {
|
|
29
|
+
vertical?: boolean;
|
|
30
|
+
class?: string;
|
|
31
|
+
ariaLabel: any;
|
|
32
|
+
color?: string;
|
|
33
|
+
as: any;
|
|
34
|
+
children: any;
|
|
35
|
+
};
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Sidebar - A collapsible side panel that attaches to its parent container.
|
|
4
|
+
Built on top of the Panel component with additional positioning and animation features.
|
|
5
|
+
|
|
6
|
+
## Props
|
|
7
|
+
- `expanded` - Initial expanded state (default: true)
|
|
8
|
+
- `position` - Sidebar position: "left" or "right" (default: "left")
|
|
9
|
+
- `width` - Width of the sidebar when expanded (default: "16rem")
|
|
10
|
+
- `floatOnMobile` - Float above content on mobile instead of taking full width (default: false)
|
|
11
|
+
- `disabled` - Disable toggle functionality (default: false)
|
|
12
|
+
- `hideBackdrop` - Hide the backdrop overlay when expanded (default: false)
|
|
13
|
+
- `id` - Custom element ID (default: random UUID)
|
|
14
|
+
- `ariaLabel` - Accessibility label for the sidebar
|
|
15
|
+
- `docked` - Reserved for future use
|
|
16
|
+
- `class` - Additional CSS classes
|
|
17
|
+
- `ontoggle` - Callback when sidebar is toggled
|
|
18
|
+
|
|
19
|
+
## Slots
|
|
20
|
+
- `header` - Header content for the Panel
|
|
21
|
+
- `default` - Main sidebar content
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
```svelte
|
|
25
|
+
<Sidebar>
|
|
26
|
+
<svelte:fragment slot="header">Navigation</svelte:fragment>
|
|
27
|
+
<nav>Menu items here</nav>
|
|
28
|
+
</Sidebar>
|
|
29
|
+
|
|
30
|
+
<Sidebar position="right" expanded={false}>
|
|
31
|
+
<svelte:fragment slot="header">Settings</svelte:fragment>
|
|
32
|
+
Settings content
|
|
33
|
+
</Sidebar>
|
|
34
|
+
|
|
35
|
+
<Sidebar floatOnMobile>
|
|
36
|
+
<svelte:fragment slot="header">Mobile Menu</svelte:fragment>
|
|
37
|
+
Content that floats on mobile
|
|
38
|
+
</Sidebar>
|
|
39
|
+
```
|
|
40
|
+
-->
|
|
41
|
+
<script lang="ts">
|
|
42
|
+
import { slide } from "svelte/transition"
|
|
43
|
+
import Panel from "../Panel/Panel.svelte"
|
|
44
|
+
|
|
45
|
+
/** Sidebar component props configuration */
|
|
46
|
+
type SidebarProps = {
|
|
47
|
+
/** Initial expanded state */
|
|
48
|
+
expanded?: boolean
|
|
49
|
+
/** Additional CSS classes */
|
|
50
|
+
class?: string
|
|
51
|
+
/** Sidebar position: left or right */
|
|
52
|
+
position?: "left" | "right"
|
|
53
|
+
/** Width of the sidebar when expanded */
|
|
54
|
+
width?: string
|
|
55
|
+
/** Custom element ID (auto-generated if not provided) */
|
|
56
|
+
id?: string
|
|
57
|
+
/** Accessibility label for the sidebar */
|
|
58
|
+
ariaLabel?: string
|
|
59
|
+
/** Disable toggle functionality */
|
|
60
|
+
disabled?: boolean
|
|
61
|
+
/** Hide the backdrop overlay when expanded */
|
|
62
|
+
hideBackdrop?: boolean
|
|
63
|
+
/** Float above content on mobile instead of taking full width */
|
|
64
|
+
floatOnMobile?: boolean
|
|
65
|
+
/** Reserved for future use */
|
|
66
|
+
docked?: boolean
|
|
67
|
+
/** Callback when sidebar is toggled */
|
|
68
|
+
ontoggle?: (payload: { expanded: boolean }) => void
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const {
|
|
72
|
+
expanded = true,
|
|
73
|
+
class: className = "",
|
|
74
|
+
position = "left",
|
|
75
|
+
width = "16rem",
|
|
76
|
+
id = crypto.randomUUID(),
|
|
77
|
+
ariaLabel,
|
|
78
|
+
disabled = false,
|
|
79
|
+
hideBackdrop = false,
|
|
80
|
+
floatOnMobile = false,
|
|
81
|
+
docked = false,
|
|
82
|
+
ontoggle,
|
|
83
|
+
} = $props() satisfies SidebarProps
|
|
84
|
+
|
|
85
|
+
let isExpanded = $state(false)
|
|
86
|
+
let sidebarElement = $state()
|
|
87
|
+
|
|
88
|
+
// Initialize and sync expanded state when prop changes
|
|
89
|
+
$effect(() => {
|
|
90
|
+
isExpanded = expanded
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
/** Handle toggle events from the Panel component */
|
|
94
|
+
function handleToggle(payload: { expanded: boolean }): void {
|
|
95
|
+
isExpanded = payload.expanded
|
|
96
|
+
ontoggle?.({ expanded: isExpanded })
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Handle backdrop click to collapse the sidebar */
|
|
100
|
+
function handleBackdropClick(): void {
|
|
101
|
+
if (!disabled) {
|
|
102
|
+
isExpanded = false
|
|
103
|
+
ontoggle?.({ expanded: isExpanded })
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Handle Escape key to collapse the sidebar */
|
|
108
|
+
function handleKeydown(event: KeyboardEvent): void {
|
|
109
|
+
if (!disabled && event.key === "Escape" && isExpanded) {
|
|
110
|
+
isExpanded = false
|
|
111
|
+
ontoggle?.({ expanded: isExpanded })
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
</script>
|
|
115
|
+
|
|
116
|
+
<svelte:window onkeydown={handleKeydown} />
|
|
117
|
+
|
|
118
|
+
<div
|
|
119
|
+
class="
|
|
120
|
+
sidebar-container
|
|
121
|
+
{position === 'right' ? 'sidebar-right' : 'sidebar-left'}
|
|
122
|
+
{floatOnMobile ? 'sidebar-float-mobile' : ''}
|
|
123
|
+
{className}
|
|
124
|
+
"
|
|
125
|
+
style="--sidebar-width: {width}"
|
|
126
|
+
{id}
|
|
127
|
+
role="complementary"
|
|
128
|
+
aria-label={ariaLabel}
|
|
129
|
+
>
|
|
130
|
+
{#if !hideBackdrop && isExpanded}
|
|
131
|
+
<div
|
|
132
|
+
class="sidebar-backdrop"
|
|
133
|
+
onclick={handleBackdropClick}
|
|
134
|
+
transition:slide={{ duration: 200 }}
|
|
135
|
+
aria-hidden="true"
|
|
136
|
+
></div>
|
|
137
|
+
{/if}
|
|
138
|
+
|
|
139
|
+
<div
|
|
140
|
+
class="
|
|
141
|
+
sidebar
|
|
142
|
+
{isExpanded ? 'sidebar-expanded' : 'sidebar-collapsed'}
|
|
143
|
+
"
|
|
144
|
+
role="region"
|
|
145
|
+
aria-labelledby="{id}-header"
|
|
146
|
+
>
|
|
147
|
+
<Panel
|
|
148
|
+
expanded={isExpanded}
|
|
149
|
+
{disabled}
|
|
150
|
+
bordered={false}
|
|
151
|
+
ontoggle={handleToggle}
|
|
152
|
+
>
|
|
153
|
+
<svelte:fragment slot="header">
|
|
154
|
+
<slot name="header" />
|
|
155
|
+
</svelte:fragment>
|
|
156
|
+
<slot />
|
|
157
|
+
</Panel>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
|
|
161
|
+
<style>
|
|
162
|
+
@reference "../../twintrinsic.css";
|
|
163
|
+
.sidebar-container {
|
|
164
|
+
@apply relative;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* Base sidebar styles */
|
|
168
|
+
.sidebar {
|
|
169
|
+
@apply h-full bg-background transition-[width,transform] duration-200 ease-in-out;
|
|
170
|
+
width: var(--sidebar-width);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* Left position styles */
|
|
174
|
+
.sidebar-left .sidebar {
|
|
175
|
+
@apply left-0;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.sidebar-left .sidebar-collapsed {
|
|
179
|
+
@apply -translate-x-full;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* Right position styles */
|
|
183
|
+
.sidebar-right .sidebar {
|
|
184
|
+
@apply right-0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.sidebar-right .sidebar-collapsed {
|
|
188
|
+
@apply translate-x-full;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* Backdrop styles */
|
|
192
|
+
.sidebar-backdrop {
|
|
193
|
+
@apply fixed inset-0 bg-black/20 backdrop-blur-sm z-40;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* Mobile styles */
|
|
197
|
+
@media (max-width: 640px) {
|
|
198
|
+
.sidebar-float-mobile .sidebar {
|
|
199
|
+
@apply fixed top-0 bottom-0 z-50;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.sidebar-float-mobile .sidebar-backdrop {
|
|
203
|
+
@apply z-40;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* Non-floating mobile styles */
|
|
208
|
+
@media (max-width: 640px) {
|
|
209
|
+
.sidebar:not(.sidebar-float-mobile) {
|
|
210
|
+
@apply w-full;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
</style>
|
|
@@ -0,0 +1,60 @@
|
|
|
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: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Sidebar - A collapsible side panel that attaches to its parent container.
|
|
16
|
+
* Built on top of the Panel component with additional positioning and animation features.
|
|
17
|
+
*
|
|
18
|
+
* ## Props
|
|
19
|
+
* - `expanded` - Initial expanded state (default: true)
|
|
20
|
+
* - `position` - Sidebar position: "left" or "right" (default: "left")
|
|
21
|
+
* - `width` - Width of the sidebar when expanded (default: "16rem")
|
|
22
|
+
* - `floatOnMobile` - Float above content on mobile instead of taking full width (default: false)
|
|
23
|
+
* - `disabled` - Disable toggle functionality (default: false)
|
|
24
|
+
* - `hideBackdrop` - Hide the backdrop overlay when expanded (default: false)
|
|
25
|
+
* - `id` - Custom element ID (default: random UUID)
|
|
26
|
+
* - `ariaLabel` - Accessibility label for the sidebar
|
|
27
|
+
* - `docked` - Reserved for future use
|
|
28
|
+
* - `class` - Additional CSS classes
|
|
29
|
+
* - `ontoggle` - Callback when sidebar is toggled
|
|
30
|
+
*
|
|
31
|
+
* ## Slots
|
|
32
|
+
* - `header` - Header content for the Panel
|
|
33
|
+
* - `default` - Main sidebar content
|
|
34
|
+
*
|
|
35
|
+
* ## Usage
|
|
36
|
+
* ```svelte
|
|
37
|
+
* <Sidebar>
|
|
38
|
+
* <svelte:fragment slot="header">Navigation</svelte:fragment>
|
|
39
|
+
* <nav>Menu items here</nav>
|
|
40
|
+
* </Sidebar>
|
|
41
|
+
*
|
|
42
|
+
* <Sidebar position="right" expanded={false}>
|
|
43
|
+
* <svelte:fragment slot="header">Settings</svelte:fragment>
|
|
44
|
+
* Settings content
|
|
45
|
+
* </Sidebar>
|
|
46
|
+
*
|
|
47
|
+
* <Sidebar floatOnMobile>
|
|
48
|
+
* <svelte:fragment slot="header">Mobile Menu</svelte:fragment>
|
|
49
|
+
* Content that floats on mobile
|
|
50
|
+
* </Sidebar>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
declare const Sidebar: $$__sveltets_2_IsomorphicComponent<any, {
|
|
54
|
+
[evt: string]: CustomEvent<any>;
|
|
55
|
+
}, {
|
|
56
|
+
header: {};
|
|
57
|
+
default: {};
|
|
58
|
+
}, {}, "">;
|
|
59
|
+
type Sidebar = InstanceType<typeof Sidebar>;
|
|
60
|
+
export default Sidebar;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Skeleton - A component for displaying loading placeholders.
|
|
4
|
+
Provides consistent styling, accessibility features, and various shapes for content loading states.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Skeleton width="100%" height="20px" />
|
|
9
|
+
|
|
10
|
+
<Skeleton variant="circle" size="40px" />
|
|
11
|
+
|
|
12
|
+
<Skeleton variant="text" lines={3} />
|
|
13
|
+
|
|
14
|
+
<div class="flex gap-4">
|
|
15
|
+
<Skeleton variant="circle" size="48px" />
|
|
16
|
+
<div class="flex-1">
|
|
17
|
+
<Skeleton variant="text" width="60%" />
|
|
18
|
+
<Skeleton variant="text" width="80%" />
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
```
|
|
22
|
+
-->
|
|
23
|
+
<script>
|
|
24
|
+
const {
|
|
25
|
+
/** @type {string} - Additional CSS classes */
|
|
26
|
+
class: className = "",
|
|
27
|
+
|
|
28
|
+
/** @type {string} - HTML id for accessibility */
|
|
29
|
+
id = crypto.randomUUID(),
|
|
30
|
+
|
|
31
|
+
/** @type {string} - Shape variant (text, rectangle, circle, rounded) */
|
|
32
|
+
variant = "rectangle",
|
|
33
|
+
|
|
34
|
+
/** @type {string|number} - Width of the skeleton */
|
|
35
|
+
width = "100%",
|
|
36
|
+
|
|
37
|
+
/** @type {string|number} - Height of the skeleton */
|
|
38
|
+
height,
|
|
39
|
+
|
|
40
|
+
/** @type {string|number} - Size for circle and square variants (sets both width and height) */
|
|
41
|
+
size,
|
|
42
|
+
|
|
43
|
+
/** @type {number} - Number of lines for text variant */
|
|
44
|
+
lines = 1,
|
|
45
|
+
|
|
46
|
+
/** @type {boolean} - Whether to show the animation */
|
|
47
|
+
animated = true,
|
|
48
|
+
|
|
49
|
+
/** @type {string} - ARIA label for accessibility */
|
|
50
|
+
ariaLabel = "Loading content",
|
|
51
|
+
} = $props()
|
|
52
|
+
|
|
53
|
+
// Determine height based on variant
|
|
54
|
+
const computedHeight = $derived(
|
|
55
|
+
(() => {
|
|
56
|
+
if (height) return height
|
|
57
|
+
if (size) return size
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
{
|
|
61
|
+
text: "1em",
|
|
62
|
+
rectangle: "100px",
|
|
63
|
+
circle: "40px",
|
|
64
|
+
rounded: "40px",
|
|
65
|
+
}[variant] || "100px"
|
|
66
|
+
)
|
|
67
|
+
})()
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
// Determine width based on variant
|
|
71
|
+
const computedWidth = $derived(
|
|
72
|
+
(() => {
|
|
73
|
+
if (width) return width
|
|
74
|
+
if (size) return size
|
|
75
|
+
if (variant === "circle") return computedHeight
|
|
76
|
+
|
|
77
|
+
return "100%"
|
|
78
|
+
})()
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
// Determine border radius based on variant
|
|
82
|
+
const borderRadius = $derived(
|
|
83
|
+
{
|
|
84
|
+
text: "4px",
|
|
85
|
+
rectangle: "0",
|
|
86
|
+
circle: "50%",
|
|
87
|
+
rounded: "8px",
|
|
88
|
+
}[variant] || "0"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
// Generate array for multiple lines
|
|
92
|
+
const lineArray = $derived(Array.from({ length: lines }))
|
|
93
|
+
|
|
94
|
+
// Determine if we should render multiple lines
|
|
95
|
+
const isMultiLine = $derived(variant === "text" && lines > 1)
|
|
96
|
+
</script>
|
|
97
|
+
|
|
98
|
+
{#if isMultiLine}
|
|
99
|
+
<div
|
|
100
|
+
{id}
|
|
101
|
+
class="skeleton-group {className}"
|
|
102
|
+
role="status"
|
|
103
|
+
aria-label={ariaLabel}
|
|
104
|
+
>
|
|
105
|
+
{#each lineArray as _, i}
|
|
106
|
+
<div
|
|
107
|
+
class="
|
|
108
|
+
skeleton
|
|
109
|
+
skeleton-{variant}
|
|
110
|
+
{animated ? 'skeleton-animated' : ''}
|
|
111
|
+
"
|
|
112
|
+
style="
|
|
113
|
+
width: {i === lineArray.length - 1 && lineArray.length > 1 ? '80%' : computedWidth};
|
|
114
|
+
height: {computedHeight};
|
|
115
|
+
border-radius: {borderRadius};
|
|
116
|
+
margin-bottom: {i === lineArray.length - 1 ? '0' : '0.5rem'};
|
|
117
|
+
"
|
|
118
|
+
aria-hidden="true"
|
|
119
|
+
></div>
|
|
120
|
+
{/each}
|
|
121
|
+
<span class="sr-only">{ariaLabel}</span>
|
|
122
|
+
</div>
|
|
123
|
+
{:else}
|
|
124
|
+
<div
|
|
125
|
+
{id}
|
|
126
|
+
class="
|
|
127
|
+
skeleton
|
|
128
|
+
skeleton-{variant}
|
|
129
|
+
{animated ? 'skeleton-animated' : ''}
|
|
130
|
+
{className}
|
|
131
|
+
"
|
|
132
|
+
style="
|
|
133
|
+
width: {computedWidth};
|
|
134
|
+
height: {computedHeight};
|
|
135
|
+
border-radius: {borderRadius};
|
|
136
|
+
"
|
|
137
|
+
role="status"
|
|
138
|
+
aria-label={ariaLabel}
|
|
139
|
+
>
|
|
140
|
+
<span class="sr-only">{ariaLabel}</span>
|
|
141
|
+
</div>
|
|
142
|
+
{/if}
|
|
143
|
+
|
|
144
|
+
<style>
|
|
145
|
+
@reference "../../twintrinsic.css";
|
|
146
|
+
|
|
147
|
+
.skeleton {
|
|
148
|
+
@apply bg-muted/10 dark:bg-muted/10;
|
|
149
|
+
@apply inline-block;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.skeleton-group {
|
|
153
|
+
@apply w-full;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.skeleton-animated {
|
|
157
|
+
@apply relative overflow-hidden;
|
|
158
|
+
@apply before:absolute before:inset-0;
|
|
159
|
+
@apply before:translate-x-[-100%];
|
|
160
|
+
@apply before:animate-[skeleton-loading_1.5s_infinite];
|
|
161
|
+
@apply before:bg-gradient-to-r;
|
|
162
|
+
@apply before:from-transparent before:via-muted/20 before:to-transparent;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
@keyframes skeleton-loading {
|
|
166
|
+
100% {
|
|
167
|
+
transform: translateX(100%);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
</style>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export default Skeleton;
|
|
2
|
+
type Skeleton = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Skeleton - A component for displaying loading placeholders.
|
|
8
|
+
* Provides consistent styling, accessibility features, and various shapes for content loading states.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <Skeleton width="100%" height="20px" />
|
|
13
|
+
*
|
|
14
|
+
* <Skeleton variant="circle" size="40px" />
|
|
15
|
+
*
|
|
16
|
+
* <Skeleton variant="text" lines={3} />
|
|
17
|
+
*
|
|
18
|
+
* <div class="flex gap-4">
|
|
19
|
+
* <Skeleton variant="circle" size="48px" />
|
|
20
|
+
* <div class="flex-1">
|
|
21
|
+
* <Skeleton variant="text" width="60%" />
|
|
22
|
+
* <Skeleton variant="text" width="80%" />
|
|
23
|
+
* </div>
|
|
24
|
+
* </div>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare const Skeleton: import("svelte").Component<{
|
|
28
|
+
class?: string;
|
|
29
|
+
id?: any;
|
|
30
|
+
variant?: string;
|
|
31
|
+
width?: string;
|
|
32
|
+
height: any;
|
|
33
|
+
size: any;
|
|
34
|
+
lines?: number;
|
|
35
|
+
animated?: boolean;
|
|
36
|
+
ariaLabel?: string;
|
|
37
|
+
}, {}, "">;
|
|
38
|
+
type $$ComponentProps = {
|
|
39
|
+
class?: string;
|
|
40
|
+
id?: any;
|
|
41
|
+
variant?: string;
|
|
42
|
+
width?: string;
|
|
43
|
+
height: any;
|
|
44
|
+
size: any;
|
|
45
|
+
lines?: number;
|
|
46
|
+
animated?: boolean;
|
|
47
|
+
ariaLabel?: string;
|
|
48
|
+
};
|