@miozu/jera 0.3.0 → 0.4.2
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 +350 -59
- package/README.md +30 -22
- package/llms.txt +37 -4
- package/package.json +12 -2
- package/src/components/docs/CodeBlock.svelte +203 -0
- package/src/components/docs/DocSection.svelte +120 -0
- package/src/components/docs/PropsTable.svelte +136 -0
- package/src/components/docs/SplitPane.svelte +98 -0
- package/src/components/docs/index.js +14 -0
- package/src/components/feedback/Alert.svelte +234 -0
- package/src/components/feedback/EmptyState.svelte +6 -6
- package/src/components/feedback/ProgressBar.svelte +8 -8
- package/src/components/feedback/Skeleton.svelte +4 -4
- package/src/components/feedback/Spinner.svelte +1 -1
- package/src/components/feedback/Toast.svelte +137 -173
- package/src/components/forms/Checkbox.svelte +10 -10
- package/src/components/forms/Dropzone.svelte +14 -14
- package/src/components/forms/FileUpload.svelte +16 -16
- package/src/components/forms/IconInput.svelte +4 -4
- package/src/components/forms/Input.svelte +14 -14
- package/src/components/forms/NumberInput.svelte +13 -13
- package/src/components/forms/PinInput.svelte +8 -8
- package/src/components/forms/Radio.svelte +8 -8
- package/src/components/forms/RangeSlider.svelte +12 -12
- package/src/components/forms/SearchInput.svelte +10 -10
- package/src/components/forms/Select.svelte +156 -158
- package/src/components/forms/Switch.svelte +4 -4
- package/src/components/forms/Textarea.svelte +9 -9
- package/src/components/navigation/Accordion.svelte +1 -1
- package/src/components/navigation/AccordionItem.svelte +6 -6
- package/src/components/navigation/NavigationContainer.svelte +344 -0
- package/src/components/navigation/Sidebar.svelte +334 -0
- package/src/components/navigation/SidebarAccountGroup.svelte +495 -0
- package/src/components/navigation/SidebarAccountItem.svelte +492 -0
- package/src/components/navigation/SidebarGroup.svelte +230 -0
- package/src/components/navigation/SidebarGroupSwitcher.svelte +262 -0
- package/src/components/navigation/SidebarItem.svelte +210 -0
- package/src/components/navigation/SidebarNavigationItem.svelte +470 -0
- package/src/components/navigation/SidebarPopover.svelte +145 -0
- package/src/components/navigation/SidebarSearch.svelte +236 -0
- package/src/components/navigation/SidebarSection.svelte +158 -0
- package/src/components/navigation/SidebarToggle.svelte +86 -0
- package/src/components/navigation/Tabs.svelte +18 -18
- package/src/components/navigation/WorkspaceMenu.svelte +416 -0
- package/src/components/navigation/blocks/NavigationAccountGroup.svelte +396 -0
- package/src/components/navigation/blocks/NavigationCustomBlock.svelte +74 -0
- package/src/components/navigation/blocks/NavigationGroupSwitcher.svelte +277 -0
- package/src/components/navigation/blocks/NavigationSearch.svelte +300 -0
- package/src/components/navigation/blocks/NavigationSection.svelte +230 -0
- package/src/components/navigation/index.js +22 -0
- package/src/components/overlays/ConfirmDialog.svelte +18 -18
- package/src/components/overlays/Dropdown.svelte +2 -2
- package/src/components/overlays/DropdownDivider.svelte +1 -1
- package/src/components/overlays/DropdownItem.svelte +5 -5
- package/src/components/overlays/Modal.svelte +13 -13
- package/src/components/overlays/Popover.svelte +3 -3
- package/src/components/primitives/Avatar.svelte +12 -12
- package/src/components/primitives/Badge.svelte +7 -7
- package/src/components/primitives/Button.svelte +126 -174
- package/src/components/primitives/Card.svelte +15 -15
- package/src/components/primitives/Divider.svelte +3 -3
- package/src/components/primitives/LazyImage.svelte +1 -1
- package/src/components/primitives/Link.svelte +2 -2
- package/src/components/primitives/Stat.svelte +197 -0
- package/src/components/primitives/StatusBadge.svelte +24 -24
- package/src/index.js +62 -7
- package/src/tokens/colors.css +96 -128
- package/src/utils/highlighter.js +124 -0
- package/src/utils/index.js +7 -2
- package/src/utils/navigation.svelte.js +423 -0
- package/src/utils/reactive.svelte.js +126 -37
- package/src/utils/sidebar.svelte.js +211 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component NavigationSection
|
|
3
|
+
|
|
4
|
+
Enterprise navigation section block with recursive item support.
|
|
5
|
+
-->
|
|
6
|
+
<script>
|
|
7
|
+
import { getContext } from 'svelte';
|
|
8
|
+
import { slide, fly } from 'svelte/transition';
|
|
9
|
+
import { cubicOut } from 'svelte/easing';
|
|
10
|
+
import { SIDEBAR_CONTEXT_KEY } from '../../../utils/sidebar.svelte.js';
|
|
11
|
+
import { NAVIGATION_CONTEXT_KEY } from '../../../utils/navigation.svelte.js';
|
|
12
|
+
import SidebarNavigationItem from '../SidebarNavigationItem.svelte';
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
block,
|
|
16
|
+
navigationState = null,
|
|
17
|
+
onEvent = null
|
|
18
|
+
} = $props();
|
|
19
|
+
|
|
20
|
+
const sidebar = getContext(SIDEBAR_CONTEXT_KEY);
|
|
21
|
+
const navContext = getContext(NAVIGATION_CONTEXT_KEY);
|
|
22
|
+
const navState = navigationState || navContext;
|
|
23
|
+
|
|
24
|
+
const isCollapsed = $derived(sidebar?.collapsed ?? false);
|
|
25
|
+
|
|
26
|
+
// Block configuration with defaults
|
|
27
|
+
const config = $derived({
|
|
28
|
+
title: block.title || '',
|
|
29
|
+
collapsible: block.collapsible ?? true,
|
|
30
|
+
defaultExpanded: block.defaultExpanded ?? true,
|
|
31
|
+
showCount: block.showCount ?? true,
|
|
32
|
+
maxDepth: block.maxDepth ?? 10,
|
|
33
|
+
searchable: block.searchable ?? true,
|
|
34
|
+
...block.config
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Items from block configuration
|
|
38
|
+
const items = $derived(block.items || []);
|
|
39
|
+
|
|
40
|
+
// Filter items if searchable and search is active
|
|
41
|
+
const filteredItems = $derived.by(() => {
|
|
42
|
+
if (!config.searchable || !navState?.searchQuery) return items;
|
|
43
|
+
return navState.filteredItems.filter(item =>
|
|
44
|
+
items.some(blockItem => blockItem.id === item.id)
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Section expansion state
|
|
49
|
+
const sectionId = block.id;
|
|
50
|
+
const isExpanded = $derived(
|
|
51
|
+
config.collapsible
|
|
52
|
+
? (navState?.isSectionExpanded(sectionId) ?? config.defaultExpanded)
|
|
53
|
+
: true
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
function toggleSection() {
|
|
57
|
+
if (!config.collapsible) return;
|
|
58
|
+
|
|
59
|
+
if (navState) {
|
|
60
|
+
navState.toggleSection(sectionId);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (onEvent) {
|
|
64
|
+
onEvent('section_toggled', { sectionId, expanded: !isExpanded });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function handleItemNavigate(item, event) {
|
|
69
|
+
if (onEvent) {
|
|
70
|
+
const result = onEvent('item_navigate', { item, event });
|
|
71
|
+
if (result === false) return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return true; // Continue with default navigation
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function handleItemToggle(item, expanded) {
|
|
78
|
+
if (onEvent) {
|
|
79
|
+
onEvent('item_toggled', { item, expanded });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
</script>
|
|
83
|
+
|
|
84
|
+
<div class="nav-section-block">
|
|
85
|
+
{#if config.title && !isCollapsed}
|
|
86
|
+
<button
|
|
87
|
+
class="section-header"
|
|
88
|
+
class:collapsible={config.collapsible}
|
|
89
|
+
onclick={toggleSection}
|
|
90
|
+
disabled={!config.collapsible}
|
|
91
|
+
aria-expanded={config.collapsible ? isExpanded : undefined}
|
|
92
|
+
>
|
|
93
|
+
<span class="section-title">{config.title}</span>
|
|
94
|
+
|
|
95
|
+
{#if config.showCount && filteredItems.length > 0}
|
|
96
|
+
<span class="section-count">{filteredItems.length}</span>
|
|
97
|
+
{/if}
|
|
98
|
+
|
|
99
|
+
{#if config.collapsible}
|
|
100
|
+
<svg
|
|
101
|
+
class="section-chevron {isExpanded ? 'expanded' : 'collapsed'}"
|
|
102
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
103
|
+
width="14"
|
|
104
|
+
height="14"
|
|
105
|
+
viewBox="0 0 24 24"
|
|
106
|
+
fill="none"
|
|
107
|
+
stroke="currentColor"
|
|
108
|
+
stroke-width="2"
|
|
109
|
+
stroke-linecap="round"
|
|
110
|
+
stroke-linejoin="round"
|
|
111
|
+
>
|
|
112
|
+
<polyline points="6 9 12 15 18 9"></polyline>
|
|
113
|
+
</svg>
|
|
114
|
+
{/if}
|
|
115
|
+
</button>
|
|
116
|
+
{:else if config.title && isCollapsed}
|
|
117
|
+
<div class="section-divider" title={config.title}></div>
|
|
118
|
+
{/if}
|
|
119
|
+
|
|
120
|
+
{#if isExpanded}
|
|
121
|
+
<ul
|
|
122
|
+
class="section-items"
|
|
123
|
+
transition:slide={{ duration: 200, easing: cubicOut }}
|
|
124
|
+
>
|
|
125
|
+
{#each filteredItems as item (item.id)}
|
|
126
|
+
<SidebarNavigationItem
|
|
127
|
+
{item}
|
|
128
|
+
{navigationState}
|
|
129
|
+
maxDepth={config.maxDepth}
|
|
130
|
+
onNavigate={handleItemNavigate}
|
|
131
|
+
onToggle={handleItemToggle}
|
|
132
|
+
/>
|
|
133
|
+
{/each}
|
|
134
|
+
|
|
135
|
+
{#if filteredItems.length === 0 && items.length > 0}
|
|
136
|
+
<li class="no-results">
|
|
137
|
+
<div class="no-results-content">
|
|
138
|
+
<span class="no-results-text">No matching items</span>
|
|
139
|
+
</div>
|
|
140
|
+
</li>
|
|
141
|
+
{/if}
|
|
142
|
+
</ul>
|
|
143
|
+
{/if}
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<style>
|
|
147
|
+
.nav-section-block {
|
|
148
|
+
margin-bottom: var(--nav-block-spacing, 0.5rem);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.section-header {
|
|
152
|
+
width: 100%;
|
|
153
|
+
display: flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
gap: 0.5rem;
|
|
156
|
+
padding: 0.5rem 0.75rem;
|
|
157
|
+
font-size: 0.75rem;
|
|
158
|
+
font-weight: 600;
|
|
159
|
+
color: var(--color-text-muted, var(--color-base04, #737E99));
|
|
160
|
+
text-transform: uppercase;
|
|
161
|
+
letter-spacing: 0.05em;
|
|
162
|
+
border: none;
|
|
163
|
+
background: transparent;
|
|
164
|
+
font-family: inherit;
|
|
165
|
+
justify-content: flex-start;
|
|
166
|
+
transition: all var(--nav-transition-duration, 200ms) var(--nav-transition-easing, ease);
|
|
167
|
+
cursor: default;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.section-header.collapsible {
|
|
171
|
+
cursor: pointer;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.section-header.collapsible:hover {
|
|
175
|
+
color: var(--color-text, var(--color-base05, #D0D2DB));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.section-title {
|
|
179
|
+
flex: 1;
|
|
180
|
+
text-align: left;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.section-count {
|
|
184
|
+
padding: 0.125rem 0.375rem;
|
|
185
|
+
font-size: 0.625rem;
|
|
186
|
+
background: var(--color-surface-alt, var(--color-base02, #3E4359));
|
|
187
|
+
color: var(--color-text-muted, var(--color-base05, #D0D2DB));
|
|
188
|
+
border-radius: 9999px;
|
|
189
|
+
flex-shrink: 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.section-chevron {
|
|
193
|
+
color: var(--color-text-muted, var(--color-base04, #737E99));
|
|
194
|
+
transition: all var(--nav-transition-duration, 200ms) var(--nav-transition-easing, ease);
|
|
195
|
+
flex-shrink: 0;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.section-chevron.expanded {
|
|
199
|
+
transform: rotate(180deg);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.section-divider {
|
|
203
|
+
margin: 0.5rem 0.75rem;
|
|
204
|
+
border-bottom: 1px solid color-mix(in srgb, var(--color-base03, #565E78) 30%, transparent);
|
|
205
|
+
height: 1px;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.section-items {
|
|
209
|
+
list-style: none;
|
|
210
|
+
margin: 0;
|
|
211
|
+
padding: 0;
|
|
212
|
+
display: flex;
|
|
213
|
+
flex-direction: column;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.no-results {
|
|
217
|
+
list-style: none;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.no-results-content {
|
|
221
|
+
padding: 1rem 0.75rem;
|
|
222
|
+
text-align: center;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.no-results-text {
|
|
226
|
+
font-size: 0.875rem;
|
|
227
|
+
color: var(--color-text-muted, var(--color-base05, #D0D2DB));
|
|
228
|
+
font-style: italic;
|
|
229
|
+
}
|
|
230
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigation Components
|
|
3
|
+
*
|
|
4
|
+
* Reusable navigation components including sidebars, tabs, and accordions.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Sidebar Components
|
|
8
|
+
export { default as Sidebar } from './Sidebar.svelte';
|
|
9
|
+
export { default as SidebarSection } from './SidebarSection.svelte';
|
|
10
|
+
export { default as SidebarItem } from './SidebarItem.svelte';
|
|
11
|
+
export { default as SidebarGroup } from './SidebarGroup.svelte';
|
|
12
|
+
export { default as SidebarPopover } from './SidebarPopover.svelte';
|
|
13
|
+
export { default as SidebarAccountItem } from './SidebarAccountItem.svelte';
|
|
14
|
+
export { default as SidebarToggle } from './SidebarToggle.svelte';
|
|
15
|
+
|
|
16
|
+
// Enterprise Components
|
|
17
|
+
export { default as WorkspaceMenu } from './WorkspaceMenu.svelte';
|
|
18
|
+
|
|
19
|
+
// Other Navigation Components
|
|
20
|
+
export { default as Tabs } from './Tabs.svelte';
|
|
21
|
+
export { default as Accordion } from './Accordion.svelte';
|
|
22
|
+
export { default as AccordionItem } from './AccordionItem.svelte';
|
|
@@ -49,28 +49,28 @@
|
|
|
49
49
|
|
|
50
50
|
const variantConfig = $derived({
|
|
51
51
|
danger: {
|
|
52
|
-
iconColor: 'var(--color-
|
|
53
|
-
iconBg: 'color-mix(in srgb, var(--color-
|
|
52
|
+
iconColor: 'var(--color-base08)',
|
|
53
|
+
iconBg: 'color-mix(in srgb, var(--color-base08) 10%, transparent)',
|
|
54
54
|
buttonVariant: 'danger'
|
|
55
55
|
},
|
|
56
56
|
warning: {
|
|
57
|
-
iconColor: 'var(--color-
|
|
58
|
-
iconBg: 'color-mix(in srgb, var(--color-
|
|
57
|
+
iconColor: 'var(--color-base0A)',
|
|
58
|
+
iconBg: 'color-mix(in srgb, var(--color-base0A) 10%, transparent)',
|
|
59
59
|
buttonVariant: 'primary'
|
|
60
60
|
},
|
|
61
61
|
success: {
|
|
62
|
-
iconColor: 'var(--color-
|
|
63
|
-
iconBg: 'color-mix(in srgb, var(--color-
|
|
62
|
+
iconColor: 'var(--color-base0B)',
|
|
63
|
+
iconBg: 'color-mix(in srgb, var(--color-base0B) 10%, transparent)',
|
|
64
64
|
buttonVariant: 'success'
|
|
65
65
|
},
|
|
66
66
|
info: {
|
|
67
|
-
iconColor: 'var(--color-
|
|
68
|
-
iconBg: 'color-mix(in srgb, var(--color-
|
|
67
|
+
iconColor: 'var(--color-base0D)',
|
|
68
|
+
iconBg: 'color-mix(in srgb, var(--color-base0D) 10%, transparent)',
|
|
69
69
|
buttonVariant: 'primary'
|
|
70
70
|
}
|
|
71
71
|
}[variant] || {
|
|
72
|
-
iconColor: 'var(--color-
|
|
73
|
-
iconBg: 'color-mix(in srgb, var(--color-
|
|
72
|
+
iconColor: 'var(--color-base0D)',
|
|
73
|
+
iconBg: 'color-mix(in srgb, var(--color-base0D) 10%, transparent)',
|
|
74
74
|
buttonVariant: 'primary'
|
|
75
75
|
});
|
|
76
76
|
|
|
@@ -179,14 +179,14 @@
|
|
|
179
179
|
content: '';
|
|
180
180
|
position: absolute;
|
|
181
181
|
inset: 0;
|
|
182
|
-
background: color-mix(in srgb, var(--color-
|
|
182
|
+
background: color-mix(in srgb, var(--color-base00) 80%, transparent);
|
|
183
183
|
backdrop-filter: blur(8px);
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
.confirm-dialog {
|
|
187
187
|
position: relative;
|
|
188
|
-
background: var(--color-
|
|
189
|
-
border: 1px solid var(--color-
|
|
188
|
+
background: var(--color-base01);
|
|
189
|
+
border: 1px solid var(--color-base02);
|
|
190
190
|
border-radius: var(--radius-xl);
|
|
191
191
|
box-shadow: var(--shadow-2xl);
|
|
192
192
|
width: 100%;
|
|
@@ -214,14 +214,14 @@
|
|
|
214
214
|
background: transparent;
|
|
215
215
|
border: none;
|
|
216
216
|
border-radius: var(--radius-lg);
|
|
217
|
-
color: var(--color-
|
|
217
|
+
color: var(--color-base04);
|
|
218
218
|
cursor: pointer;
|
|
219
219
|
transition: background 0.15s ease, color 0.15s ease;
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
.confirm-close:hover {
|
|
223
|
-
background: var(--color-
|
|
224
|
-
color: var(--color-
|
|
223
|
+
background: var(--color-base02);
|
|
224
|
+
color: var(--color-base05);
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
.confirm-content {
|
|
@@ -253,13 +253,13 @@
|
|
|
253
253
|
margin: 0 0 var(--space-2) 0;
|
|
254
254
|
font-size: var(--text-lg);
|
|
255
255
|
font-weight: 600;
|
|
256
|
-
color: var(--color-
|
|
256
|
+
color: var(--color-base07);
|
|
257
257
|
}
|
|
258
258
|
|
|
259
259
|
.confirm-message {
|
|
260
260
|
margin: 0;
|
|
261
261
|
font-size: var(--text-sm);
|
|
262
|
-
color: var(--color-
|
|
262
|
+
color: var(--color-base04);
|
|
263
263
|
line-height: 1.5;
|
|
264
264
|
}
|
|
265
265
|
|
|
@@ -77,8 +77,8 @@
|
|
|
77
77
|
z-index: 50;
|
|
78
78
|
min-width: 10rem;
|
|
79
79
|
padding: var(--space-1);
|
|
80
|
-
background: var(--color-
|
|
81
|
-
border: 1px solid var(--color-
|
|
80
|
+
background: var(--color-base00);
|
|
81
|
+
border: 1px solid var(--color-base03);
|
|
82
82
|
border-radius: var(--radius-lg);
|
|
83
83
|
box-shadow: var(--shadow-lg);
|
|
84
84
|
animation: dropdown-enter 0.15s ease-out;
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
padding: var(--space-2) var(--space-3);
|
|
55
55
|
font-size: var(--text-sm);
|
|
56
56
|
text-align: left;
|
|
57
|
-
color: var(--color-
|
|
57
|
+
color: var(--color-base05);
|
|
58
58
|
background: transparent;
|
|
59
59
|
border: none;
|
|
60
60
|
border-radius: var(--radius-md);
|
|
@@ -63,12 +63,12 @@
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
.dropdown-item:hover:not(:disabled) {
|
|
66
|
-
background: var(--color-
|
|
66
|
+
background: var(--color-base02);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
.dropdown-item:focus-visible {
|
|
70
70
|
outline: none;
|
|
71
|
-
background: var(--color-
|
|
71
|
+
background: var(--color-base02);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
.dropdown-item-disabled {
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
.dropdown-item-danger {
|
|
80
|
-
color: var(--color-
|
|
80
|
+
color: var(--color-base08);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
.dropdown-item-danger:hover:not(:disabled) {
|
|
84
|
-
background: color-mix(in srgb, var(--color-
|
|
84
|
+
background: color-mix(in srgb, var(--color-base08) 10%, transparent);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
.dropdown-item-icon {
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
|
|
34
34
|
// Variant styles for the icon container
|
|
35
35
|
const iconVariants = {
|
|
36
|
-
default: { bg: 'var(--color-
|
|
37
|
-
danger: { bg: 'color-mix(in srgb, var(--color-
|
|
38
|
-
warning: { bg: 'color-mix(in srgb, var(--color-
|
|
39
|
-
success: { bg: 'color-mix(in srgb, var(--color-
|
|
40
|
-
info: { bg: 'color-mix(in srgb, var(--color-
|
|
36
|
+
default: { bg: 'var(--color-base02)', color: 'var(--color-base05)' },
|
|
37
|
+
danger: { bg: 'color-mix(in srgb, var(--color-base08) 10%, transparent)', color: 'var(--color-base08)' },
|
|
38
|
+
warning: { bg: 'color-mix(in srgb, var(--color-base0A) 10%, transparent)', color: 'var(--color-base0A)' },
|
|
39
|
+
success: { bg: 'color-mix(in srgb, var(--color-base0B) 10%, transparent)', color: 'var(--color-base0B)' },
|
|
40
|
+
info: { bg: 'color-mix(in srgb, var(--color-base0D) 10%, transparent)', color: 'var(--color-base0D)' }
|
|
41
41
|
};
|
|
42
42
|
|
|
43
43
|
const iconStyle = $derived(iconVariants[variant] || iconVariants.default);
|
|
@@ -134,16 +134,16 @@
|
|
|
134
134
|
display: flex;
|
|
135
135
|
align-items: center;
|
|
136
136
|
justify-content: center;
|
|
137
|
-
background: color-mix(in srgb, var(--color-
|
|
137
|
+
background: color-mix(in srgb, var(--color-base00) 80%, transparent);
|
|
138
138
|
backdrop-filter: blur(4px);
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
.modal {
|
|
142
142
|
position: relative;
|
|
143
|
-
background: var(--color-
|
|
143
|
+
background: var(--color-base01);
|
|
144
144
|
border-radius: 0.75rem;
|
|
145
145
|
box-shadow: var(--shadow-2xl);
|
|
146
|
-
border: 1px solid var(--color-
|
|
146
|
+
border: 1px solid var(--color-base03);
|
|
147
147
|
margin: 1rem;
|
|
148
148
|
animation: modal-enter 0.2s ease-out;
|
|
149
149
|
}
|
|
@@ -163,14 +163,14 @@
|
|
|
163
163
|
background: transparent;
|
|
164
164
|
border: none;
|
|
165
165
|
border-radius: 0.5rem;
|
|
166
|
-
color: var(--color-
|
|
166
|
+
color: var(--color-base05);
|
|
167
167
|
cursor: pointer;
|
|
168
168
|
transition: background 0.15s, color 0.15s;
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
.modal-close:hover {
|
|
172
|
-
background: var(--color-
|
|
173
|
-
color: var(--color-
|
|
172
|
+
background: var(--color-base02);
|
|
173
|
+
color: var(--color-base07);
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
.modal-content {
|
|
@@ -202,13 +202,13 @@
|
|
|
202
202
|
margin: 0 0 0.5rem 0;
|
|
203
203
|
font-size: 1.125rem;
|
|
204
204
|
font-weight: 600;
|
|
205
|
-
color: var(--color-
|
|
205
|
+
color: var(--color-base07);
|
|
206
206
|
line-height: 1.4;
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
.modal-body {
|
|
210
210
|
font-size: 0.875rem;
|
|
211
|
-
color: var(--color-
|
|
211
|
+
color: var(--color-base05);
|
|
212
212
|
line-height: 1.5;
|
|
213
213
|
}
|
|
214
214
|
|
|
@@ -192,13 +192,13 @@
|
|
|
192
192
|
max-width: 18rem;
|
|
193
193
|
width: max-content;
|
|
194
194
|
padding: 0.5rem 0.75rem;
|
|
195
|
-
background: var(--color-
|
|
196
|
-
color: var(--color-
|
|
195
|
+
background: var(--color-base01);
|
|
196
|
+
color: var(--color-base07);
|
|
197
197
|
font-size: 0.875rem;
|
|
198
198
|
line-height: 1.5;
|
|
199
199
|
border-radius: 0.5rem;
|
|
200
200
|
box-shadow: var(--shadow-lg);
|
|
201
|
-
border: 1px solid var(--color-
|
|
201
|
+
border: 1px solid var(--color-base03);
|
|
202
202
|
pointer-events: auto;
|
|
203
203
|
word-wrap: break-word;
|
|
204
204
|
hyphens: auto;
|
|
@@ -36,20 +36,20 @@
|
|
|
36
36
|
|
|
37
37
|
// Generate consistent color from name
|
|
38
38
|
const bgColor = $derived.by(() => {
|
|
39
|
-
if (!name) return 'var(--color-
|
|
39
|
+
if (!name) return 'var(--color-base03)';
|
|
40
40
|
let hash = 0;
|
|
41
41
|
for (let i = 0; i < name.length; i++) {
|
|
42
42
|
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
|
43
43
|
}
|
|
44
44
|
const colors = [
|
|
45
|
-
'var(--color-
|
|
45
|
+
'var(--color-base08)', // red
|
|
46
46
|
'var(--orange)', // orange
|
|
47
|
-
'var(--color-
|
|
48
|
-
'var(--color-
|
|
49
|
-
'var(--color-
|
|
50
|
-
'var(--color-
|
|
47
|
+
'var(--color-base0B)', // green
|
|
48
|
+
'var(--color-base0A)', // yellow
|
|
49
|
+
'var(--color-base0D)', // blue
|
|
50
|
+
'var(--color-base0D)', // magenta
|
|
51
51
|
'var(--peach)', // peach
|
|
52
|
-
'var(--color-
|
|
52
|
+
'var(--color-base0E)' // cyan
|
|
53
53
|
];
|
|
54
54
|
return colors[Math.abs(hash) % colors.length];
|
|
55
55
|
});
|
|
@@ -122,11 +122,11 @@
|
|
|
122
122
|
min-width: 8px;
|
|
123
123
|
min-height: 8px;
|
|
124
124
|
border-radius: 50%;
|
|
125
|
-
border: 2px solid var(--color-
|
|
125
|
+
border: 2px solid var(--color-base00);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
.avatar-status-online { background: var(--color-
|
|
129
|
-
.avatar-status-offline { background: var(--color-
|
|
130
|
-
.avatar-status-busy { background: var(--color-
|
|
131
|
-
.avatar-status-away { background: var(--color-
|
|
128
|
+
.avatar-status-online { background: var(--color-base0B); }
|
|
129
|
+
.avatar-status-offline { background: var(--color-base04); }
|
|
130
|
+
.avatar-status-busy { background: var(--color-base08); }
|
|
131
|
+
.avatar-status-away { background: var(--color-base0A); }
|
|
132
132
|
</style>
|
|
@@ -32,13 +32,13 @@
|
|
|
32
32
|
|
|
33
33
|
variants: {
|
|
34
34
|
variant: {
|
|
35
|
-
default: 'bg-[var(--color-
|
|
36
|
-
primary: 'bg-[color-mix(in_srgb,var(--color-
|
|
37
|
-
secondary: 'bg-[color-mix(in_srgb,var(--color-
|
|
38
|
-
success: 'bg-[color-mix(in_srgb,var(--color-
|
|
39
|
-
warning: 'bg-[color-mix(in_srgb,var(--color-
|
|
40
|
-
error: 'bg-[color-mix(in_srgb,var(--color-
|
|
41
|
-
info: 'bg-[color-mix(in_srgb,var(--color-
|
|
35
|
+
default: 'bg-[var(--color-base02)] text-[var(--color-base05)]',
|
|
36
|
+
primary: 'bg-[color-mix(in_srgb,var(--color-base0D)_15%,transparent)] text-[var(--color-base0D)]',
|
|
37
|
+
secondary: 'bg-[color-mix(in_srgb,var(--color-base0C)_15%,transparent)] text-[var(--color-base0C)]',
|
|
38
|
+
success: 'bg-[color-mix(in_srgb,var(--color-base0B)_15%,transparent)] text-[var(--color-base0B)]',
|
|
39
|
+
warning: 'bg-[color-mix(in_srgb,var(--color-base0A)_15%,transparent)] text-[var(--color-base0A)]',
|
|
40
|
+
error: 'bg-[color-mix(in_srgb,var(--color-base08)_15%,transparent)] text-[var(--color-base08)]',
|
|
41
|
+
info: 'bg-[color-mix(in_srgb,var(--color-base0D)_15%,transparent)] text-[var(--color-base0D)]'
|
|
42
42
|
},
|
|
43
43
|
|
|
44
44
|
size: {
|