@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.
@@ -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
  // ============================================