@buoy-gg/jotai 2.1.12 → 2.1.13

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 (41) hide show
  1. package/lib/commonjs/index.js +1 -91
  2. package/lib/commonjs/jotai/components/JotaiAtomBrowser.js +1 -300
  3. package/lib/commonjs/jotai/components/JotaiAtomChangeItem.js +1 -113
  4. package/lib/commonjs/jotai/components/JotaiAtomDetailContent.js +1 -754
  5. package/lib/commonjs/jotai/components/JotaiEventFilterView.js +1 -305
  6. package/lib/commonjs/jotai/components/JotaiIcon.js +1 -35
  7. package/lib/commonjs/jotai/components/JotaiModal.js +1 -567
  8. package/lib/commonjs/jotai/components/index.js +1 -59
  9. package/lib/commonjs/jotai/hooks/useJotaiAtomChanges.js +1 -83
  10. package/lib/commonjs/jotai/index.js +1 -85
  11. package/lib/commonjs/jotai/utils/jotaiStateStore.js +1 -322
  12. package/lib/commonjs/jotai/utils/watchAtoms.js +1 -149
  13. package/lib/commonjs/preset.js +1 -98
  14. package/lib/module/index.js +1 -74
  15. package/lib/module/jotai/components/JotaiAtomBrowser.js +1 -296
  16. package/lib/module/jotai/components/JotaiAtomChangeItem.js +1 -109
  17. package/lib/module/jotai/components/JotaiAtomDetailContent.js +1 -748
  18. package/lib/module/jotai/components/JotaiEventFilterView.js +1 -301
  19. package/lib/module/jotai/components/JotaiIcon.js +1 -31
  20. package/lib/module/jotai/components/JotaiModal.js +1 -563
  21. package/lib/module/jotai/components/index.js +1 -8
  22. package/lib/module/jotai/hooks/useJotaiAtomChanges.js +1 -79
  23. package/lib/module/jotai/index.js +1 -10
  24. package/lib/module/jotai/utils/jotaiStateStore.js +1 -318
  25. package/lib/module/jotai/utils/watchAtoms.js +1 -144
  26. package/lib/module/preset.js +1 -94
  27. package/package.json +3 -3
  28. package/lib/typescript/index.d.ts.map +0 -1
  29. package/lib/typescript/jotai/components/JotaiAtomBrowser.d.ts.map +0 -1
  30. package/lib/typescript/jotai/components/JotaiAtomChangeItem.d.ts.map +0 -1
  31. package/lib/typescript/jotai/components/JotaiAtomDetailContent.d.ts.map +0 -1
  32. package/lib/typescript/jotai/components/JotaiEventFilterView.d.ts.map +0 -1
  33. package/lib/typescript/jotai/components/JotaiIcon.d.ts.map +0 -1
  34. package/lib/typescript/jotai/components/JotaiModal.d.ts.map +0 -1
  35. package/lib/typescript/jotai/components/index.d.ts.map +0 -1
  36. package/lib/typescript/jotai/hooks/useJotaiAtomChanges.d.ts.map +0 -1
  37. package/lib/typescript/jotai/index.d.ts.map +0 -1
  38. package/lib/typescript/jotai/types/index.d.ts.map +0 -1
  39. package/lib/typescript/jotai/utils/jotaiStateStore.d.ts.map +0 -1
  40. package/lib/typescript/jotai/utils/watchAtoms.d.ts.map +0 -1
  41. package/lib/typescript/preset.d.ts.map +0 -1
