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,282 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Tooltip - A component for displaying additional information when hovering or focusing on an element.
|
|
4
|
+
Provides accessible, configurable tooltips with various positions and styles.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Tooltip content="This is a tooltip">
|
|
9
|
+
<Button>Hover me</Button>
|
|
10
|
+
</Tooltip>
|
|
11
|
+
|
|
12
|
+
<Tooltip position="bottom" delay={300}>
|
|
13
|
+
<svelte:fragment slot="content">
|
|
14
|
+
<strong>Custom tooltip</strong> with HTML content
|
|
15
|
+
</svelte:fragment>
|
|
16
|
+
<span>Hover for more info</span>
|
|
17
|
+
</Tooltip>
|
|
18
|
+
```
|
|
19
|
+
-->
|
|
20
|
+
<script>
|
|
21
|
+
import { onMount } from "svelte"
|
|
22
|
+
import { fade } from "svelte/transition"
|
|
23
|
+
|
|
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} - Tooltip content (simple string version) */
|
|
32
|
+
content = "",
|
|
33
|
+
|
|
34
|
+
/** @type {string} - Tooltip position (top, right, bottom, left) */
|
|
35
|
+
position = "top",
|
|
36
|
+
|
|
37
|
+
/** @type {number} - Delay before showing tooltip (ms) */
|
|
38
|
+
delay = 0,
|
|
39
|
+
|
|
40
|
+
/** @type {number} - Duration to show tooltip (ms, 0 for indefinite) */
|
|
41
|
+
duration = 0,
|
|
42
|
+
|
|
43
|
+
/** @type {boolean} - Whether to show an arrow pointing to the target */
|
|
44
|
+
arrow = true,
|
|
45
|
+
|
|
46
|
+
/** @type {number} - Distance from target element (px) */
|
|
47
|
+
offset = 8,
|
|
48
|
+
|
|
49
|
+
/** @type {boolean} - Whether to show on focus (for keyboard users) */
|
|
50
|
+
showOnFocus = true,
|
|
51
|
+
|
|
52
|
+
/** @type {string} - ARIA description for accessibility */
|
|
53
|
+
ariaDescription,
|
|
54
|
+
|
|
55
|
+
/** @type {(event: CustomEvent) => void} - Show event handler */
|
|
56
|
+
onshow,
|
|
57
|
+
/** @type {(event: CustomEvent) => void} - Hide event handler */
|
|
58
|
+
onhide,
|
|
59
|
+
|
|
60
|
+
children,
|
|
61
|
+
tooltipContent,
|
|
62
|
+
} = $props()
|
|
63
|
+
|
|
64
|
+
// Tooltip state
|
|
65
|
+
let isVisible = $state(false)
|
|
66
|
+
let triggerElement = $state()
|
|
67
|
+
let tooltipElement = $state()
|
|
68
|
+
let showTimeout = $state(null)
|
|
69
|
+
let hideTimeout = $state(null)
|
|
70
|
+
|
|
71
|
+
// Position state
|
|
72
|
+
let tooltipPosition = $state({
|
|
73
|
+
top: 0,
|
|
74
|
+
left: 0,
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Shows the tooltip
|
|
79
|
+
*/
|
|
80
|
+
function showTooltip() {
|
|
81
|
+
clearTimeout(hideTimeout)
|
|
82
|
+
|
|
83
|
+
if (delay > 0) {
|
|
84
|
+
showTimeout = setTimeout(() => {
|
|
85
|
+
isVisible = true
|
|
86
|
+
updatePosition()
|
|
87
|
+
onshow?.(new CustomEvent("show"))
|
|
88
|
+
|
|
89
|
+
// Auto-hide after duration if specified
|
|
90
|
+
if (duration > 0) {
|
|
91
|
+
hideTimeout = setTimeout(hideTooltip, duration)
|
|
92
|
+
}
|
|
93
|
+
}, delay)
|
|
94
|
+
} else {
|
|
95
|
+
isVisible = true
|
|
96
|
+
updatePosition()
|
|
97
|
+
onshow?.(new CustomEvent("show"))
|
|
98
|
+
|
|
99
|
+
// Auto-hide after duration if specified
|
|
100
|
+
if (duration > 0) {
|
|
101
|
+
hideTimeout = setTimeout(hideTooltip, duration)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Hides the tooltip
|
|
108
|
+
*/
|
|
109
|
+
function hideTooltip() {
|
|
110
|
+
clearTimeout(showTimeout)
|
|
111
|
+
isVisible = false
|
|
112
|
+
onhide?.(new CustomEvent("hide"))
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Updates the tooltip position based on trigger element
|
|
117
|
+
*/
|
|
118
|
+
function updatePosition() {
|
|
119
|
+
if (!triggerElement || !tooltipElement) return
|
|
120
|
+
|
|
121
|
+
// Get element dimensions and positions
|
|
122
|
+
const triggerRect = triggerElement.getBoundingClientRect()
|
|
123
|
+
const tooltipRect = tooltipElement.getBoundingClientRect()
|
|
124
|
+
|
|
125
|
+
// Calculate position based on specified position
|
|
126
|
+
let top = 0
|
|
127
|
+
let left = 0
|
|
128
|
+
|
|
129
|
+
switch (position) {
|
|
130
|
+
case "top":
|
|
131
|
+
top = triggerRect.top - tooltipRect.height - offset
|
|
132
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2
|
|
133
|
+
break
|
|
134
|
+
case "right":
|
|
135
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2
|
|
136
|
+
left = triggerRect.right + offset
|
|
137
|
+
break
|
|
138
|
+
case "bottom":
|
|
139
|
+
top = triggerRect.bottom + offset
|
|
140
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2
|
|
141
|
+
break
|
|
142
|
+
case "left":
|
|
143
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2
|
|
144
|
+
left = triggerRect.left - tooltipRect.width - offset
|
|
145
|
+
break
|
|
146
|
+
default:
|
|
147
|
+
// Default to top
|
|
148
|
+
top = triggerRect.top - tooltipRect.height - offset
|
|
149
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Adjust for scroll position
|
|
153
|
+
top += window.scrollY
|
|
154
|
+
left += window.scrollX
|
|
155
|
+
|
|
156
|
+
// Ensure tooltip stays within viewport
|
|
157
|
+
const viewportWidth = window.innerWidth
|
|
158
|
+
const viewportHeight = window.innerHeight
|
|
159
|
+
|
|
160
|
+
// Adjust horizontal position if needed
|
|
161
|
+
if (left < 10) {
|
|
162
|
+
left = 10
|
|
163
|
+
} else if (left + tooltipRect.width > viewportWidth - 10) {
|
|
164
|
+
left = viewportWidth - tooltipRect.width - 10
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Adjust vertical position if needed
|
|
168
|
+
if (top < 10) {
|
|
169
|
+
top = 10
|
|
170
|
+
} else if (top + tooltipRect.height > viewportHeight - 10) {
|
|
171
|
+
top = viewportHeight - tooltipRect.height - 10
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Update position state
|
|
175
|
+
tooltipPosition = { top, left }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Event handlers
|
|
179
|
+
function handleMouseEnter() {
|
|
180
|
+
showTooltip()
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function handleMouseLeave() {
|
|
184
|
+
hideTooltip()
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function handleFocus() {
|
|
188
|
+
if (showOnFocus) {
|
|
189
|
+
showTooltip()
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function handleBlur() {
|
|
194
|
+
hideTooltip()
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Clean up timers on unmount
|
|
198
|
+
onMount(() => {
|
|
199
|
+
return () => {
|
|
200
|
+
clearTimeout(showTimeout)
|
|
201
|
+
clearTimeout(hideTimeout)
|
|
202
|
+
}
|
|
203
|
+
})
|
|
204
|
+
</script>
|
|
205
|
+
|
|
206
|
+
<div class="tooltip-wrapper {className}">
|
|
207
|
+
<!-- Trigger element -->
|
|
208
|
+
<div
|
|
209
|
+
class="tooltip-trigger"
|
|
210
|
+
onmouseenter={handleMouseEnter}
|
|
211
|
+
onmouseleave={handleMouseLeave}
|
|
212
|
+
onfocus={handleFocus}
|
|
213
|
+
onblur={handleBlur}
|
|
214
|
+
bind:this={triggerElement}
|
|
215
|
+
aria-describedby={isVisible ? `${id}-tooltip` : undefined}
|
|
216
|
+
>
|
|
217
|
+
{@render children?.()}
|
|
218
|
+
</div>
|
|
219
|
+
|
|
220
|
+
<!-- Tooltip -->
|
|
221
|
+
{#if isVisible}
|
|
222
|
+
<div
|
|
223
|
+
id="{id}-tooltip"
|
|
224
|
+
class="tooltip tooltip-{position} {arrow ? 'tooltip-arrow' : ''}"
|
|
225
|
+
style="top: {tooltipPosition.top}px; left: {tooltipPosition.left}px;"
|
|
226
|
+
role="tooltip"
|
|
227
|
+
bind:this={tooltipElement}
|
|
228
|
+
transition:fade={{ duration: 200 }}
|
|
229
|
+
>
|
|
230
|
+
{#if tooltipContent}
|
|
231
|
+
{@render tooltipContent()}
|
|
232
|
+
{:else}
|
|
233
|
+
{content}
|
|
234
|
+
{/if}
|
|
235
|
+
</div>
|
|
236
|
+
{/if}
|
|
237
|
+
</div>
|
|
238
|
+
|
|
239
|
+
<style>
|
|
240
|
+
@reference "../../twintrinsic.css";
|
|
241
|
+
|
|
242
|
+
.tooltip-wrapper {
|
|
243
|
+
@apply inline-block relative;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.tooltip-trigger {
|
|
247
|
+
@apply inline-block;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.tooltip {
|
|
251
|
+
@apply fixed z-50 max-w-xs;
|
|
252
|
+
@apply bg-surface dark:bg-surface text-text dark:text-text;
|
|
253
|
+
@apply border border-border dark:border-border rounded-md shadow-md;
|
|
254
|
+
@apply px-3 py-2 text-sm;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* Arrow styles */
|
|
258
|
+
.tooltip-arrow::before {
|
|
259
|
+
@apply content-[''] absolute w-2 h-2 rotate-45;
|
|
260
|
+
@apply bg-surface dark:bg-surface border border-border dark:border-border;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.tooltip-top.tooltip-arrow::before {
|
|
264
|
+
@apply -bottom-1 left-1/2 -ml-1;
|
|
265
|
+
@apply border-b border-r;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.tooltip-right.tooltip-arrow::before {
|
|
269
|
+
@apply -left-1 top-1/2 -mt-1;
|
|
270
|
+
@apply border-l border-t;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.tooltip-bottom.tooltip-arrow::before {
|
|
274
|
+
@apply -top-1 left-1/2 -ml-1;
|
|
275
|
+
@apply border-t border-l;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.tooltip-left.tooltip-arrow::before {
|
|
279
|
+
@apply -right-1 top-1/2 -mt-1;
|
|
280
|
+
@apply border-r border-b;
|
|
281
|
+
}
|
|
282
|
+
</style>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export default Tooltip;
|
|
2
|
+
type Tooltip = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Tooltip - A component for displaying additional information when hovering or focusing on an element.
|
|
8
|
+
* Provides accessible, configurable tooltips with various positions and styles.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <Tooltip content="This is a tooltip">
|
|
13
|
+
* <Button>Hover me</Button>
|
|
14
|
+
* </Tooltip>
|
|
15
|
+
*
|
|
16
|
+
* <Tooltip position="bottom" delay={300}>
|
|
17
|
+
* <svelte:fragment slot="content">
|
|
18
|
+
* <strong>Custom tooltip</strong> with HTML content
|
|
19
|
+
* </svelte:fragment>
|
|
20
|
+
* <span>Hover for more info</span>
|
|
21
|
+
* </Tooltip>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
declare const Tooltip: import("svelte").Component<{
|
|
25
|
+
class?: string;
|
|
26
|
+
id?: any;
|
|
27
|
+
content?: string;
|
|
28
|
+
position?: string;
|
|
29
|
+
delay?: number;
|
|
30
|
+
duration?: number;
|
|
31
|
+
arrow?: boolean;
|
|
32
|
+
offset?: number;
|
|
33
|
+
showOnFocus?: boolean;
|
|
34
|
+
ariaDescription: any;
|
|
35
|
+
onshow: any;
|
|
36
|
+
onhide: any;
|
|
37
|
+
children: any;
|
|
38
|
+
tooltipContent: any;
|
|
39
|
+
}, {}, "">;
|
|
40
|
+
type $$ComponentProps = {
|
|
41
|
+
class?: string;
|
|
42
|
+
id?: any;
|
|
43
|
+
content?: string;
|
|
44
|
+
position?: string;
|
|
45
|
+
delay?: number;
|
|
46
|
+
duration?: number;
|
|
47
|
+
arrow?: boolean;
|
|
48
|
+
offset?: number;
|
|
49
|
+
showOnFocus?: boolean;
|
|
50
|
+
ariaDescription: any;
|
|
51
|
+
onshow: any;
|
|
52
|
+
onhide: any;
|
|
53
|
+
children: any;
|
|
54
|
+
tooltipContent: any;
|
|
55
|
+
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Tree - A component for displaying hierarchical data with expandable nodes.
|
|
4
|
+
Provides consistent styling, accessibility features, and keyboard navigation.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Tree>
|
|
9
|
+
<TreeNode label="Root">
|
|
10
|
+
<TreeNode label="Child 1" />
|
|
11
|
+
<TreeNode label="Child 2">
|
|
12
|
+
<TreeNode label="Grandchild 1" />
|
|
13
|
+
<TreeNode label="Grandchild 2" />
|
|
14
|
+
</TreeNode>
|
|
15
|
+
</TreeNode>
|
|
16
|
+
</Tree>
|
|
17
|
+
|
|
18
|
+
<Tree
|
|
19
|
+
selectable
|
|
20
|
+
multiSelect
|
|
21
|
+
onselect={handleSelect}
|
|
22
|
+
>
|
|
23
|
+
<TreeNode
|
|
24
|
+
label="Documents"
|
|
25
|
+
icon="<svg>...</svg>"
|
|
26
|
+
expanded
|
|
27
|
+
>
|
|
28
|
+
<TreeNode label="Work" />
|
|
29
|
+
<TreeNode label="Personal" />
|
|
30
|
+
</TreeNode>
|
|
31
|
+
</Tree>
|
|
32
|
+
```
|
|
33
|
+
-->
|
|
34
|
+
<script>
|
|
35
|
+
import { setContext } from "svelte"
|
|
36
|
+
|
|
37
|
+
const {
|
|
38
|
+
/** @type {string} - Additional CSS classes */
|
|
39
|
+
class: className = "",
|
|
40
|
+
|
|
41
|
+
/** @type {string} - HTML id for accessibility */
|
|
42
|
+
id = crypto.randomUUID(),
|
|
43
|
+
|
|
44
|
+
/** @type {boolean} - Whether nodes can be selected */
|
|
45
|
+
selectable = false,
|
|
46
|
+
|
|
47
|
+
/** @type {boolean} - Whether multiple nodes can be selected */
|
|
48
|
+
multiSelect = false,
|
|
49
|
+
|
|
50
|
+
/** @type {Array} - Selected node keys */
|
|
51
|
+
selected = [],
|
|
52
|
+
|
|
53
|
+
/** @type {boolean} - Whether to show icons */
|
|
54
|
+
showIcons = true,
|
|
55
|
+
|
|
56
|
+
/** @type {boolean} - Whether to show lines connecting nodes */
|
|
57
|
+
showLines = true,
|
|
58
|
+
|
|
59
|
+
/** @type {string} - ARIA label for the tree */
|
|
60
|
+
ariaLabel = "Tree",
|
|
61
|
+
|
|
62
|
+
/** @type {(event: CustomEvent) => void} - Select event handler */
|
|
63
|
+
onselect,
|
|
64
|
+
|
|
65
|
+
children,
|
|
66
|
+
} = $props()
|
|
67
|
+
|
|
68
|
+
// Component state
|
|
69
|
+
let selectedNodes = $state(Array.isArray(selected) ? [...selected] : [])
|
|
70
|
+
|
|
71
|
+
// Provide context for child components
|
|
72
|
+
$effect(() => {
|
|
73
|
+
setContext("tree", {
|
|
74
|
+
selectable,
|
|
75
|
+
multiSelect,
|
|
76
|
+
showIcons,
|
|
77
|
+
showLines,
|
|
78
|
+
isSelected: (key) => selectedNodes.includes(key),
|
|
79
|
+
toggleSelection: (key) => {
|
|
80
|
+
if (selectable) {
|
|
81
|
+
if (selectedNodes.includes(key)) {
|
|
82
|
+
// Remove if already selected
|
|
83
|
+
if (multiSelect) {
|
|
84
|
+
selectedNodes = selectedNodes.filter((k) => k !== key)
|
|
85
|
+
} else {
|
|
86
|
+
// For single select, clicking the selected item again doesn't deselect it
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
// Add if not selected
|
|
90
|
+
if (multiSelect) {
|
|
91
|
+
selectedNodes = [...selectedNodes, key]
|
|
92
|
+
} else {
|
|
93
|
+
selectedNodes = [key]
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
onselect?.(new CustomEvent("select", { detail: { selected: selectedNodes } }))
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
// Update selected state when prop changes
|
|
104
|
+
$effect(() => {
|
|
105
|
+
selectedNodes = Array.isArray(selected) ? [...selected] : []
|
|
106
|
+
})
|
|
107
|
+
</script>
|
|
108
|
+
|
|
109
|
+
<div
|
|
110
|
+
{id}
|
|
111
|
+
class="
|
|
112
|
+
tree
|
|
113
|
+
{showLines ? 'tree-with-lines' : ''}
|
|
114
|
+
{className}
|
|
115
|
+
"
|
|
116
|
+
role="tree"
|
|
117
|
+
aria-label={ariaLabel}
|
|
118
|
+
aria-multiselectable={multiSelect}
|
|
119
|
+
>
|
|
120
|
+
{@render children?.()}
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
<style>
|
|
124
|
+
@reference "../../twintrinsic.css";
|
|
125
|
+
|
|
126
|
+
.tree {
|
|
127
|
+
@apply w-full;
|
|
128
|
+
}
|
|
129
|
+
</style>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export default Tree;
|
|
2
|
+
type Tree = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Tree - A component for displaying hierarchical data with expandable nodes.
|
|
8
|
+
* Provides consistent styling, accessibility features, and keyboard navigation.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <Tree>
|
|
13
|
+
* <TreeNode label="Root">
|
|
14
|
+
* <TreeNode label="Child 1" />
|
|
15
|
+
* <TreeNode label="Child 2">
|
|
16
|
+
* <TreeNode label="Grandchild 1" />
|
|
17
|
+
* <TreeNode label="Grandchild 2" />
|
|
18
|
+
* </TreeNode>
|
|
19
|
+
* </TreeNode>
|
|
20
|
+
* </Tree>
|
|
21
|
+
*
|
|
22
|
+
* <Tree
|
|
23
|
+
* selectable
|
|
24
|
+
* multiSelect
|
|
25
|
+
* onselect={handleSelect}
|
|
26
|
+
* >
|
|
27
|
+
* <TreeNode
|
|
28
|
+
* label="Documents"
|
|
29
|
+
* icon="<svg>...</svg>"
|
|
30
|
+
* expanded
|
|
31
|
+
* >
|
|
32
|
+
* <TreeNode label="Work" />
|
|
33
|
+
* <TreeNode label="Personal" />
|
|
34
|
+
* </TreeNode>
|
|
35
|
+
* </Tree>
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare const Tree: import("svelte").Component<{
|
|
39
|
+
class?: string;
|
|
40
|
+
id?: any;
|
|
41
|
+
selectable?: boolean;
|
|
42
|
+
multiSelect?: boolean;
|
|
43
|
+
selected?: any[];
|
|
44
|
+
showIcons?: boolean;
|
|
45
|
+
showLines?: boolean;
|
|
46
|
+
ariaLabel?: string;
|
|
47
|
+
onselect: any;
|
|
48
|
+
children: any;
|
|
49
|
+
}, {}, "">;
|
|
50
|
+
type $$ComponentProps = {
|
|
51
|
+
class?: string;
|
|
52
|
+
id?: any;
|
|
53
|
+
selectable?: boolean;
|
|
54
|
+
multiSelect?: boolean;
|
|
55
|
+
selected?: any[];
|
|
56
|
+
showIcons?: boolean;
|
|
57
|
+
showLines?: boolean;
|
|
58
|
+
ariaLabel?: string;
|
|
59
|
+
onselect: any;
|
|
60
|
+
children: any;
|
|
61
|
+
};
|