@buoy-gg/jotai 3.0.1 → 3.0.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 (48) hide show
  1. package/lib/commonjs/index.js +98 -1
  2. package/lib/commonjs/jotai/components/JotaiAtomBrowser.js +300 -1
  3. package/lib/commonjs/jotai/components/JotaiAtomChangeItem.js +113 -1
  4. package/lib/commonjs/jotai/components/JotaiAtomDetailContent.js +754 -1
  5. package/lib/commonjs/jotai/components/JotaiEventFilterView.js +305 -1
  6. package/lib/commonjs/jotai/components/JotaiIcon.js +35 -1
  7. package/lib/commonjs/jotai/components/JotaiModal.js +567 -1
  8. package/lib/commonjs/jotai/components/index.js +59 -1
  9. package/lib/commonjs/jotai/hooks/useJotaiAtomChanges.js +83 -1
  10. package/lib/commonjs/jotai/index.js +85 -1
  11. package/lib/commonjs/jotai/sync/jotaiSyncAdapter.js +38 -0
  12. package/lib/commonjs/jotai/utils/jotaiStateStore.js +399 -1
  13. package/lib/commonjs/jotai/utils/watchAtoms.js +149 -1
  14. package/lib/commonjs/preset.js +98 -1
  15. package/lib/module/index.js +79 -1
  16. package/lib/module/jotai/components/JotaiAtomBrowser.js +296 -1
  17. package/lib/module/jotai/components/JotaiAtomChangeItem.js +109 -1
  18. package/lib/module/jotai/components/JotaiAtomDetailContent.js +748 -1
  19. package/lib/module/jotai/components/JotaiEventFilterView.js +301 -1
  20. package/lib/module/jotai/components/JotaiIcon.js +31 -1
  21. package/lib/module/jotai/components/JotaiModal.js +563 -1
  22. package/lib/module/jotai/components/index.js +8 -1
  23. package/lib/module/jotai/hooks/useJotaiAtomChanges.js +79 -1
  24. package/lib/module/jotai/index.js +10 -1
  25. package/lib/module/jotai/sync/jotaiSyncAdapter.js +35 -0
  26. package/lib/module/jotai/utils/jotaiStateStore.js +395 -1
  27. package/lib/module/jotai/utils/watchAtoms.js +144 -1
  28. package/lib/module/preset.js +94 -1
  29. package/lib/typescript/index.d.ts +2 -1
  30. package/lib/typescript/index.d.ts.map +1 -0
  31. package/lib/typescript/jotai/components/JotaiAtomBrowser.d.ts.map +1 -0
  32. package/lib/typescript/jotai/components/JotaiAtomChangeItem.d.ts.map +1 -0
  33. package/lib/typescript/jotai/components/JotaiAtomDetailContent.d.ts.map +1 -0
  34. package/lib/typescript/jotai/components/JotaiEventFilterView.d.ts.map +1 -0
  35. package/lib/typescript/jotai/components/JotaiIcon.d.ts.map +1 -0
  36. package/lib/typescript/jotai/components/JotaiModal.d.ts.map +1 -0
  37. package/lib/typescript/jotai/components/index.d.ts.map +1 -0
  38. package/lib/typescript/jotai/hooks/useJotaiAtomChanges.d.ts.map +1 -0
  39. package/lib/typescript/jotai/index.d.ts.map +1 -0
  40. package/lib/typescript/jotai/sync/jotaiSyncAdapter.d.ts +23 -0
  41. package/lib/typescript/jotai/sync/jotaiSyncAdapter.d.ts.map +1 -0
  42. package/lib/typescript/jotai/types/index.d.ts +11 -0
  43. package/lib/typescript/jotai/types/index.d.ts.map +1 -0
  44. package/lib/typescript/jotai/utils/jotaiStateStore.d.ts +29 -1
  45. package/lib/typescript/jotai/utils/jotaiStateStore.d.ts.map +1 -0
  46. package/lib/typescript/jotai/utils/watchAtoms.d.ts.map +1 -0
  47. package/lib/typescript/preset.d.ts.map +1 -0
  48. package/package.json +3 -3
@@ -1 +1,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
+ "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 +1,59 @@
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");
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");