@miozu/jera 0.7.1 → 0.8.0
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/CLAUDE.md +59 -800
- package/package.json +4 -6
- package/src/components/layout/PageHeader.svelte +293 -0
- package/src/components/layout/SettingCard.svelte +153 -0
- package/src/components/navigation/ScrollNav.svelte +174 -0
- package/src/components/navigation/TabNav.svelte +248 -0
- package/src/components/primitives/FilterChip.svelte +162 -0
- package/src/components/primitives/LinkCard.svelte +94 -0
- package/src/components/primitives/MemberCard.svelte +291 -0
- package/src/components/primitives/MetricCard.svelte +266 -0
- package/src/components/primitives/StatusLine.svelte +121 -0
- package/src/components/primitives/Tooltip.svelte +201 -0
- package/src/index.js +15 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component Tooltip
|
|
3
|
+
|
|
4
|
+
A fast, accessible tooltip that appears on hover.
|
|
5
|
+
Supports multiple positions and custom content.
|
|
6
|
+
|
|
7
|
+
@example Basic tooltip
|
|
8
|
+
<Tooltip text="Edit this item">
|
|
9
|
+
<Button>Edit</Button>
|
|
10
|
+
</Tooltip>
|
|
11
|
+
|
|
12
|
+
@example Different positions
|
|
13
|
+
<Tooltip text="Top tooltip" position="top">
|
|
14
|
+
<span>Hover me</span>
|
|
15
|
+
</Tooltip>
|
|
16
|
+
|
|
17
|
+
<Tooltip text="Right tooltip" position="right">
|
|
18
|
+
<span>Hover me</span>
|
|
19
|
+
</Tooltip>
|
|
20
|
+
|
|
21
|
+
@example With custom delay
|
|
22
|
+
<Tooltip text="Delayed tooltip" delay={500}>
|
|
23
|
+
<Button>Hover</Button>
|
|
24
|
+
</Tooltip>
|
|
25
|
+
|
|
26
|
+
@example Rich content
|
|
27
|
+
<Tooltip>
|
|
28
|
+
{#snippet content()}
|
|
29
|
+
<div class="tooltip-rich">
|
|
30
|
+
<strong>Title</strong>
|
|
31
|
+
<p>Description text here</p>
|
|
32
|
+
</div>
|
|
33
|
+
{/snippet}
|
|
34
|
+
<Button>Info</Button>
|
|
35
|
+
</Tooltip>
|
|
36
|
+
-->
|
|
37
|
+
<script>
|
|
38
|
+
let {
|
|
39
|
+
text = '',
|
|
40
|
+
position = 'top',
|
|
41
|
+
delay = 50,
|
|
42
|
+
disabled = false,
|
|
43
|
+
class: className = '',
|
|
44
|
+
content,
|
|
45
|
+
children
|
|
46
|
+
} = $props();
|
|
47
|
+
|
|
48
|
+
let visible = $state(false);
|
|
49
|
+
let timeout = null;
|
|
50
|
+
|
|
51
|
+
function show() {
|
|
52
|
+
if (disabled) return;
|
|
53
|
+
timeout = setTimeout(() => {
|
|
54
|
+
visible = true;
|
|
55
|
+
}, delay);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function hide() {
|
|
59
|
+
if (timeout) {
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
timeout = null;
|
|
62
|
+
}
|
|
63
|
+
visible = false;
|
|
64
|
+
}
|
|
65
|
+
</script>
|
|
66
|
+
|
|
67
|
+
<div
|
|
68
|
+
class="tooltip-wrapper {className}"
|
|
69
|
+
onmouseenter={show}
|
|
70
|
+
onmouseleave={hide}
|
|
71
|
+
onfocus={show}
|
|
72
|
+
onblur={hide}
|
|
73
|
+
>
|
|
74
|
+
{#if children}
|
|
75
|
+
{@render children()}
|
|
76
|
+
{/if}
|
|
77
|
+
|
|
78
|
+
{#if visible && (text || content)}
|
|
79
|
+
<div class="tooltip tooltip-{position}" role="tooltip">
|
|
80
|
+
<div class="tooltip-content">
|
|
81
|
+
{#if content}
|
|
82
|
+
{@render content()}
|
|
83
|
+
{:else}
|
|
84
|
+
{text}
|
|
85
|
+
{/if}
|
|
86
|
+
</div>
|
|
87
|
+
<div class="tooltip-arrow"></div>
|
|
88
|
+
</div>
|
|
89
|
+
{/if}
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<style>
|
|
93
|
+
.tooltip-wrapper {
|
|
94
|
+
position: relative;
|
|
95
|
+
display: inline-flex;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.tooltip {
|
|
99
|
+
position: absolute;
|
|
100
|
+
z-index: 50;
|
|
101
|
+
pointer-events: none;
|
|
102
|
+
animation: tooltip-enter 0.15s ease-out;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@keyframes tooltip-enter {
|
|
106
|
+
from {
|
|
107
|
+
opacity: 0;
|
|
108
|
+
transform: scale(0.95);
|
|
109
|
+
}
|
|
110
|
+
to {
|
|
111
|
+
opacity: 1;
|
|
112
|
+
transform: scale(1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.tooltip-content {
|
|
117
|
+
padding: var(--space-2) var(--space-3);
|
|
118
|
+
font-size: var(--text-xs);
|
|
119
|
+
font-weight: 500;
|
|
120
|
+
color: var(--color-base06);
|
|
121
|
+
background: var(--color-base01);
|
|
122
|
+
border: 1px solid var(--color-base02);
|
|
123
|
+
border-radius: var(--radius-md);
|
|
124
|
+
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
|
125
|
+
white-space: nowrap;
|
|
126
|
+
max-width: 20rem;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.tooltip-arrow {
|
|
130
|
+
position: absolute;
|
|
131
|
+
width: 8px;
|
|
132
|
+
height: 8px;
|
|
133
|
+
background: var(--color-base01);
|
|
134
|
+
border: 1px solid var(--color-base02);
|
|
135
|
+
transform: rotate(45deg);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Position: Top */
|
|
139
|
+
.tooltip-top {
|
|
140
|
+
bottom: 100%;
|
|
141
|
+
left: 50%;
|
|
142
|
+
transform: translateX(-50%);
|
|
143
|
+
margin-bottom: var(--space-2);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.tooltip-top .tooltip-arrow {
|
|
147
|
+
bottom: -5px;
|
|
148
|
+
left: 50%;
|
|
149
|
+
transform: translateX(-50%) rotate(45deg);
|
|
150
|
+
border-top: none;
|
|
151
|
+
border-left: none;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* Position: Bottom */
|
|
155
|
+
.tooltip-bottom {
|
|
156
|
+
top: 100%;
|
|
157
|
+
left: 50%;
|
|
158
|
+
transform: translateX(-50%);
|
|
159
|
+
margin-top: var(--space-2);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.tooltip-bottom .tooltip-arrow {
|
|
163
|
+
top: -5px;
|
|
164
|
+
left: 50%;
|
|
165
|
+
transform: translateX(-50%) rotate(45deg);
|
|
166
|
+
border-bottom: none;
|
|
167
|
+
border-right: none;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Position: Left */
|
|
171
|
+
.tooltip-left {
|
|
172
|
+
right: 100%;
|
|
173
|
+
top: 50%;
|
|
174
|
+
transform: translateY(-50%);
|
|
175
|
+
margin-right: var(--space-2);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.tooltip-left .tooltip-arrow {
|
|
179
|
+
right: -5px;
|
|
180
|
+
top: 50%;
|
|
181
|
+
transform: translateY(-50%) rotate(45deg);
|
|
182
|
+
border-left: none;
|
|
183
|
+
border-bottom: none;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* Position: Right */
|
|
187
|
+
.tooltip-right {
|
|
188
|
+
left: 100%;
|
|
189
|
+
top: 50%;
|
|
190
|
+
transform: translateY(-50%);
|
|
191
|
+
margin-left: var(--space-2);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.tooltip-right .tooltip-arrow {
|
|
195
|
+
left: -5px;
|
|
196
|
+
top: 50%;
|
|
197
|
+
transform: translateY(-50%) rotate(45deg);
|
|
198
|
+
border-right: none;
|
|
199
|
+
border-top: none;
|
|
200
|
+
}
|
|
201
|
+
</style>
|
package/src/index.js
CHANGED
|
@@ -33,7 +33,13 @@ export { default as Avatar } from './components/primitives/Avatar.svelte';
|
|
|
33
33
|
export { default as Card } from './components/primitives/Card.svelte';
|
|
34
34
|
export { default as Stat } from './components/primitives/Stat.svelte';
|
|
35
35
|
export { default as Link } from './components/primitives/Link.svelte';
|
|
36
|
+
export { default as LinkCard } from './components/primitives/LinkCard.svelte';
|
|
36
37
|
export { default as LazyImage } from './components/primitives/LazyImage.svelte';
|
|
38
|
+
export { default as MetricCard } from './components/primitives/MetricCard.svelte';
|
|
39
|
+
export { default as FilterChip } from './components/primitives/FilterChip.svelte';
|
|
40
|
+
export { default as StatusLine } from './components/primitives/StatusLine.svelte';
|
|
41
|
+
export { default as Tooltip } from './components/primitives/Tooltip.svelte';
|
|
42
|
+
export { default as MemberCard } from './components/primitives/MemberCard.svelte';
|
|
37
43
|
|
|
38
44
|
// ============================================
|
|
39
45
|
// COMPONENTS - Forms
|
|
@@ -87,6 +93,8 @@ export { default as ConfirmDialog } from './components/overlays/ConfirmDialog.sv
|
|
|
87
93
|
// ============================================
|
|
88
94
|
|
|
89
95
|
export { default as Tabs } from './components/navigation/Tabs.svelte';
|
|
96
|
+
export { default as TabNav } from './components/navigation/TabNav.svelte';
|
|
97
|
+
export { default as ScrollNav } from './components/navigation/ScrollNav.svelte';
|
|
90
98
|
export { default as Accordion } from './components/navigation/Accordion.svelte';
|
|
91
99
|
export { default as AccordionItem } from './components/navigation/AccordionItem.svelte';
|
|
92
100
|
|
|
@@ -125,6 +133,13 @@ export { default as LeftBarToggle } from './components/navigation/LeftBarToggle.
|
|
|
125
133
|
export { default as LeftBarPopover } from './components/navigation/LeftBarPopover.svelte';
|
|
126
134
|
export { default as DropdownContainer } from './components/navigation/DropdownContainer.svelte';
|
|
127
135
|
|
|
136
|
+
// ============================================
|
|
137
|
+
// COMPONENTS - Layout
|
|
138
|
+
// ============================================
|
|
139
|
+
|
|
140
|
+
export { default as PageHeader } from './components/layout/PageHeader.svelte';
|
|
141
|
+
export { default as SettingCard } from './components/layout/SettingCard.svelte';
|
|
142
|
+
|
|
128
143
|
// ============================================
|
|
129
144
|
// COMPONENTS - Documentation
|
|
130
145
|
// ============================================
|