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,149 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
CarouselItem - An individual slide within a Carousel component.
|
|
4
|
+
Provides consistent styling, accessibility features, and transition effects.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<CarouselItem>
|
|
9
|
+
<img src="/image1.jpg" alt="Image 1" />
|
|
10
|
+
</CarouselItem>
|
|
11
|
+
|
|
12
|
+
<CarouselItem>
|
|
13
|
+
<div class="p-4 text-center">
|
|
14
|
+
<h3>Slide Title</h3>
|
|
15
|
+
<p>Slide content goes here</p>
|
|
16
|
+
</div>
|
|
17
|
+
</CarouselItem>
|
|
18
|
+
```
|
|
19
|
+
-->
|
|
20
|
+
<script>
|
|
21
|
+
import { getContext, onMount } from "svelte"
|
|
22
|
+
|
|
23
|
+
const {
|
|
24
|
+
/** @type {string} - Additional CSS classes */
|
|
25
|
+
class: className = "",
|
|
26
|
+
|
|
27
|
+
/** @type {string} - HTML id for accessibility */
|
|
28
|
+
id = crypto.randomUUID(),
|
|
29
|
+
|
|
30
|
+
/** @type {boolean} - Whether the item is active */
|
|
31
|
+
active = false,
|
|
32
|
+
|
|
33
|
+
children,
|
|
34
|
+
} = $props()
|
|
35
|
+
|
|
36
|
+
// Get carousel context
|
|
37
|
+
const carouselContext = getContext("carousel")
|
|
38
|
+
|
|
39
|
+
// Component state
|
|
40
|
+
let index = $state(-1)
|
|
41
|
+
let isActive = $state(false)
|
|
42
|
+
let isVisible = $state(false)
|
|
43
|
+
let wasActive = $state(false)
|
|
44
|
+
|
|
45
|
+
// Register with parent on mount
|
|
46
|
+
onMount(() => {
|
|
47
|
+
if (carouselContext) {
|
|
48
|
+
index = carouselContext.registerItem()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return () => {
|
|
52
|
+
// Cleanup if needed
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
// Update active state when prop changes
|
|
57
|
+
$effect(() => {
|
|
58
|
+
if (!carouselContext) {
|
|
59
|
+
isActive = active
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// Update active state based on context
|
|
64
|
+
$effect(() => {
|
|
65
|
+
if (carouselContext) {
|
|
66
|
+
const currentIndex = carouselContext.currentIndex
|
|
67
|
+
wasActive = isActive
|
|
68
|
+
isActive = index === currentIndex
|
|
69
|
+
|
|
70
|
+
// For fade transition, we need to keep the item visible for a bit after it becomes inactive
|
|
71
|
+
if (carouselContext.transition === "fade") {
|
|
72
|
+
if (isActive) {
|
|
73
|
+
isVisible = true
|
|
74
|
+
} else if (wasActive) {
|
|
75
|
+
// Keep visible during transition, then hide
|
|
76
|
+
isVisible = true
|
|
77
|
+
setTimeout(() => {
|
|
78
|
+
isVisible = false
|
|
79
|
+
}, carouselContext.transitionDuration)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
// Determine transition styles based on context
|
|
86
|
+
const transitionType = $derived(carouselContext?.transition || "slide")
|
|
87
|
+
const transitionDuration = $derived(carouselContext?.transitionDuration || 300)
|
|
88
|
+
const currentIndex = $derived(carouselContext?.currentIndex || 0)
|
|
89
|
+
|
|
90
|
+
// Calculate transform for slide transition
|
|
91
|
+
const transform = $derived(() => {
|
|
92
|
+
if (transitionType === "slide" && typeof index === "number" && typeof currentIndex === "number") {
|
|
93
|
+
const offset = (index - currentIndex) * 100
|
|
94
|
+
return `translateX(${offset}%)`
|
|
95
|
+
}
|
|
96
|
+
return ""
|
|
97
|
+
})
|
|
98
|
+
</script>
|
|
99
|
+
|
|
100
|
+
<div
|
|
101
|
+
{id}
|
|
102
|
+
class="
|
|
103
|
+
carousel-item
|
|
104
|
+
carousel-item-{transitionType}
|
|
105
|
+
{isActive ? 'carousel-item-active' : ''}
|
|
106
|
+
{isVisible ? 'carousel-item-visible' : ''}
|
|
107
|
+
{className}
|
|
108
|
+
"
|
|
109
|
+
style="
|
|
110
|
+
--transition-duration: {transitionDuration}ms;
|
|
111
|
+
transform: {transform};
|
|
112
|
+
"
|
|
113
|
+
role="tabpanel"
|
|
114
|
+
aria-hidden={!isActive}
|
|
115
|
+
aria-roledescription="slide"
|
|
116
|
+
>
|
|
117
|
+
{@render children?.()}
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<style>
|
|
121
|
+
@reference "../../twintrinsic.css";
|
|
122
|
+
|
|
123
|
+
.carousel-item {
|
|
124
|
+
@apply w-full flex-shrink-0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* Slide transition */
|
|
128
|
+
.carousel-item-slide {
|
|
129
|
+
@apply transition-transform ease-in-out;
|
|
130
|
+
transition-duration: var(--transition-duration);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Fade transition */
|
|
134
|
+
.carousel-item-fade {
|
|
135
|
+
@apply absolute inset-0;
|
|
136
|
+
@apply opacity-0 invisible;
|
|
137
|
+
@apply transition-opacity ease-in-out;
|
|
138
|
+
transition-duration: var(--transition-duration);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.carousel-item-fade.carousel-item-active,
|
|
142
|
+
.carousel-item-fade.carousel-item-visible {
|
|
143
|
+
@apply opacity-100 visible;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.carousel-item-active {
|
|
147
|
+
@apply z-10;
|
|
148
|
+
}
|
|
149
|
+
</style>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export default CarouselItem;
|
|
2
|
+
type CarouselItem = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* CarouselItem - An individual slide within a Carousel component.
|
|
8
|
+
* Provides consistent styling, accessibility features, and transition effects.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <CarouselItem>
|
|
13
|
+
* <img src="/image1.jpg" alt="Image 1" />
|
|
14
|
+
* </CarouselItem>
|
|
15
|
+
*
|
|
16
|
+
* <CarouselItem>
|
|
17
|
+
* <div class="p-4 text-center">
|
|
18
|
+
* <h3>Slide Title</h3>
|
|
19
|
+
* <p>Slide content goes here</p>
|
|
20
|
+
* </div>
|
|
21
|
+
* </CarouselItem>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
declare const CarouselItem: import("svelte").Component<{
|
|
25
|
+
class?: string;
|
|
26
|
+
id?: any;
|
|
27
|
+
active?: boolean;
|
|
28
|
+
children: any;
|
|
29
|
+
}, {}, "">;
|
|
30
|
+
type $$ComponentProps = {
|
|
31
|
+
class?: string;
|
|
32
|
+
id?: any;
|
|
33
|
+
active?: boolean;
|
|
34
|
+
children: any;
|
|
35
|
+
};
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Chip - A compact element for representing an input, attribute, or action.
|
|
4
|
+
Provides consistent styling, accessibility features, and interactive options.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Chip>Basic Chip</Chip>
|
|
9
|
+
|
|
10
|
+
<Chip variant="primary" icon="<svg>...</svg>">
|
|
11
|
+
Primary Chip
|
|
12
|
+
</Chip>
|
|
13
|
+
|
|
14
|
+
<Chip
|
|
15
|
+
variant="success"
|
|
16
|
+
removable
|
|
17
|
+
onremove={() => console.log('Chip removed')}
|
|
18
|
+
>
|
|
19
|
+
Removable Chip
|
|
20
|
+
</Chip>
|
|
21
|
+
|
|
22
|
+
<Chip
|
|
23
|
+
variant="warning"
|
|
24
|
+
avatar="<img src='user.jpg' alt='User'>"
|
|
25
|
+
clickable
|
|
26
|
+
onclick={() => console.log('Chip clicked')}
|
|
27
|
+
>
|
|
28
|
+
User Name
|
|
29
|
+
</Chip>
|
|
30
|
+
```
|
|
31
|
+
-->
|
|
32
|
+
<script>
|
|
33
|
+
const {
|
|
34
|
+
/** @type {string} - Additional CSS classes */
|
|
35
|
+
class: className = "",
|
|
36
|
+
|
|
37
|
+
/** @type {string} - HTML id for accessibility */
|
|
38
|
+
id = crypto.randomUUID(),
|
|
39
|
+
|
|
40
|
+
/** @type {string} - Visual style variant */
|
|
41
|
+
variant = "default",
|
|
42
|
+
|
|
43
|
+
/** @type {string} - Size of the chip (sm, md, lg) */
|
|
44
|
+
size = "md",
|
|
45
|
+
|
|
46
|
+
/** @type {string} - Icon to display (HTML or SVG string) */
|
|
47
|
+
icon,
|
|
48
|
+
|
|
49
|
+
/** @type {string} - Avatar to display (HTML or img tag) */
|
|
50
|
+
avatar,
|
|
51
|
+
|
|
52
|
+
/** @type {boolean} - Whether the chip is removable */
|
|
53
|
+
removable = false,
|
|
54
|
+
|
|
55
|
+
/** @type {boolean} - Whether the chip is clickable */
|
|
56
|
+
clickable = false,
|
|
57
|
+
|
|
58
|
+
/** @type {boolean} - Whether the chip is disabled */
|
|
59
|
+
disabled = false,
|
|
60
|
+
|
|
61
|
+
/** @type {boolean} - Whether the chip is selected */
|
|
62
|
+
selected = false,
|
|
63
|
+
|
|
64
|
+
/** @type {boolean} - Whether to show an outline style */
|
|
65
|
+
outline = false,
|
|
66
|
+
|
|
67
|
+
/** @type {string} - ARIA label for the remove button */
|
|
68
|
+
removeAriaLabel = "Remove",
|
|
69
|
+
|
|
70
|
+
/** @type {string} - Custom remove icon (HTML or SVG string) */
|
|
71
|
+
removeIcon,
|
|
72
|
+
|
|
73
|
+
/** @type {(event: CustomEvent) => void} - Remove event handler */
|
|
74
|
+
onremove,
|
|
75
|
+
/** @type {(event: CustomEvent) => void} - Click event handler */
|
|
76
|
+
onclick,
|
|
77
|
+
|
|
78
|
+
children,
|
|
79
|
+
} = $props()
|
|
80
|
+
|
|
81
|
+
// Determine variant classes
|
|
82
|
+
const variantClasses = $derived(
|
|
83
|
+
outline
|
|
84
|
+
? {
|
|
85
|
+
default: "bg-transparent border border-muted text-text dark:border-muted dark:text-text",
|
|
86
|
+
primary:
|
|
87
|
+
"bg-transparent border border-primary-500 text-primary-500 dark:border-primary-500 dark:text-primary-500",
|
|
88
|
+
secondary:
|
|
89
|
+
"bg-transparent border border-secondary-500 text-secondary-500 dark:border-secondary-500 dark:text-secondary-500",
|
|
90
|
+
success:
|
|
91
|
+
"bg-transparent border border-success-500 text-success-500 dark:border-success-500 dark:text-success-500",
|
|
92
|
+
warning:
|
|
93
|
+
"bg-transparent border border-warning-500 text-warning-500 dark:border-warning-500 dark:text-warning-500",
|
|
94
|
+
error:
|
|
95
|
+
"bg-transparent border border-error-500 text-error-500 dark:border-error-500 dark:text-error-500",
|
|
96
|
+
info: "bg-transparent border border-info-500 text-info-500 dark:border-info-500 dark:text-info-500",
|
|
97
|
+
}[variant]
|
|
98
|
+
: {
|
|
99
|
+
default: "bg-muted/10 text-text dark:bg-muted/20 dark:text-text",
|
|
100
|
+
primary: "bg-primary-100 text-primary-800 dark:bg-primary-900 dark:text-primary-200",
|
|
101
|
+
secondary:
|
|
102
|
+
"bg-secondary-100 text-secondary-800 dark:bg-secondary-900 dark:text-secondary-200",
|
|
103
|
+
success: "bg-success-100 text-success-800 dark:bg-success-900 dark:text-success-200",
|
|
104
|
+
warning: "bg-warning-100 text-warning-800 dark:bg-warning-900 dark:text-warning-200",
|
|
105
|
+
error: "bg-error-100 text-error-800 dark:bg-error-900 dark:text-error-200",
|
|
106
|
+
info: "bg-info-100 text-info-800 dark:bg-info-900 dark:text-info-200",
|
|
107
|
+
}[variant]
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
// Determine selected variant classes
|
|
111
|
+
const selectedClasses = $derived(
|
|
112
|
+
selected
|
|
113
|
+
? {
|
|
114
|
+
default: "bg-muted/20 dark:bg-muted/30",
|
|
115
|
+
primary: "bg-primary-200 dark:bg-primary-800",
|
|
116
|
+
secondary: "bg-secondary-200 dark:bg-secondary-800",
|
|
117
|
+
success: "bg-success-200 dark:bg-success-800",
|
|
118
|
+
warning: "bg-warning-200 dark:bg-warning-800",
|
|
119
|
+
error: "bg-error-200 dark:bg-error-800",
|
|
120
|
+
info: "bg-info-200 dark:bg-info-800",
|
|
121
|
+
}[variant]
|
|
122
|
+
: ""
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
// Determine size classes
|
|
126
|
+
const sizeClasses = $derived(
|
|
127
|
+
{
|
|
128
|
+
sm: "text-xs px-2 py-0.5 h-6",
|
|
129
|
+
md: "text-sm px-2.5 py-1 h-8",
|
|
130
|
+
lg: "text-base px-3 py-1.5 h-10",
|
|
131
|
+
}[size] || "text-sm px-2.5 py-1 h-8"
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
// Determine icon size classes
|
|
135
|
+
const iconSizeClasses = $derived(
|
|
136
|
+
{
|
|
137
|
+
sm: "w-3.5 h-3.5",
|
|
138
|
+
md: "w-4 h-4",
|
|
139
|
+
lg: "w-5 h-5",
|
|
140
|
+
}[size] || "w-4 h-4"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Handles click on the chip
|
|
145
|
+
* @param {MouseEvent} event - Click event
|
|
146
|
+
*/
|
|
147
|
+
function handleClick(event) {
|
|
148
|
+
if (disabled) {
|
|
149
|
+
event.preventDefault()
|
|
150
|
+
return
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (clickable) {
|
|
154
|
+
onclick?.(new CustomEvent("click", { detail: event }))
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Handles remove button click
|
|
160
|
+
* @param {MouseEvent} event - Click event
|
|
161
|
+
*/
|
|
162
|
+
function handleRemove(event) {
|
|
163
|
+
if (disabled) {
|
|
164
|
+
event.preventDefault()
|
|
165
|
+
return
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
event.stopPropagation()
|
|
169
|
+
onremove?.(new CustomEvent("remove"))
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Handles keydown events
|
|
174
|
+
* @param {KeyboardEvent} event - Keydown event
|
|
175
|
+
*/
|
|
176
|
+
function handleKeydown(event) {
|
|
177
|
+
if (disabled) return
|
|
178
|
+
|
|
179
|
+
if ((clickable && event.key === "Enter") || event.key === " ") {
|
|
180
|
+
event.preventDefault()
|
|
181
|
+
onclick?.(new CustomEvent("click", { detail: event }))
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
</script>
|
|
185
|
+
|
|
186
|
+
<div
|
|
187
|
+
{id}
|
|
188
|
+
class="
|
|
189
|
+
chip
|
|
190
|
+
{variantClasses}
|
|
191
|
+
{selectedClasses}
|
|
192
|
+
{sizeClasses}
|
|
193
|
+
{clickable ? 'chip-clickable' : ''}
|
|
194
|
+
{disabled ? 'chip-disabled' : ''}
|
|
195
|
+
{selected ? 'chip-selected' : ''}
|
|
196
|
+
{className}
|
|
197
|
+
"
|
|
198
|
+
role={clickable ? 'button' : 'presentation'}
|
|
199
|
+
tabindex={clickable && !disabled ? 0 : undefined}
|
|
200
|
+
aria-disabled={disabled ? true : undefined}
|
|
201
|
+
onclick={handleClick}
|
|
202
|
+
onkeydown={handleKeydown}
|
|
203
|
+
>
|
|
204
|
+
{#if avatar}
|
|
205
|
+
<span class="chip-avatar">
|
|
206
|
+
{@html avatar}
|
|
207
|
+
</span>
|
|
208
|
+
{/if}
|
|
209
|
+
|
|
210
|
+
{#if icon}
|
|
211
|
+
<span class="chip-icon {iconSizeClasses}" aria-hidden="true">
|
|
212
|
+
{@html icon}
|
|
213
|
+
</span>
|
|
214
|
+
{/if}
|
|
215
|
+
|
|
216
|
+
<span class="chip-content">
|
|
217
|
+
{@render children?.()}
|
|
218
|
+
</span>
|
|
219
|
+
|
|
220
|
+
{#if removable && !disabled}
|
|
221
|
+
<button
|
|
222
|
+
type="button"
|
|
223
|
+
class="chip-remove"
|
|
224
|
+
aria-label={removeAriaLabel}
|
|
225
|
+
onclick={handleRemove}
|
|
226
|
+
>
|
|
227
|
+
{#if removeIcon}
|
|
228
|
+
<span class="chip-remove-icon {iconSizeClasses}">
|
|
229
|
+
{@html removeIcon}
|
|
230
|
+
</span>
|
|
231
|
+
{:else}
|
|
232
|
+
<svg class="{iconSizeClasses}" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
233
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
|
234
|
+
</svg>
|
|
235
|
+
{/if}
|
|
236
|
+
</button>
|
|
237
|
+
{/if}
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<style>
|
|
241
|
+
@reference "../../twintrinsic.css";
|
|
242
|
+
|
|
243
|
+
.chip {
|
|
244
|
+
@apply inline-flex items-center;
|
|
245
|
+
@apply rounded-full;
|
|
246
|
+
@apply font-medium;
|
|
247
|
+
@apply transition-colors duration-150;
|
|
248
|
+
@apply max-w-full;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.chip-clickable {
|
|
252
|
+
@apply cursor-pointer;
|
|
253
|
+
@apply hover:bg-inherit/80 dark:hover:bg-inherit/80;
|
|
254
|
+
@apply focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400 focus:ring-offset-2;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.chip-disabled {
|
|
258
|
+
@apply opacity-50 cursor-not-allowed;
|
|
259
|
+
@apply pointer-events-none;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.chip-avatar {
|
|
263
|
+
@apply -ml-1 mr-1;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.chip-avatar :global(img),
|
|
267
|
+
.chip-avatar :global(svg) {
|
|
268
|
+
@apply w-6 h-6 rounded-full object-cover;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.chip-icon {
|
|
272
|
+
@apply mr-1 flex-shrink-0;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.chip-content {
|
|
276
|
+
@apply truncate;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.chip-remove {
|
|
280
|
+
@apply ml-1 -mr-1 p-0.5;
|
|
281
|
+
@apply rounded-full;
|
|
282
|
+
@apply flex items-center justify-center;
|
|
283
|
+
@apply text-current opacity-70;
|
|
284
|
+
@apply hover:opacity-100;
|
|
285
|
+
@apply focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400;
|
|
286
|
+
@apply transition-opacity duration-150;
|
|
287
|
+
}
|
|
288
|
+
</style>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export default Chip;
|
|
2
|
+
type Chip = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Chip - A compact element for representing an input, attribute, or action.
|
|
8
|
+
* Provides consistent styling, accessibility features, and interactive options.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <Chip>Basic Chip</Chip>
|
|
13
|
+
*
|
|
14
|
+
* <Chip variant="primary" icon="<svg>...</svg>">
|
|
15
|
+
* Primary Chip
|
|
16
|
+
* </Chip>
|
|
17
|
+
*
|
|
18
|
+
* <Chip
|
|
19
|
+
* variant="success"
|
|
20
|
+
* removable
|
|
21
|
+
* onremove={() => console.log('Chip removed')}
|
|
22
|
+
* >
|
|
23
|
+
* Removable Chip
|
|
24
|
+
* </Chip>
|
|
25
|
+
*
|
|
26
|
+
* <Chip
|
|
27
|
+
* variant="warning"
|
|
28
|
+
* avatar="<img src='user.jpg' alt='User'>"
|
|
29
|
+
* clickable
|
|
30
|
+
* onclick={() => console.log('Chip clicked')}
|
|
31
|
+
* >
|
|
32
|
+
* User Name
|
|
33
|
+
* </Chip>
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare const Chip: import("svelte").Component<{
|
|
37
|
+
class?: string;
|
|
38
|
+
id?: any;
|
|
39
|
+
variant?: string;
|
|
40
|
+
size?: string;
|
|
41
|
+
icon: any;
|
|
42
|
+
avatar: any;
|
|
43
|
+
removable?: boolean;
|
|
44
|
+
clickable?: boolean;
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
selected?: boolean;
|
|
47
|
+
outline?: boolean;
|
|
48
|
+
removeAriaLabel?: string;
|
|
49
|
+
removeIcon: any;
|
|
50
|
+
onremove: any;
|
|
51
|
+
onclick: any;
|
|
52
|
+
children: any;
|
|
53
|
+
}, {}, "">;
|
|
54
|
+
type $$ComponentProps = {
|
|
55
|
+
class?: string;
|
|
56
|
+
id?: any;
|
|
57
|
+
variant?: string;
|
|
58
|
+
size?: string;
|
|
59
|
+
icon: any;
|
|
60
|
+
avatar: any;
|
|
61
|
+
removable?: boolean;
|
|
62
|
+
clickable?: boolean;
|
|
63
|
+
disabled?: boolean;
|
|
64
|
+
selected?: boolean;
|
|
65
|
+
outline?: boolean;
|
|
66
|
+
removeAriaLabel?: string;
|
|
67
|
+
removeIcon: any;
|
|
68
|
+
onremove: any;
|
|
69
|
+
onclick: any;
|
|
70
|
+
children: any;
|
|
71
|
+
};
|