@rpg-engine/long-bow 0.8.135 → 0.8.136

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpg-engine/long-bow",
3
- "version": "0.8.135",
3
+ "version": "0.8.136",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -0,0 +1,238 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import { uiColors } from '../../constants/uiColors';
4
+ import { Dropdown, IOptionsProps } from '../Dropdown';
5
+ import { Pagination } from '../shared/Pagination/Pagination';
6
+
7
+ export interface IDCTransaction {
8
+ _id: string;
9
+ type: string;
10
+ amount: number;
11
+ balanceAfter: number;
12
+ relatedCharacterName?: string;
13
+ note?: string;
14
+ createdAt: string;
15
+ }
16
+
17
+ const TRANSACTION_TYPE_LABELS: Record<string, string> = {
18
+ Purchase: 'Purchase',
19
+ Transfer: 'Transfer',
20
+ MarketplaceSale: 'Marketplace Sale',
21
+ MarketplacePurchase: 'Marketplace Buy',
22
+ StorePurchase: 'Store Purchase',
23
+ Fee: 'Fee',
24
+ Refund: 'Refund',
25
+ AdminAdjustment: 'Admin Adjustment',
26
+ };
27
+
28
+ const TRANSACTION_TYPE_OPTIONS: IOptionsProps[] = [
29
+ { id: 0, value: '', option: 'All Types' },
30
+ { id: 1, value: 'Purchase', option: 'Purchase' },
31
+ { id: 2, value: 'Transfer', option: 'Transfer' },
32
+ { id: 3, value: 'MarketplaceSale', option: 'Marketplace Sale' },
33
+ { id: 4, value: 'MarketplacePurchase', option: 'Marketplace Buy' },
34
+ { id: 5, value: 'StorePurchase', option: 'Store Purchase' },
35
+ { id: 6, value: 'Fee', option: 'Fee' },
36
+ { id: 7, value: 'Refund', option: 'Refund' },
37
+ { id: 8, value: 'AdminAdjustment', option: 'Admin Adjustment' },
38
+ ];
39
+
40
+ export interface IDCHistoryPanelProps {
41
+ transactions: IDCTransaction[];
42
+ totalPages: number;
43
+ currentPage: number;
44
+ loading: boolean;
45
+ onRequestHistory: (page: number, type?: string) => void;
46
+ }
47
+
48
+ export const DCHistoryPanel: React.FC<IDCHistoryPanelProps> = ({
49
+ transactions,
50
+ totalPages,
51
+ currentPage,
52
+ loading,
53
+ onRequestHistory,
54
+ }) => {
55
+ const [selectedType, setSelectedType] = React.useState<string>('');
56
+
57
+ const handleTypeChange = (value: string): void => {
58
+ setSelectedType(value);
59
+ onRequestHistory(1, value || undefined);
60
+ };
61
+
62
+ const handlePageChange = (page: number): void => {
63
+ onRequestHistory(page, selectedType || undefined);
64
+ };
65
+
66
+ const formatDate = (dateStr: string): string => {
67
+ const d = new Date(dateStr);
68
+ const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
69
+ return `${months[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`;
70
+ };
71
+
72
+ return (
73
+ <PanelContainer>
74
+ <FilterRow>
75
+ <FilterLabel>Filter:</FilterLabel>
76
+ <Dropdown options={TRANSACTION_TYPE_OPTIONS} onChange={handleTypeChange} width="200px" />
77
+ </FilterRow>
78
+
79
+ {loading && (
80
+ <LoadingRow>
81
+ <Spinner />
82
+ <span>Loading...</span>
83
+ </LoadingRow>
84
+ )}
85
+
86
+ {!loading && transactions.length === 0 && (
87
+ <EmptyMessage>No transactions found.</EmptyMessage>
88
+ )}
89
+
90
+ {!loading && transactions.length > 0 && (
91
+ <TransactionList>
92
+ {transactions.map((tx) => {
93
+ const isCredit = tx.amount > 0;
94
+ const label = TRANSACTION_TYPE_LABELS[tx.type] ?? tx.type;
95
+
96
+ return (
97
+ <TransactionRow key={tx._id}>
98
+ <TxType>{label}</TxType>
99
+ <TxAmount $credit={isCredit}>
100
+ {isCredit ? '+' : ''}{tx.amount} DC
101
+ </TxAmount>
102
+ <TxNote>
103
+ {tx.note ?? (tx.relatedCharacterName ? `With: ${tx.relatedCharacterName}` : '')}
104
+ </TxNote>
105
+ <TxDate>{formatDate(tx.createdAt)}</TxDate>
106
+ <TxBalance>Balance: {tx.balanceAfter} DC</TxBalance>
107
+ </TransactionRow>
108
+ );
109
+ })}
110
+ </TransactionList>
111
+ )}
112
+
113
+ {totalPages > 1 && (
114
+ <Pagination
115
+ currentPage={currentPage}
116
+ totalPages={totalPages}
117
+ onPageChange={handlePageChange}
118
+ />
119
+ )}
120
+ </PanelContainer>
121
+ );
122
+ };
123
+
124
+ const PanelContainer = styled.div`
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: 6px;
128
+ padding: 4px 0;
129
+ `;
130
+
131
+ const FilterRow = styled.div`
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 8px;
135
+ margin-bottom: 4px;
136
+ `;
137
+
138
+ const FilterLabel = styled.span`
139
+ font-size: 8px;
140
+ color: #f59e0b;
141
+ font-family: 'Press Start 2P', cursive;
142
+ white-space: nowrap;
143
+ `;
144
+
145
+ const TransactionList = styled.div`
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 4px;
149
+ max-height: 280px;
150
+ overflow-y: auto;
151
+ `;
152
+
153
+ const TransactionRow = styled.div`
154
+ background: rgba(0, 0, 0, 0.4);
155
+ border: 1px solid rgba(255, 215, 0, 0.2);
156
+ padding: 8px;
157
+ display: grid;
158
+ grid-template-columns: 1fr auto;
159
+ grid-template-rows: auto auto auto;
160
+ gap: 2px;
161
+ `;
162
+
163
+ const TxType = styled.span`
164
+ font-size: 8px;
165
+ color: #f59e0b;
166
+ font-family: 'Press Start 2P', cursive;
167
+ grid-column: 1;
168
+ grid-row: 1;
169
+ `;
170
+
171
+ const TxAmount = styled.span<{ $credit: boolean }>`
172
+ font-size: 10px;
173
+ font-family: 'Press Start 2P', cursive;
174
+ color: ${({ $credit }) => ($credit ? uiColors.green : uiColors.red)};
175
+ font-weight: bold;
176
+ grid-column: 2;
177
+ grid-row: 1;
178
+ text-align: right;
179
+ `;
180
+
181
+ const TxNote = styled.span`
182
+ font-size: 7px;
183
+ color: ${uiColors.lightGray};
184
+ font-family: 'Press Start 2P', cursive;
185
+ grid-column: 1;
186
+ grid-row: 2;
187
+ `;
188
+
189
+ const TxDate = styled.span`
190
+ font-size: 7px;
191
+ color: ${uiColors.lightGray};
192
+ font-family: 'Press Start 2P', cursive;
193
+ grid-column: 2;
194
+ grid-row: 2;
195
+ text-align: right;
196
+ `;
197
+
198
+ const TxBalance = styled.span`
199
+ font-size: 7px;
200
+ color: ${uiColors.white};
201
+ font-family: 'Press Start 2P', cursive;
202
+ grid-column: 1 / 3;
203
+ grid-row: 3;
204
+ opacity: 0.7;
205
+ `;
206
+
207
+ const LoadingRow = styled.div`
208
+ display: flex;
209
+ align-items: center;
210
+ gap: 8px;
211
+ justify-content: center;
212
+ padding: 16px;
213
+ color: ${uiColors.white};
214
+ font-size: 9px;
215
+ font-family: 'Press Start 2P', cursive;
216
+ `;
217
+
218
+ const Spinner = styled.div`
219
+ border: 3px solid rgba(255, 255, 255, 0.2);
220
+ border-radius: 50%;
221
+ border-top: 3px solid #f59e0b;
222
+ width: 20px;
223
+ height: 20px;
224
+ animation: spin 0.8s linear infinite;
225
+
226
+ @keyframes spin {
227
+ 0% { transform: rotate(0deg); }
228
+ 100% { transform: rotate(360deg); }
229
+ }
230
+ `;
231
+
232
+ const EmptyMessage = styled.div`
233
+ font-size: 9px;
234
+ color: ${uiColors.lightGray};
235
+ font-family: 'Press Start 2P', cursive;
236
+ text-align: center;
237
+ padding: 20px;
238
+ `;
@@ -0,0 +1,217 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { FaPaperPlane } from 'react-icons/fa';
3
+ import styled from 'styled-components';
4
+ import { uiColors } from '../../constants/uiColors';
5
+ import { ConfirmModal } from '../ConfirmModal';
6
+ import { Input } from '../Input';
7
+ import { CTAButton } from '../shared/CTAButton/CTAButton';
8
+
9
+ export interface IDCTransferPanelProps {
10
+ dcBalance: number;
11
+ transferLoading: boolean;
12
+ transferResult: { success: boolean; message: string } | null;
13
+ onSendTransfer: (recipientName: string, amount: number) => void;
14
+ onClearTransferResult: () => void;
15
+ characterName?: string;
16
+ onInputFocus?: () => void;
17
+ onInputBlur?: () => void;
18
+ }
19
+
20
+ export const DCTransferPanel: React.FC<IDCTransferPanelProps> = ({
21
+ dcBalance,
22
+ transferLoading,
23
+ transferResult,
24
+ onSendTransfer,
25
+ onClearTransferResult,
26
+ characterName,
27
+ onInputFocus,
28
+ onInputBlur,
29
+ }) => {
30
+ const [recipientName, setRecipientName] = useState<string>('');
31
+ const [amount, setAmount] = useState<string>('');
32
+ const [validationError, setValidationError] = useState<string>('');
33
+ const [showConfirm, setShowConfirm] = useState<boolean>(false);
34
+ const clearResultTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
35
+
36
+ useEffect(() => {
37
+ if (transferResult) {
38
+ if (clearResultTimerRef.current) {
39
+ clearTimeout(clearResultTimerRef.current);
40
+ }
41
+ clearResultTimerRef.current = setTimeout(() => {
42
+ onClearTransferResult();
43
+ }, 5000);
44
+ }
45
+
46
+ return (): void => {
47
+ if (clearResultTimerRef.current) {
48
+ clearTimeout(clearResultTimerRef.current);
49
+ }
50
+ };
51
+ }, [transferResult]);
52
+
53
+ const validate = (): boolean => {
54
+ const parsedAmount = parseInt(amount, 10);
55
+ const trimmedRecipient = recipientName.trim();
56
+
57
+ if (!trimmedRecipient) {
58
+ setValidationError('Recipient name is required.');
59
+ return false;
60
+ }
61
+
62
+ if (characterName && trimmedRecipient.toLowerCase() === characterName.toLowerCase()) {
63
+ setValidationError('You cannot transfer DC to yourself.');
64
+ return false;
65
+ }
66
+
67
+ if (isNaN(parsedAmount) || parsedAmount <= 0 || !Number.isInteger(parsedAmount)) {
68
+ setValidationError('Amount must be a positive integer.');
69
+ return false;
70
+ }
71
+
72
+ if (parsedAmount > dcBalance) {
73
+ setValidationError('Insufficient DC balance.');
74
+ return false;
75
+ }
76
+
77
+ setValidationError('');
78
+ return true;
79
+ };
80
+
81
+ const handleSendClick = useCallback((): void => {
82
+ if (!validate()) return;
83
+ setShowConfirm(true);
84
+ }, [recipientName, amount, dcBalance, characterName]);
85
+
86
+ const handleConfirmTransfer = useCallback((): void => {
87
+ setShowConfirm(false);
88
+ onSendTransfer(recipientName.trim(), parseInt(amount, 10));
89
+ setRecipientName('');
90
+ setAmount('');
91
+ }, [recipientName, amount, onSendTransfer]);
92
+
93
+ return (
94
+ <PanelContainer>
95
+ <FieldLabel>Recipient Character Name</FieldLabel>
96
+ <StyledInput
97
+ type="text"
98
+ value={recipientName}
99
+ onChange={(e) => setRecipientName(e.target.value)}
100
+ onFocus={onInputFocus}
101
+ onBlur={onInputBlur}
102
+ placeholder="Enter character name"
103
+ disabled={transferLoading}
104
+ />
105
+
106
+ <FieldLabel>Amount (DC)</FieldLabel>
107
+ <StyledInput
108
+ type="number"
109
+ min={1}
110
+ value={amount}
111
+ onChange={(e) => setAmount(e.target.value)}
112
+ onFocus={onInputFocus}
113
+ onBlur={onInputBlur}
114
+ placeholder="0"
115
+ disabled={transferLoading}
116
+ />
117
+
118
+ {validationError && <ErrorMessage>{validationError}</ErrorMessage>}
119
+
120
+ <ButtonRow>
121
+ <CTAButton
122
+ icon={<FaPaperPlane />}
123
+ label={transferLoading ? 'Sending...' : 'Send'}
124
+ onClick={handleSendClick}
125
+ disabled={transferLoading}
126
+ fullWidth
127
+ />
128
+ </ButtonRow>
129
+
130
+ {transferLoading && <Spinner />}
131
+
132
+ {transferResult && (
133
+ <ResultMessage $success={transferResult.success}>
134
+ {transferResult.message}
135
+ </ResultMessage>
136
+ )}
137
+
138
+ {showConfirm && (
139
+ <ConfirmModal
140
+ message={`Transfer ${parseInt(amount, 10)} DC to "${recipientName.trim()}"?`}
141
+ onConfirm={handleConfirmTransfer}
142
+ onClose={() => setShowConfirm(false)}
143
+ />
144
+ )}
145
+ </PanelContainer>
146
+ );
147
+ };
148
+
149
+ const PanelContainer = styled.div`
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: 8px;
153
+ padding: 8px 0;
154
+ `;
155
+
156
+ const FieldLabel = styled.label`
157
+ font-size: 9px;
158
+ color: #f59e0b;
159
+ font-family: 'Press Start 2P', cursive;
160
+ margin-top: 8px;
161
+ `;
162
+
163
+ const StyledInput = styled(Input)`
164
+ background: rgba(0, 0, 0, 0.6);
165
+ border: 1px solid #f59e0b;
166
+ color: ${uiColors.white};
167
+ padding: 6px 8px;
168
+ font-size: 12px;
169
+ font-family: 'Press Start 2P', cursive;
170
+ width: 100%;
171
+ box-sizing: border-box;
172
+
173
+ &:disabled {
174
+ opacity: 0.5;
175
+ }
176
+
177
+ &:focus {
178
+ outline: none;
179
+ border-color: ${uiColors.white};
180
+ }
181
+ `;
182
+
183
+ const ButtonRow = styled.div`
184
+ margin-top: 8px;
185
+ `;
186
+
187
+ const Spinner = styled.div`
188
+ border: 3px solid rgba(255, 255, 255, 0.2);
189
+ border-radius: 50%;
190
+ border-top: 3px solid #f59e0b;
191
+ width: 24px;
192
+ height: 24px;
193
+ animation: spin 0.8s linear infinite;
194
+ margin: 8px auto 0;
195
+
196
+ @keyframes spin {
197
+ 0% { transform: rotate(0deg); }
198
+ 100% { transform: rotate(360deg); }
199
+ }
200
+ `;
201
+
202
+ const ResultMessage = styled.div<{ $success: boolean }>`
203
+ margin-top: 8px;
204
+ padding: 8px;
205
+ font-size: 9px;
206
+ font-family: 'Press Start 2P', cursive;
207
+ color: ${({ $success }) => ($success ? uiColors.green : uiColors.red)};
208
+ border: 1px solid ${({ $success }) => ($success ? uiColors.green : uiColors.red)};
209
+ background: rgba(0, 0, 0, 0.4);
210
+ text-align: center;
211
+ `;
212
+
213
+ const ErrorMessage = styled.div`
214
+ font-size: 9px;
215
+ color: ${uiColors.red};
216
+ font-family: 'Press Start 2P', cursive;
217
+ `;
@@ -0,0 +1,225 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import { FaTimes } from 'react-icons/fa';
3
+ import styled from 'styled-components';
4
+ import { uiColors } from '../../constants/uiColors';
5
+ import ModalPortal from '../Abstractions/ModalPortal';
6
+ import { InternalTabs } from '../InternalTabs/InternalTabs';
7
+ import { DCHistoryPanel, IDCTransaction } from './DCHistoryPanel';
8
+ import { DCTransferPanel } from './DCTransferPanel';
9
+
10
+ type WalletTabId = 'balance' | 'transfer' | 'history';
11
+
12
+ export interface IDCWalletModalProps {
13
+ dcBalance: number;
14
+ onClose: () => void;
15
+ historyData: { transactions: IDCTransaction[]; totalPages: number; currentPage: number } | null;
16
+ historyLoading: boolean;
17
+ onRequestHistory: (page: number, type?: string) => void;
18
+ transferLoading: boolean;
19
+ transferResult: { success: boolean; message: string } | null;
20
+ onSendTransfer: (recipientName: string, amount: number) => void;
21
+ onClearTransferResult: () => void;
22
+ characterName?: string;
23
+ onInputFocus?: () => void;
24
+ onInputBlur?: () => void;
25
+ }
26
+
27
+ export const DCWalletModal: React.FC<IDCWalletModalProps> = ({
28
+ dcBalance,
29
+ onClose,
30
+ historyData,
31
+ historyLoading,
32
+ onRequestHistory,
33
+ transferLoading,
34
+ transferResult,
35
+ onSendTransfer,
36
+ onClearTransferResult,
37
+ characterName,
38
+ onInputFocus,
39
+ onInputBlur,
40
+ }) => {
41
+ const [activeTab, setActiveTab] = useState<WalletTabId>('balance');
42
+
43
+ const stopPropagation = useCallback(
44
+ (e: React.MouseEvent | React.TouchEvent | React.PointerEvent) => {
45
+ e.stopPropagation();
46
+ },
47
+ []
48
+ );
49
+
50
+ const tabs = [
51
+ {
52
+ id: 'balance',
53
+ title: 'Balance',
54
+ content: (
55
+ <BalanceContent>
56
+ <BalanceLabel>Your DC Balance</BalanceLabel>
57
+ <BalanceAmount>{dcBalance.toLocaleString()} DC</BalanceAmount>
58
+ <BalanceHint>Buy DC packs from the Store &gt; Packs tab.</BalanceHint>
59
+ </BalanceContent>
60
+ ),
61
+ },
62
+ {
63
+ id: 'transfer',
64
+ title: 'Transfer',
65
+ content: (
66
+ <DCTransferPanel
67
+ dcBalance={dcBalance}
68
+ transferLoading={transferLoading}
69
+ transferResult={transferResult}
70
+ onSendTransfer={onSendTransfer}
71
+ onClearTransferResult={onClearTransferResult}
72
+ characterName={characterName}
73
+ onInputFocus={onInputFocus}
74
+ onInputBlur={onInputBlur}
75
+ />
76
+ ),
77
+ },
78
+ {
79
+ id: 'history',
80
+ title: 'History',
81
+ content: (
82
+ <DCHistoryPanel
83
+ transactions={historyData?.transactions ?? []}
84
+ totalPages={historyData?.totalPages ?? 0}
85
+ currentPage={historyData?.currentPage ?? 1}
86
+ loading={historyLoading}
87
+ onRequestHistory={onRequestHistory}
88
+ />
89
+ ),
90
+ },
91
+ ];
92
+
93
+ return (
94
+ <ModalPortal>
95
+ <Overlay onPointerDown={onClose} />
96
+ <ModalContainer>
97
+ <ModalContent
98
+ onClick={stopPropagation as React.MouseEventHandler}
99
+ onTouchStart={stopPropagation as React.TouchEventHandler}
100
+ onPointerDown={stopPropagation as React.PointerEventHandler}
101
+ >
102
+ <Header>
103
+ <Title>DC Wallet</Title>
104
+ <CloseButton onPointerDown={onClose} aria-label="Close">
105
+ <FaTimes />
106
+ </CloseButton>
107
+ </Header>
108
+
109
+ <WalletContainer>
110
+ <InternalTabs
111
+ tabs={tabs}
112
+ activeTab={activeTab}
113
+ onTabChange={(tabId: string) => setActiveTab(tabId as WalletTabId)}
114
+ activeTextColor="#000000"
115
+ activeColor="#fef08a"
116
+ inactiveColor="#6b7280"
117
+ borderColor="#f59e0b"
118
+ hoverColor="#fef3c7"
119
+ />
120
+ </WalletContainer>
121
+ </ModalContent>
122
+ </ModalContainer>
123
+ </ModalPortal>
124
+ );
125
+ };
126
+
127
+ const Overlay = styled.div`
128
+ position: fixed;
129
+ inset: 0;
130
+ background: rgba(0, 0, 0, 0.65);
131
+ z-index: 1000;
132
+ `;
133
+
134
+ const ModalContainer = styled.div`
135
+ position: fixed;
136
+ inset: 0;
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ z-index: 1001;
141
+ pointer-events: none;
142
+ `;
143
+
144
+ const ModalContent = styled.div`
145
+ background: #1a1a2e;
146
+ border: 2px solid #f59e0b;
147
+ border-radius: 8px;
148
+ padding: 16px 20px 20px;
149
+ min-width: 400px;
150
+ max-width: 90%;
151
+ display: flex;
152
+ flex-direction: column;
153
+ gap: 12px;
154
+ pointer-events: auto;
155
+ animation: scaleIn 0.15s ease-out;
156
+
157
+ @keyframes scaleIn {
158
+ from { transform: scale(0.85); opacity: 0; }
159
+ to { transform: scale(1); opacity: 1; }
160
+ }
161
+ `;
162
+
163
+ const Header = styled.div`
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: space-between;
167
+ `;
168
+
169
+ const Title = styled.h3`
170
+ margin: 0;
171
+ font-family: 'Press Start 2P', cursive;
172
+ font-size: 0.7rem;
173
+ color: #fef08a;
174
+ `;
175
+
176
+ const CloseButton = styled.button`
177
+ background: none;
178
+ border: none;
179
+ color: rgba(255, 255, 255, 0.6);
180
+ cursor: pointer;
181
+ font-size: 1rem;
182
+ padding: 4px;
183
+ display: flex;
184
+ align-items: center;
185
+
186
+ &:hover {
187
+ color: #ffffff;
188
+ }
189
+ `;
190
+
191
+ const WalletContainer = styled.div`
192
+ display: flex;
193
+ flex-direction: column;
194
+ width: 100%;
195
+ min-height: 300px;
196
+ gap: 0.5rem;
197
+ `;
198
+
199
+ const BalanceContent = styled.div`
200
+ display: flex;
201
+ flex-direction: column;
202
+ align-items: center;
203
+ gap: 12px;
204
+ padding: 32px 16px;
205
+ `;
206
+
207
+ const BalanceLabel = styled.span`
208
+ font-family: 'Press Start 2P', cursive;
209
+ font-size: 10px;
210
+ color: ${uiColors.lightGray};
211
+ `;
212
+
213
+ const BalanceAmount = styled.div`
214
+ font-family: 'Press Start 2P', cursive;
215
+ font-size: 28px;
216
+ color: #fef08a;
217
+ text-shadow: 2px 2px 0 #000;
218
+ letter-spacing: 2px;
219
+ `;
220
+
221
+ const BalanceHint = styled.span`
222
+ font-family: 'Press Start 2P', cursive;
223
+ font-size: 7px;
224
+ color: ${uiColors.lightGray};
225
+ `;
package/src/index.tsx CHANGED
@@ -11,6 +11,7 @@ export * from './components/CheckItem';
11
11
  export * from './components/CircularController/CircularController';
12
12
  export * from './components/CraftBook/CraftBook';
13
13
  export * from './components/DailyTasks/DailyTasks';
14
+ export * from './components/DCWallet/DCWalletModal';
14
15
  export * from './components/LoginStreak/LoginStreakPanel';
15
16
  export * from './components/DPad/JoystickDPad';
16
17
  export * from './components/DraggableContainer';