@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,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sidebar State Management
|
|
3
|
+
*
|
|
4
|
+
* Provides reactive state management for sidebar components.
|
|
5
|
+
* Uses Svelte 5 runes for fine-grained reactivity.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const sidebar = createSidebarState({ persistKey: 'my-sidebar' });
|
|
9
|
+
*
|
|
10
|
+
* // In component
|
|
11
|
+
* sidebar.toggle();
|
|
12
|
+
* console.log(sidebar.collapsed); // true/false
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Create a reactive sidebar state manager
|
|
17
|
+
*
|
|
18
|
+
* @param {Object} options
|
|
19
|
+
* @param {boolean} [options.collapsed=false] - Initial collapsed state
|
|
20
|
+
* @param {string|null} [options.persistKey=null] - localStorage key for persistence
|
|
21
|
+
* @returns {Object} Sidebar state object with reactive properties and methods
|
|
22
|
+
*/
|
|
23
|
+
export function createSidebarState(options = {}) {
|
|
24
|
+
const { collapsed: initial = false, persistKey = null } = options;
|
|
25
|
+
|
|
26
|
+
// Core state
|
|
27
|
+
let _collapsed = $state(initial);
|
|
28
|
+
let _expandedGroups = $state(new Set());
|
|
29
|
+
let _hoverPopover = $state({
|
|
30
|
+
item: null,
|
|
31
|
+
position: { top: 0, left: 0 }
|
|
32
|
+
});
|
|
33
|
+
let _hoverTimeout = null;
|
|
34
|
+
|
|
35
|
+
// Load from localStorage on init (client-side only)
|
|
36
|
+
if (persistKey && typeof localStorage !== 'undefined') {
|
|
37
|
+
try {
|
|
38
|
+
const saved = localStorage.getItem(persistKey);
|
|
39
|
+
if (saved !== null) {
|
|
40
|
+
_collapsed = saved === 'true';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const savedGroups = localStorage.getItem(`${persistKey}-groups`);
|
|
44
|
+
if (savedGroups) {
|
|
45
|
+
_expandedGroups = new Set(JSON.parse(savedGroups));
|
|
46
|
+
}
|
|
47
|
+
} catch (e) {
|
|
48
|
+
// Ignore localStorage errors
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Persist to localStorage when state changes
|
|
53
|
+
function persist() {
|
|
54
|
+
if (persistKey && typeof localStorage !== 'undefined') {
|
|
55
|
+
try {
|
|
56
|
+
localStorage.setItem(persistKey, String(_collapsed));
|
|
57
|
+
localStorage.setItem(`${persistKey}-groups`, JSON.stringify([..._expandedGroups]));
|
|
58
|
+
} catch (e) {
|
|
59
|
+
// Ignore localStorage errors
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
// Collapsed state
|
|
66
|
+
get collapsed() {
|
|
67
|
+
return _collapsed;
|
|
68
|
+
},
|
|
69
|
+
set collapsed(value) {
|
|
70
|
+
_collapsed = value;
|
|
71
|
+
persist();
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Toggle collapsed state
|
|
76
|
+
*/
|
|
77
|
+
toggle() {
|
|
78
|
+
_collapsed = !_collapsed;
|
|
79
|
+
persist();
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Expand the sidebar
|
|
84
|
+
*/
|
|
85
|
+
expand() {
|
|
86
|
+
_collapsed = false;
|
|
87
|
+
persist();
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Collapse the sidebar
|
|
92
|
+
*/
|
|
93
|
+
collapse() {
|
|
94
|
+
_collapsed = true;
|
|
95
|
+
persist();
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
// Group expansion
|
|
99
|
+
get expandedGroups() {
|
|
100
|
+
return _expandedGroups;
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Check if a group is expanded
|
|
105
|
+
* @param {string} groupId
|
|
106
|
+
* @returns {boolean}
|
|
107
|
+
*/
|
|
108
|
+
isGroupExpanded(groupId) {
|
|
109
|
+
return _expandedGroups.has(groupId);
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Toggle group expansion
|
|
114
|
+
* @param {string} groupId
|
|
115
|
+
*/
|
|
116
|
+
toggleGroup(groupId) {
|
|
117
|
+
if (_expandedGroups.has(groupId)) {
|
|
118
|
+
_expandedGroups = new Set([..._expandedGroups].filter(id => id !== groupId));
|
|
119
|
+
} else {
|
|
120
|
+
_expandedGroups = new Set([..._expandedGroups, groupId]);
|
|
121
|
+
}
|
|
122
|
+
persist();
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Expand a group
|
|
127
|
+
* @param {string} groupId
|
|
128
|
+
*/
|
|
129
|
+
expandGroup(groupId) {
|
|
130
|
+
if (!_expandedGroups.has(groupId)) {
|
|
131
|
+
_expandedGroups = new Set([..._expandedGroups, groupId]);
|
|
132
|
+
persist();
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Collapse a group
|
|
138
|
+
* @param {string} groupId
|
|
139
|
+
*/
|
|
140
|
+
collapseGroup(groupId) {
|
|
141
|
+
if (_expandedGroups.has(groupId)) {
|
|
142
|
+
_expandedGroups = new Set([..._expandedGroups].filter(id => id !== groupId));
|
|
143
|
+
persist();
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
// Hover popover state
|
|
148
|
+
get hoverPopover() {
|
|
149
|
+
return _hoverPopover;
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Show hover popover for an item
|
|
154
|
+
* @param {string} itemId
|
|
155
|
+
* @param {{top: number, left: number}} position
|
|
156
|
+
*/
|
|
157
|
+
showPopover(itemId, position) {
|
|
158
|
+
if (!_collapsed) return;
|
|
159
|
+
|
|
160
|
+
if (_hoverTimeout) {
|
|
161
|
+
clearTimeout(_hoverTimeout);
|
|
162
|
+
_hoverTimeout = null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
_hoverPopover = {
|
|
166
|
+
item: itemId,
|
|
167
|
+
position
|
|
168
|
+
};
|
|
169
|
+
},
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Hide hover popover with delay
|
|
173
|
+
* @param {number} [delay=150]
|
|
174
|
+
*/
|
|
175
|
+
hidePopover(delay = 150) {
|
|
176
|
+
if (_hoverTimeout) {
|
|
177
|
+
clearTimeout(_hoverTimeout);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
_hoverTimeout = setTimeout(() => {
|
|
181
|
+
_hoverPopover = { item: null, position: { top: 0, left: 0 } };
|
|
182
|
+
}, delay);
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Cancel pending popover hide
|
|
187
|
+
*/
|
|
188
|
+
keepPopoverOpen() {
|
|
189
|
+
if (_hoverTimeout) {
|
|
190
|
+
clearTimeout(_hoverTimeout);
|
|
191
|
+
_hoverTimeout = null;
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Immediately hide popover
|
|
197
|
+
*/
|
|
198
|
+
hidePopoverImmediate() {
|
|
199
|
+
if (_hoverTimeout) {
|
|
200
|
+
clearTimeout(_hoverTimeout);
|
|
201
|
+
_hoverTimeout = null;
|
|
202
|
+
}
|
|
203
|
+
_hoverPopover = { item: null, position: { top: 0, left: 0 } };
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Sidebar context key for Svelte context API
|
|
210
|
+
*/
|
|
211
|
+
export const SIDEBAR_CONTEXT_KEY = 'sidebar';
|