@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.
Files changed (72) hide show
  1. package/CLAUDE.md +350 -59
  2. package/README.md +30 -22
  3. package/llms.txt +37 -4
  4. package/package.json +12 -2
  5. package/src/components/docs/CodeBlock.svelte +203 -0
  6. package/src/components/docs/DocSection.svelte +120 -0
  7. package/src/components/docs/PropsTable.svelte +136 -0
  8. package/src/components/docs/SplitPane.svelte +98 -0
  9. package/src/components/docs/index.js +14 -0
  10. package/src/components/feedback/Alert.svelte +234 -0
  11. package/src/components/feedback/EmptyState.svelte +6 -6
  12. package/src/components/feedback/ProgressBar.svelte +8 -8
  13. package/src/components/feedback/Skeleton.svelte +4 -4
  14. package/src/components/feedback/Spinner.svelte +1 -1
  15. package/src/components/feedback/Toast.svelte +137 -173
  16. package/src/components/forms/Checkbox.svelte +10 -10
  17. package/src/components/forms/Dropzone.svelte +14 -14
  18. package/src/components/forms/FileUpload.svelte +16 -16
  19. package/src/components/forms/IconInput.svelte +4 -4
  20. package/src/components/forms/Input.svelte +14 -14
  21. package/src/components/forms/NumberInput.svelte +13 -13
  22. package/src/components/forms/PinInput.svelte +8 -8
  23. package/src/components/forms/Radio.svelte +8 -8
  24. package/src/components/forms/RangeSlider.svelte +12 -12
  25. package/src/components/forms/SearchInput.svelte +10 -10
  26. package/src/components/forms/Select.svelte +156 -158
  27. package/src/components/forms/Switch.svelte +4 -4
  28. package/src/components/forms/Textarea.svelte +9 -9
  29. package/src/components/navigation/Accordion.svelte +1 -1
  30. package/src/components/navigation/AccordionItem.svelte +6 -6
  31. package/src/components/navigation/NavigationContainer.svelte +344 -0
  32. package/src/components/navigation/Sidebar.svelte +334 -0
  33. package/src/components/navigation/SidebarAccountGroup.svelte +495 -0
  34. package/src/components/navigation/SidebarAccountItem.svelte +492 -0
  35. package/src/components/navigation/SidebarGroup.svelte +230 -0
  36. package/src/components/navigation/SidebarGroupSwitcher.svelte +262 -0
  37. package/src/components/navigation/SidebarItem.svelte +210 -0
  38. package/src/components/navigation/SidebarNavigationItem.svelte +470 -0
  39. package/src/components/navigation/SidebarPopover.svelte +145 -0
  40. package/src/components/navigation/SidebarSearch.svelte +236 -0
  41. package/src/components/navigation/SidebarSection.svelte +158 -0
  42. package/src/components/navigation/SidebarToggle.svelte +86 -0
  43. package/src/components/navigation/Tabs.svelte +18 -18
  44. package/src/components/navigation/WorkspaceMenu.svelte +416 -0
  45. package/src/components/navigation/blocks/NavigationAccountGroup.svelte +396 -0
  46. package/src/components/navigation/blocks/NavigationCustomBlock.svelte +74 -0
  47. package/src/components/navigation/blocks/NavigationGroupSwitcher.svelte +277 -0
  48. package/src/components/navigation/blocks/NavigationSearch.svelte +300 -0
  49. package/src/components/navigation/blocks/NavigationSection.svelte +230 -0
  50. package/src/components/navigation/index.js +22 -0
  51. package/src/components/overlays/ConfirmDialog.svelte +18 -18
  52. package/src/components/overlays/Dropdown.svelte +2 -2
  53. package/src/components/overlays/DropdownDivider.svelte +1 -1
  54. package/src/components/overlays/DropdownItem.svelte +5 -5
  55. package/src/components/overlays/Modal.svelte +13 -13
  56. package/src/components/overlays/Popover.svelte +3 -3
  57. package/src/components/primitives/Avatar.svelte +12 -12
  58. package/src/components/primitives/Badge.svelte +7 -7
  59. package/src/components/primitives/Button.svelte +126 -174
  60. package/src/components/primitives/Card.svelte +15 -15
  61. package/src/components/primitives/Divider.svelte +3 -3
  62. package/src/components/primitives/LazyImage.svelte +1 -1
  63. package/src/components/primitives/Link.svelte +2 -2
  64. package/src/components/primitives/Stat.svelte +197 -0
  65. package/src/components/primitives/StatusBadge.svelte +24 -24
  66. package/src/index.js +62 -7
  67. package/src/tokens/colors.css +96 -128
  68. package/src/utils/highlighter.js +124 -0
  69. package/src/utils/index.js +7 -2
  70. package/src/utils/navigation.svelte.js +423 -0
  71. package/src/utils/reactive.svelte.js +126 -37
  72. 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';