@@ -1,567 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.JotaiModal = JotaiModal;
7
- var _react = require("react");
8
- var _reactNative = require("react-native");
9
- var _sharedUi = require("@buoy-gg/shared-ui");
10
- var _license = require("@buoy-gg/license");
11
- var _useJotaiAtomChanges = require("../hooks/useJotaiAtomChanges");
12
- var _JotaiAtomChangeItem = require("./JotaiAtomChangeItem");
13
- var _JotaiAtomDetailContent = require("./JotaiAtomDetailContent");
14
- var _JotaiAtomBrowser = require("./JotaiAtomBrowser");
15
- var _JotaiEventFilterView = require("./JotaiEventFilterView");
16
- var _jsxRuntime = require("react/jsx-runtime");
17
- /**
18
- * Main Jotai DevTools modal
19
- *
20
- * Two tabs mirroring the Zustand DevTools pattern:
21
- * - Atoms tab: Browse all registered atoms and their current value
22
- * - Events tab: Live atom change monitoring with diffs
23
- */
24
-
25
- const FREE_TIER_CHANGE_LIMIT = 25;
26
- function EventsEmptyState({
27
- isEnabled
28
- }) {
29
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
30
- style: styles.emptyState,
31
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Box, {
32
- size: 32,
33
- color: _sharedUi.macOSColors.text.muted
34
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
35
- style: styles.emptyTitle,
36
- children: "No atom changes"
37
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
38
- style: styles.emptyText,
39
- children: isEnabled ? "Atom changes will appear here as values update." : "Enable capture to start recording atom changes"
40
- })]
41
- });
42
- }
43
- function JotaiModal({
44
- visible,
45
- onClose,
46
- onBack,
47
- onMinimize,
48
- enableSharedModalDimensions = false
49
- }) {
50
- const isPro = (0, _license.useIsPro)();
51
- const [showProModal, setShowProModal] = (0, _react.useState)(false);
52
- const [activeTab, setActiveTab] = (0, _react.useState)("atoms");
53
- const [selectedHistoryAtom, setSelectedHistoryAtom] = (0, _react.useState)(null);
54
- const [showFilters, setShowFilters] = (0, _react.useState)(false);
55
- const [ignoredPatterns, setIgnoredPatterns] = (0, _react.useState)(new Set());
56
- const {
57
- filteredChanges,
58
- filter,
59
- setFilter,
60
- atoms,
61
- clearChanges,
62
- isEnabled,
63
- toggleCapture
64
- } = (0, _useJotaiAtomChanges.useJotaiAtomChanges)();
65
-
66
- // Apply ignored patterns on top of filteredChanges
67
- const displayedChanges = (0, _react.useMemo)(() => {
68
- if (ignoredPatterns.size === 0) return filteredChanges;
69
- return filteredChanges.filter(c => !Array.from(ignoredPatterns).some(p => c.atomLabel.toLowerCase().includes(p.toLowerCase())));
70
- }, [filteredChanges, ignoredPatterns]);
71
-
72
- // Apply ignored patterns to atoms list
73
- const displayedAtoms = (0, _react.useMemo)(() => {
74
- if (ignoredPatterns.size === 0) return atoms;
75
- return atoms.filter(a => !Array.from(ignoredPatterns).some(p => a.label.toLowerCase().includes(p.toLowerCase())));
76
- }, [atoms, ignoredPatterns]);
77
-
78
- // Free-tier gate
79
- const visibleChanges = (0, _react.useMemo)(() => {
80
- if (isPro) return displayedChanges;
81
- return displayedChanges.slice(0, FREE_TIER_CHANGE_LIMIT);
82
- }, [displayedChanges, isPro]);
83
- const lockedChangeCount = (0, _react.useMemo)(() => {
84
- if (isPro) return 0;
85
- return Math.max(0, displayedChanges.length - FREE_TIER_CHANGE_LIMIT);
86
- }, [displayedChanges.length, isPro]);
87
- const hasLockedChanges = lockedChangeCount > 0;
88
-
89
- // When viewing a single atom's history, scope the list
90
- const activeChanges = (0, _react.useMemo)(() => {
91
- if (selectedHistoryAtom) {
92
- return visibleChanges.filter(c => c.atomLabel === selectedHistoryAtom);
93
- }
94
- return visibleChanges;
95
- }, [visibleChanges, selectedHistoryAtom]);
96
- const [selectedChangeId, setSelectedChangeId] = (0, _react.useState)(null);
97
- const selectedChangeIndex = (0, _react.useMemo)(() => {
98
- if (selectedChangeId === null) return null;
99
- const idx = activeChanges.findIndex(c => c.id === selectedChangeId);
100
- return idx >= 0 ? idx : null;
101
- }, [selectedChangeId, activeChanges]);
102
- const selectedChange = selectedChangeIndex !== null ? activeChanges[selectedChangeIndex] : null;
103
-
104
- // Search state
105
- const [searchText, setSearchText] = (0, _react.useState)("");
106
- const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
107
- const searchInputRef = (0, _react.useRef)(null);
108
- const flatListRef = (0, _react.useRef)(null);
109
- const handleModeChange = (0, _react.useCallback)(_mode => {}, []);
110
- const handleSearch = text => {
111
- setSearchText(text);
112
- if (activeTab === "events") {
113
- setFilter(prev => ({
114
- ...prev,
115
- searchText: text
116
- }));
117
- }
118
- };
119
- const handleChangePress = (0, _react.useCallback)(change => {
120
- setSelectedChangeId(change.id);
121
- }, []);
122
- const handleUpgradePress = (0, _react.useCallback)(() => {
123
- setShowProModal(true);
124
- }, []);
125
- const handleBack = (0, _react.useCallback)(() => {
126
- setSelectedChangeId(null);
127
- }, []);
128
- const handleIndexChange = (0, _react.useCallback)(newIndex => {
129
- const change = activeChanges[newIndex];
130
- if (change) setSelectedChangeId(change.id);
131
- }, [activeChanges]);
132
- const handleViewHistory = (0, _react.useCallback)(atomLabel => {
133
- setSelectedHistoryAtom(atomLabel);
134
- setSelectedChangeId(null);
135
- }, []);
136
- const handleBackFromHistory = (0, _react.useCallback)(() => {
137
- setSelectedHistoryAtom(null);
138
- setSelectedChangeId(null);
139
- }, []);
140
- const getAtomsSnapshot = (0, _react.useCallback)(() => {
141
- return displayedAtoms.reduce((acc, atom) => {
142
- try {
143
- const value = atom.getValue();
144
- acc[atom.label] = (0, _sharedUi.truncatePayload)(value);
145
- } catch {
146
- acc[atom.label] = null;
147
- }
148
- return acc;
149
- }, {});
150
- }, [displayedAtoms]);
151
- const getEventsSnapshot = (0, _react.useCallback)(() => {
152
- return displayedChanges.map(change => ({
153
- id: change.id,
154
- atomLabel: change.atomLabel,
155
- timestamp: change.timestamp,
156
- prevValue: (0, _sharedUi.truncatePayload)(change.prevValue),
157
- nextValue: (0, _sharedUi.truncatePayload)(change.nextValue),
158
- hasValueChange: change.hasValueChange,
159
- changedKeys: change.changedKeys
160
- }));
161
- }, [displayedChanges]);
162
- const getHistorySnapshot = (0, _react.useCallback)(() => {
163
- return activeChanges.map(change => ({
164
- id: change.id,
165
- atomLabel: change.atomLabel,
166
- timestamp: change.timestamp,
167
- prevValue: (0, _sharedUi.truncatePayload)(change.prevValue),
168
- nextValue: (0, _sharedUi.truncatePayload)(change.nextValue),
169
- hasValueChange: change.hasValueChange,
170
- changedKeys: change.changedKeys
171
- }));
172
- }, [activeChanges]);
173
- const handleTogglePattern = (0, _react.useCallback)(pattern => {
174
- setIgnoredPatterns(prev => {
175
- const next = new Set(prev);
176
- if (next.has(pattern)) next.delete(pattern);else next.add(pattern);
177
- return next;
178
- });
179
- }, []);
180
- const handleAddPattern = (0, _react.useCallback)(pattern => {
181
- setIgnoredPatterns(prev => new Set([...prev, pattern]));
182
- }, []);
183
- const handleTabChange = (0, _react.useCallback)(tab => {
184
- setActiveTab(tab);
185
- setSelectedHistoryAtom(null);
186
- setSelectedChangeId(null);
187
- setShowFilters(false);
188
- if (searchText) {
189
- setSearchText("");
190
- setFilter(prev => ({
191
- ...prev,
192
- searchText: ""
193
- }));
194
- }
195
- setIsSearchActive(false);
196
- }, [searchText, setFilter]);
197
- const keyExtractor = (0, _react.useCallback)(item => item.id, []);
198
- const renderItem = (0, _react.useCallback)(({
199
- item
200
- }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_JotaiAtomChangeItem.JotaiAtomChangeItem, {
201
- change: item,
202
- onPress: handleChangePress
203
- }), [handleChangePress]);
204
-
205
- // ---- Header ----
206
-
207
- const hasActiveFilters = ignoredPatterns.size > 0;
208
- const renderHeaderContent = () => {
209
- if (showFilters) {
210
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
211
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
212
- onBack: () => setShowFilters(false)
213
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
214
- title: "Filters",
215
- centered: true
216
- })]
217
- });
218
- }
219
- if (selectedChange) {
220
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
221
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
222
- onBack: handleBack
223
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
224
- title: `${selectedChange.atomLabel}/${selectedChange.category}`,
225
- centered: true
226
- })]
227
- });
228
- }
229
- if (selectedHistoryAtom) {
230
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
231
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
232
- onBack: handleBackFromHistory
233
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
234
- title: `${selectedHistoryAtom} History`,
235
- centered: true
236
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions, {
237
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton, {
238
- value: getHistorySnapshot,
239
- disabled: activeChanges.length === 0,
240
- buttonStyle: styles.headerActionButton
241
- })
242
- })]
243
- });
244
- }
245
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
246
- children: [onBack && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
247
- onBack: onBack
248
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
249
- title: "",
250
- children: isSearchActive ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
251
- style: styles.headerSearchContainer,
252
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
253
- size: 14,
254
- color: _sharedUi.macOSColors.text.secondary
255
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
256
- ref: searchInputRef,
257
- style: styles.headerSearchInput,
258
- placeholder: activeTab === "atoms" ? "Search atoms..." : "Search events...",
259
- placeholderTextColor: _sharedUi.macOSColors.text.muted,
260
- value: searchText,
261
- onChangeText: handleSearch,
262
- onSubmitEditing: () => setIsSearchActive(false),
263
- onBlur: () => setIsSearchActive(false),
264
- autoCapitalize: "none",
265
- autoCorrect: false,
266
- returnKeyType: "search"
267
- }), searchText.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
268
- onPress: () => {
269
- handleSearch("");
270
- setIsSearchActive(false);
271
- },
272
- style: styles.headerSearchClear,
273
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
274
- size: 14,
275
- color: _sharedUi.macOSColors.text.secondary
276
- })
277
- })]
278
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TabSelector, {
279
- tabs: [{
280
- key: "atoms",
281
- label: `Atoms${displayedAtoms.length > 0 ? ` (${displayedAtoms.length})` : ""}`
282
- }, {
283
- key: "events",
284
- label: `Events${displayedChanges.length > 0 ? ` (${displayedChanges.length})` : ""}`
285
- }],
286
- activeTab: activeTab,
287
- onTabChange: handleTabChange
288
- })
289
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions, {
290
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
291
- onPress: () => setIsSearchActive(true),
292
- style: styles.headerActionButton,
293
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
294
- size: 14,
295
- color: _sharedUi.macOSColors.text.secondary
296
- })
297
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
298
- onPress: () => setShowFilters(true),
299
- style: [styles.headerActionButton, hasActiveFilters && styles.headerActionButtonActive],
300
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Filter, {
301
- size: 14,
302
- color: hasActiveFilters ? _sharedUi.macOSColors.semantic.debug : _sharedUi.macOSColors.text.secondary
303
- })
304
- }), activeTab === "atoms" && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton, {
305
- value: getAtomsSnapshot,
306
- disabled: displayedAtoms.length === 0,
307
- buttonStyle: styles.headerActionButton
308
- }), activeTab === "events" && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
309
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton, {
310
- value: getEventsSnapshot,
311
- disabled: displayedChanges.length === 0,
312
- buttonStyle: styles.headerActionButton
313
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.PowerToggleButton, {
314
- isEnabled: isEnabled,
315
- onToggle: toggleCapture,
316
- accessibilityLabel: "Toggle Jotai atom capture"
317
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ToolbarClearButton, {
318
- onPress: clearChanges,
319
- disabled: displayedChanges.length === 0,
320
- buttonStyle: styles.headerActionButton
321
- })]
322
- })]
323
- })]
324
- });
325
- };
326
-
327
- // ---- Content ----
328
-
329
- const renderContent = () => {
330
- if (showFilters) {
331
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_JotaiEventFilterView.JotaiEventFilterView, {
332
- ignoredPatterns: ignoredPatterns,
333
- onTogglePattern: handleTogglePattern,
334
- onAddPattern: handleAddPattern,
335
- atoms: atoms
336
- });
337
- }
338
- if (selectedChange && selectedChangeIndex !== null) {
339
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_JotaiAtomDetailContent.JotaiAtomDetailContent, {
340
- change: selectedChange,
341
- changes: activeChanges,
342
- selectedIndex: selectedChangeIndex,
343
- onIndexChange: handleIndexChange,
344
- disableInternalFooter: true
345
- });
346
- }
347
- if (selectedHistoryAtom) {
348
- return activeChanges.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.FlatList, {
349
- data: activeChanges,
350
- renderItem: renderItem,
351
- keyExtractor: keyExtractor,
352
- contentContainerStyle: styles.listContent,
353
- showsVerticalScrollIndicator: true,
354
- removeClippedSubviews: true,
355
- initialNumToRender: 15,
356
- maxToRenderPerBatch: 10,
357
- windowSize: 10,
358
- scrollEnabled: false
359
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
360
- style: styles.emptyState,
361
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Box, {
362
- size: 32,
363
- color: _sharedUi.macOSColors.text.muted
364
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
365
- style: styles.emptyTitle,
366
- children: "No history yet"
367
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
368
- style: styles.emptyText,
369
- children: ["Changes for ", selectedHistoryAtom, " will appear here."]
370
- })]
371
- });
372
- }
373
- if (activeTab === "atoms") {
374
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_JotaiAtomBrowser.JotaiAtomBrowser, {
375
- atoms: displayedAtoms,
376
- searchQuery: searchText,
377
- onViewHistory: handleViewHistory
378
- });
379
- }
380
-
381
- // Events tab
382
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
383
- children: [!isEnabled && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
384
- style: styles.disabledBanner,
385
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Power, {
386
- size: 14,
387
- color: _sharedUi.macOSColors.semantic.warning
388
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
389
- style: styles.disabledText,
390
- children: "Atom capture is disabled"
391
- })]
392
- }), hasLockedChanges && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
393
- style: styles.lockedBanner,
394
- onPress: handleUpgradePress,
395
- activeOpacity: 0.8,
396
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
397
- style: styles.lockedText,
398
- children: [lockedChangeCount, " older", " ", lockedChangeCount === 1 ? "change" : "changes", " locked"]
399
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
400
- style: styles.upgradeBadge,
401
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
402
- style: styles.upgradeBadgeText,
403
- children: "UPGRADE"
404
- })
405
- })]
406
- }), visibleChanges.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.FlatList, {
407
- ref: flatListRef,
408
- data: visibleChanges,
409
- renderItem: renderItem,
410
- keyExtractor: keyExtractor,
411
- contentContainerStyle: styles.listContent,
412
- showsVerticalScrollIndicator: true,
413
- removeClippedSubviews: true,
414
- initialNumToRender: 15,
415
- maxToRenderPerBatch: 10,
416
- windowSize: 10,
417
- scrollEnabled: false
418
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(EventsEmptyState, {
419
- isEnabled: isEnabled
420
- })]
421
- });
422
- };
423
- const persistenceKey = enableSharedModalDimensions ? _sharedUi.devToolsStorageKeys.modal.root() : "buoy-jotai-modal";
424
- if (!visible) return null;
425
- const footerNode = selectedChange && selectedChangeIndex !== null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_JotaiAtomDetailContent.JotaiAtomDetailFooter, {
426
- change: selectedChange,
427
- changes: activeChanges,
428
- selectedIndex: selectedChangeIndex,
429
- onIndexChange: handleIndexChange
430
- }) : null;
431
- const footerHeight = selectedChange && activeChanges.length > 1 ? 68 : 0;
432
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.TickProvider, {
433
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
434
- visible: visible,
435
- onClose: onClose,
436
- onMinimize: onMinimize,
437
- persistenceKey: persistenceKey,
438
- header: {
439
- showToggleButton: true,
440
- customContent: renderHeaderContent()
441
- },
442
- onModeChange: handleModeChange,
443
- enablePersistence: true,
444
- initialMode: "bottomSheet",
445
- enableGlitchEffects: true,
446
- styles: {},
447
- footer: footerNode,
448
- footerHeight: footerHeight,
449
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
450
- style: styles.container,
451
- children: renderContent()
452
- })
453
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ProUpgradeModal, {
454
- visible: showProModal,
455
- onClose: () => setShowProModal(false),
456
- featureName: "Full Atom History"
457
- })]
458
- });
459
- }
460
- const styles = _reactNative.StyleSheet.create({
461
- container: {
462
- flex: 1,
463
- backgroundColor: _sharedUi.macOSColors.background.base
464
- },
465
- headerSearchContainer: {
466
- flexDirection: "row",
467
- alignItems: "center",
468
- backgroundColor: _sharedUi.macOSColors.background.input,
469
- borderRadius: 10,
470
- borderWidth: 1,
471
- borderColor: _sharedUi.macOSColors.border.default,
472
- paddingHorizontal: 12,
473
- paddingVertical: 5
474
- },
475
- headerSearchInput: {
476
- flex: 1,
477
- color: _sharedUi.macOSColors.text.primary,
478
- fontSize: 13,
479
- marginLeft: 6,
480
- paddingVertical: 2
481
- },
482
- headerSearchClear: {
483
- marginLeft: 6,
484
- padding: 4
485
- },
486
- headerActionButton: {
487
- width: 32,
488
- height: 32,
489
- borderRadius: 8,
490
- backgroundColor: _sharedUi.macOSColors.background.hover,
491
- borderWidth: 1,
492
- borderColor: _sharedUi.macOSColors.border.default,
493
- alignItems: "center",
494
- justifyContent: "center"
495
- },
496
- headerActionButtonActive: {
497
- backgroundColor: _sharedUi.macOSColors.semantic.infoBackground
498
- },
499
- disabledBanner: {
500
- flexDirection: "row",
501
- alignItems: "center",
502
- gap: 8,
503
- padding: 10,
504
- marginHorizontal: 12,
505
- marginTop: 8,
506
- backgroundColor: _sharedUi.macOSColors.semantic.warningBackground,
507
- borderRadius: 8,
508
- borderWidth: 1,
509
- borderColor: _sharedUi.macOSColors.semantic.warning + "20"
510
- },
511
- disabledText: {
512
- color: _sharedUi.macOSColors.semantic.warning,
513
- fontSize: 11,
514
- flex: 1
515
- },
516
- listContent: {
517
- paddingTop: 8,
518
- paddingBottom: 20
519
- },
520
- emptyState: {
521
- alignItems: "center",
522
- paddingVertical: 40
523
- },
524
- emptyTitle: {
525
- color: _sharedUi.macOSColors.text.primary,
526
- fontSize: 14,
527
- fontWeight: "600",
528
- marginTop: 12,
529
- marginBottom: 6
530
- },
531
- emptyText: {
532
- color: _sharedUi.macOSColors.text.muted,
533
- fontSize: 12,
534
- textAlign: "center",
535
- lineHeight: 18
536
- },
537
- lockedBanner: {
538
- flexDirection: "row",
539
- alignItems: "center",
540
- gap: 8,
541
- padding: 10,
542
- marginHorizontal: 12,
543
- marginTop: 8,
544
- backgroundColor: _sharedUi.buoyColors.primary + "15",
545
- borderRadius: 8,
546
- borderWidth: 1,
547
- borderColor: _sharedUi.buoyColors.primary + "33"
548
- },
549
- lockedText: {
550
- color: _sharedUi.buoyColors.primary,
551
- fontSize: 11,
552
- fontWeight: "500",
553
- flex: 1
554
- },
555
- upgradeBadge: {
556
- backgroundColor: _sharedUi.buoyColors.primary,
557
- paddingHorizontal: 8,
558
- paddingVertical: 3,
559
- borderRadius: 4
560
- },
561
- upgradeBadgeText: {
562
- color: "#fff",
563
- fontSize: 9,
564
- fontWeight: "700",
565
- letterSpacing: 0.5
566
- }
567
- });
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.JotaiModal=JotaiModal;var _react=require("react"),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_license=require("@buoy-gg/license"),_useJotaiAtomChanges=require("../hooks/useJotaiAtomChanges"),_JotaiAtomChangeItem=require("./JotaiAtomChangeItem"),_JotaiAtomDetailContent=require("./JotaiAtomDetailContent"),_JotaiAtomBrowser=require("./JotaiAtomBrowser"),_JotaiEventFilterView=require("./JotaiEventFilterView"),_jsxRuntime=require("react/jsx-runtime");const FREE_TIER_CHANGE_LIMIT=25;function EventsEmptyState({isEnabled:e}){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyState,children:[(0,_jsxRuntime.jsx)(_sharedUi.Box,{size:32,color:_sharedUi.macOSColors.text.muted}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyTitle,children:"No atom changes"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyText,children:e?"Atom changes will appear here as values update.":"Enable capture to start recording atom changes"})]})}function JotaiModal({visible:e,onClose:t,onBack:a,onMinimize:r,enableSharedModalDimensions:s=!1}){const o=(0,_license.useIsPro)(),[i,n]=(0,_react.useState)(!1),[l,d]=(0,_react.useState)("atoms"),[c,u]=(0,_react.useState)(null),[m,h]=(0,_react.useState)(!1),[_,x]=(0,_react.useState)(new Set),{filteredChanges:g,filter:j,setFilter:y,atoms:C,clearChanges:b,isEnabled:p,toggleCapture:R}=(0,_useJotaiAtomChanges.useJotaiAtomChanges)(),S=(0,_react.useMemo)(()=>0===_.size?g:g.filter(e=>!Array.from(_).some(t=>e.atomLabel.toLowerCase().includes(t.toLowerCase()))),[g,_]),U=(0,_react.useMemo)(()=>0===_.size?C:C.filter(e=>!Array.from(_).some(t=>e.label.toLowerCase().includes(t.toLowerCase()))),[C,_]),v=(0,_react.useMemo)(()=>o?S:S.slice(0,FREE_TIER_CHANGE_LIMIT),[S,o]),T=(0,_react.useMemo)(()=>o?0:Math.max(0,S.length-FREE_TIER_CHANGE_LIMIT),[S.length,o]),f=T>0,k=(0,_react.useMemo)(()=>c?v.filter(e=>e.atomLabel===c):v,[v,c]),[w,A]=(0,_react.useState)(null),B=(0,_react.useMemo)(()=>{if(null===w)return null;const e=k.findIndex(e=>e.id===w);return e>=0?e:null},[w,k]),M=null!==B?k[B]:null,[N,E]=(0,_react.useState)(""),[I,V]=(0,_react.useState)(!1),J=(0,_react.useRef)(null),O=(0,_react.useRef)(null),H=(0,_react.useCallback)(e=>{},[]),z=e=>{E(e),"events"===l&&y(t=>({...t,searchText:e}))},P=(0,_react.useCallback)(e=>{A(e.id)},[]),L=(0,_react.useCallback)(()=>{n(!0)},[]),F=(0,_react.useCallback)(()=>{A(null)},[]),D=(0,_react.useCallback)(e=>{const t=k[e];t&&A(t.id)},[k]),q=(0,_react.useCallback)(e=>{u(e),A(null)},[]),K=(0,_react.useCallback)(()=>{u(null),A(null)},[]),W=(0,_react.useCallback)(()=>U.reduce((e,t)=>{try{const a=t.getValue();e[t.label]=(0,_sharedUi.truncatePayload)(a)}catch{e[t.label]=null}return e},{}),[U]),G=(0,_react.useCallback)(()=>S.map(e=>({id:e.id,atomLabel:e.atomLabel,timestamp:e.timestamp,prevValue:(0,_sharedUi.truncatePayload)(e.prevValue),nextValue:(0,_sharedUi.truncatePayload)(e.nextValue),hasValueChange:e.hasValueChange,changedKeys:e.changedKeys})),[S]),$=(0,_react.useCallback)(()=>k.map(e=>({id:e.id,atomLabel:e.atomLabel,timestamp:e.timestamp,prevValue:(0,_sharedUi.truncatePayload)(e.prevValue),nextValue:(0,_sharedUi.truncatePayload)(e.nextValue),hasValueChange:e.hasValueChange,changedKeys:e.changedKeys})),[k]),Q=(0,_react.useCallback)(e=>{x(t=>{const a=new Set(t);return a.has(e)?a.delete(e):a.add(e),a})},[]),X=(0,_react.useCallback)(e=>{x(t=>new Set([...t,e]))},[]),Y=(0,_react.useCallback)(e=>{d(e),u(null),A(null),h(!1),N&&(E(""),y(e=>({...e,searchText:""}))),V(!1)},[N,y]),Z=(0,_react.useCallback)(e=>e.id,[]),ee=(0,_react.useCallback)(({item:e})=>(0,_jsxRuntime.jsx)(_JotaiAtomChangeItem.JotaiAtomChangeItem,{change:e,onPress:P}),[P]),te=_.size>0,ae=s?_sharedUi.devToolsStorageKeys.modal.root():"buoy-jotai-modal";if(!e)return null;const re=M&&null!==B?(0,_jsxRuntime.jsx)(_JotaiAtomDetailContent.JotaiAtomDetailFooter,{change:M,changes:k,selectedIndex:B,onIndexChange:D}):null,se=M&&k.length>1?68:0;return(0,_jsxRuntime.jsxs)(_sharedUi.TickProvider,{children:[(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:e,onClose:t,onMinimize:r,persistenceKey:ae,header:{showToggleButton:!0,customContent:m?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>h(!1)}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"Filters",centered:!0})]}):M?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:F}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:`${M.atomLabel}/${M.category}`,centered:!0})]}):c?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:K}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:`${c} History`,centered:!0}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions,{children:(0,_jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton,{value:$,disabled:0===k.length,buttonStyle:styles.headerActionButton})})]}):(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[a&&(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:a}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",children:I?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.headerSearchContainer,children:[(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.macOSColors.text.secondary}),(0,_jsxRuntime.jsx)(_reactNative.TextInput,{ref:J,style:styles.headerSearchInput,placeholder:"atoms"===l?"Search atoms...":"Search events...",placeholderTextColor:_sharedUi.macOSColors.text.muted,value:N,onChangeText:z,onSubmitEditing:()=>V(!1),onBlur:()=>V(!1),autoCapitalize:"none",autoCorrect:!1,returnKeyType:"search"}),N.length>0&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>{z(""),V(!1)},style:styles.headerSearchClear,children:(0,_jsxRuntime.jsx)(_sharedUi.X,{size:14,color:_sharedUi.macOSColors.text.secondary})})]}):(0,_jsxRuntime.jsx)(_sharedUi.TabSelector,{tabs:[{key:"atoms",label:"Atoms"+(U.length>0?` (${U.length})`:"")},{key:"events",label:"Events"+(S.length>0?` (${S.length})`:"")}],activeTab:l,onTabChange:Y})}),(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions,{children:[(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>V(!0),style:styles.headerActionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.macOSColors.text.secondary})}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>h(!0),style:[styles.headerActionButton,te&&styles.headerActionButtonActive],children:(0,_jsxRuntime.jsx)(_sharedUi.Filter,{size:14,color:te?_sharedUi.macOSColors.semantic.debug:_sharedUi.macOSColors.text.secondary})}),"atoms"===l&&(0,_jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton,{value:W,disabled:0===U.length,buttonStyle:styles.headerActionButton}),"events"===l&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton,{value:G,disabled:0===S.length,buttonStyle:styles.headerActionButton}),(0,_jsxRuntime.jsx)(_sharedUi.PowerToggleButton,{isEnabled:p,onToggle:R,accessibilityLabel:"Toggle Jotai atom capture"}),(0,_jsxRuntime.jsx)(_sharedUi.ToolbarClearButton,{onPress:b,disabled:0===S.length,buttonStyle:styles.headerActionButton})]})]})]})},onModeChange:H,enablePersistence:!0,initialMode:"bottomSheet",enableGlitchEffects:!0,styles:{},footer:re,footerHeight:se,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.container,children:m?(0,_jsxRuntime.jsx)(_JotaiEventFilterView.JotaiEventFilterView,{ignoredPatterns:_,onTogglePattern:Q,onAddPattern:X,atoms:C}):M&&null!==B?(0,_jsxRuntime.jsx)(_JotaiAtomDetailContent.JotaiAtomDetailContent,{change:M,changes:k,selectedIndex:B,onIndexChange:D,disableInternalFooter:!0}):c?k.length>0?(0,_jsxRuntime.jsx)(_reactNative.FlatList,{data:k,renderItem:ee,keyExtractor:Z,contentContainerStyle:styles.listContent,showsVerticalScrollIndicator:!0,removeClippedSubviews:!0,initialNumToRender:15,maxToRenderPerBatch:10,windowSize:10,scrollEnabled:!1}):(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyState,children:[(0,_jsxRuntime.jsx)(_sharedUi.Box,{size:32,color:_sharedUi.macOSColors.text.muted}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyTitle,children:"No history yet"}),(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.emptyText,children:["Changes for ",c," will appear here."]})]}):"atoms"===l?(0,_jsxRuntime.jsx)(_JotaiAtomBrowser.JotaiAtomBrowser,{atoms:U,searchQuery:N,onViewHistory:q}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[!p&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.disabledBanner,children:[(0,_jsxRuntime.jsx)(_sharedUi.Power,{size:14,color:_sharedUi.macOSColors.semantic.warning}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.disabledText,children:"Atom capture is disabled"})]}),f&&(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:styles.lockedBanner,onPress:L,activeOpacity:.8,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.lockedText,children:[T," older"," ",1===T?"change":"changes"," locked"]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.upgradeBadge,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.upgradeBadgeText,children:"UPGRADE"})})]}),v.length>0?(0,_jsxRuntime.jsx)(_reactNative.FlatList,{ref:O,data:v,renderItem:ee,keyExtractor:Z,contentContainerStyle:styles.listContent,showsVerticalScrollIndicator:!0,removeClippedSubviews:!0,initialNumToRender:15,maxToRenderPerBatch:10,windowSize:10,scrollEnabled:!1}):(0,_jsxRuntime.jsx)(EventsEmptyState,{isEnabled:p})]})})}),(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:i,onClose:()=>n(!1),featureName:"Full Atom History"})]})}const styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:_sharedUi.macOSColors.background.base},headerSearchContainer:{flexDirection:"row",alignItems:"center",backgroundColor:_sharedUi.macOSColors.background.input,borderRadius:10,borderWidth:1,borderColor:_sharedUi.macOSColors.border.default,paddingHorizontal:12,paddingVertical:5},headerSearchInput:{flex:1,color:_sharedUi.macOSColors.text.primary,fontSize:13,marginLeft:6,paddingVertical:2},headerSearchClear:{marginLeft:6,padding:4},headerActionButton:{width:32,height:32,borderRadius:8,backgroundColor:_sharedUi.macOSColors.background.hover,borderWidth:1,borderColor:_sharedUi.macOSColors.border.default,alignItems:"center",justifyContent:"center"},headerActionButtonActive:{backgroundColor:_sharedUi.macOSColors.semantic.infoBackground},disabledBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.macOSColors.semantic.warningBackground,borderRadius:8,borderWidth:1,borderColor:_sharedUi.macOSColors.semantic.warning+"20"},disabledText:{color:_sharedUi.macOSColors.semantic.warning,fontSize:11,flex:1},listContent:{paddingTop:8,paddingBottom:20},emptyState:{alignItems:"center",paddingVertical:40},emptyTitle:{color:_sharedUi.macOSColors.text.primary,fontSize:14,fontWeight:"600",marginTop:12,marginBottom:6},emptyText:{color:_sharedUi.macOSColors.text.muted,fontSize:12,textAlign:"center",lineHeight:18},lockedBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.buoyColors.primary+"15",borderRadius:8,borderWidth:1,borderColor:_sharedUi.buoyColors.primary+"33"},lockedText:{color:_sharedUi.buoyColors.primary,fontSize:11,fontWeight:"500",flex:1},upgradeBadge:{backgroundColor:_sharedUi.buoyColors.primary,paddingHorizontal:8,paddingVertical:3,borderRadius:4},upgradeBadgeText:{color:"#fff",fontSize:9,fontWeight:"700",letterSpacing:.5}});
@@ -1,59 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "JOTAI_ICON_COLOR", {
7
- enumerable: true,
8
- get: function () {
9
- return _JotaiIcon.JOTAI_ICON_COLOR;
10
- }
11
- });
12
- Object.defineProperty(exports, "JotaiAtomBrowser", {
13
- enumerable: true,
14
- get: function () {
15
- return _JotaiAtomBrowser.JotaiAtomBrowser;
16
- }
17
- });
18
- Object.defineProperty(exports, "JotaiAtomChangeItem", {
19
- enumerable: true,
20
- get: function () {
21
- return _JotaiAtomChangeItem.JotaiAtomChangeItem;
22
- }
23
- });
24
- Object.defineProperty(exports, "JotaiAtomDetailContent", {
25
- enumerable: true,
26
- get: function () {
27
- return _JotaiAtomDetailContent.JotaiAtomDetailContent;
28
- }
29
- });
30
- Object.defineProperty(exports, "JotaiAtomDetailFooter", {
31
- enumerable: true,
32
- get: function () {
33
- return _JotaiAtomDetailContent.JotaiAtomDetailFooter;
34
- }
35
- });
36
- Object.defineProperty(exports, "JotaiEventFilterView", {
37
- enumerable: true,
38
- get: function () {
39
- return _JotaiEventFilterView.JotaiEventFilterView;
40
- }
41
- });
42
- Object.defineProperty(exports, "JotaiIcon", {
43
- enumerable: true,
44
- get: function () {
45
- return _JotaiIcon.JotaiIcon;
46
- }
47
- });
48
- Object.defineProperty(exports, "JotaiModal", {
49
- enumerable: true,
50
- get: function () {
51
- return _JotaiModal.JotaiModal;
52
- }
53
- });
54
- var _JotaiModal = require("./JotaiModal");
55
- var _JotaiIcon = require("./JotaiIcon");
56
- var _JotaiAtomChangeItem = require("./JotaiAtomChangeItem");
57
- var _JotaiAtomDetailContent = require("./JotaiAtomDetailContent");
58
- var _JotaiAtomBrowser = require("./JotaiAtomBrowser");
59
- var _JotaiEventFilterView = require("./JotaiEventFilterView");
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"JOTAI_ICON_COLOR",{enumerable:!0,get:function(){return _JotaiIcon.JOTAI_ICON_COLOR}}),Object.defineProperty(exports,"JotaiAtomBrowser",{enumerable:!0,get:function(){return _JotaiAtomBrowser.JotaiAtomBrowser}}),Object.defineProperty(exports,"JotaiAtomChangeItem",{enumerable:!0,get:function(){return _JotaiAtomChangeItem.JotaiAtomChangeItem}}),Object.defineProperty(exports,"JotaiAtomDetailContent",{enumerable:!0,get:function(){return _JotaiAtomDetailContent.JotaiAtomDetailContent}}),Object.defineProperty(exports,"JotaiAtomDetailFooter",{enumerable:!0,get:function(){return _JotaiAtomDetailContent.JotaiAtomDetailFooter}}),Object.defineProperty(exports,"JotaiEventFilterView",{enumerable:!0,get:function(){return _JotaiEventFilterView.JotaiEventFilterView}}),Object.defineProperty(exports,"JotaiIcon",{enumerable:!0,get:function(){return _JotaiIcon.JotaiIcon}}),Object.defineProperty(exports,"JotaiModal",{enumerable:!0,get:function(){return _JotaiModal.JotaiModal}});var _JotaiModal=require("./JotaiModal"),_JotaiIcon=require("./JotaiIcon"),_JotaiAtomChangeItem=require("./JotaiAtomChangeItem"),_JotaiAtomDetailContent=require("./JotaiAtomDetailContent"),_JotaiAtomBrowser=require("./JotaiAtomBrowser"),_JotaiEventFilterView=require("./JotaiEventFilterView");