@pollar/react 0.7.0 → 0.8.0

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/README.md CHANGED
@@ -3,8 +3,13 @@
3
3
  React bindings for [Pollar](https://pollar.xyz) — drop-in authentication UI, transaction modals, and hooks for
4
4
  Stellar-based applications.
5
5
 
6
- > **0.7.0 is a breaking change.** The context's session is now `PollarPersistedSession | null` and PII has moved to
7
- > `client.getUserProfile()`. Read the [CHANGELOG](../../CHANGELOG.md) before upgrading.
6
+ > **0.8.0 reshapes `<PollarProvider>` props (breaking).** `config` `client`
7
+ > (now accepts a `PollarClient` instance or a `PollarClientConfig`); `styles`
8
+ > moves under `appConfig.styles`; new `appConfig` prop is the opt-out switch
9
+ > for the remote `/applications/config` fetch (pass it — even `{}` — to skip
10
+ > the fetch); new `ui.renderWallets` slot replaces the default Freighter/Albedo
11
+ > picker. Read the [CHANGELOG](../../CHANGELOG.md) and
12
+ > [UPGRADE.md](../../UPGRADE.md) before upgrading.
8
13
 
9
14
  ## Installation
10
15
 
@@ -27,11 +32,7 @@ import { PollarProvider } from '@pollar/react';
27
32
  import '@pollar/react/styles.css';
28
33
 
29
34
  export default function App({ children }: { children: React.ReactNode }) {
30
- return (
31
- <PollarProvider config={{ apiKey: 'your-api-key' }}>
32
- {children}
33
- </PollarProvider>
34
- );
35
+ return <PollarProvider client={{ apiKey: 'your-api-key' }}>{children}</PollarProvider>;
35
36
  }
36
37
  ```
37
38
 
@@ -42,11 +43,7 @@ export function Profile() {
42
43
  const { isAuthenticated, walletAddress, login, logout, getClient } = usePollar();
43
44
 
44
45
  if (!isAuthenticated) {
45
- return (
46
- <button onClick={() => login({ provider: 'google' })}>
47
- Sign in with Google
48
- </button>
49
- );
46
+ return <button onClick={() => login({ provider: 'google' })}>Sign in with Google</button>;
50
47
  }
51
48
 
52
49
  // PII (email, name, avatar, providers) lives in memory only — fetch it from the client.
@@ -70,29 +67,50 @@ Context provider that initialises the Pollar client and makes it available to ch
70
67
 
71
68
  ```tsx
72
69
  <PollarProvider
73
- config={{
70
+ client={{
74
71
  apiKey: 'your-api-key',
75
- baseUrl: 'https://sdk.api.pollar.xyz', // optional
76
- stellarNetwork: 'testnet', // optional, default: 'testnet'
77
- // 0.7.0 options threaded straight through to PollarClient:
78
- storage, // optional, RN apps inject this
79
- keyManager, // optional, autodetects on web
80
- walletAdapter, // optional, external wallet stack
81
- deviceLabel: 'iPhone — Safari', // optional, shown in SessionsModal
82
- onStorageDegrade, // optional, telemetry hook
72
+ baseUrl: 'https://sdk.api.pollar.xyz', // optional
73
+ stellarNetwork: 'testnet', // optional, default: 'testnet'
74
+ storage, // optional, RN apps inject this
75
+ keyManager, // optional, autodetects on web
76
+ walletAdapter, // optional, external wallet stack
77
+ deviceLabel: 'iPhone — Safari', // optional, shown in SessionsModal
78
+ onStorageDegrade, // optional, telemetry hook
79
+ }}
80
+ // Optional: pass `appConfig` (even `{}`) to skip the remote
81
+ // `/applications/config` fetch and use local-only styles/branding.
82
+ appConfig={{
83
+ styles: {
84
+ /* optional style overrides */
85
+ },
86
+ }}
87
+ ui={{
88
+ // Optional: replace the default Freighter/Albedo wallet picker.
89
+ // See "External wallet stacks" below for a kit-powered example.
90
+ renderWallets: undefined,
83
91
  }}
84
- styles={{ /* optional style overrides */ }}
85
- adapters={{ /* optional named adapter set */ }}
92
+ adapters={
93
+ {
94
+ /* optional named adapter set */
95
+ }
96
+ }
86
97
  >
87
98
  {children}
88
99
  </PollarProvider>
89
100
  ```
90
101
 
91
- | Prop | Type | Required | Description |
92
- | ---------- | ------------------- | -------- | -------------------------------------------------------------------------- |
93
- | `config` | `PollarClientConfig`| Yes | Configuration passed verbatim to `PollarClient` |
94
- | `styles` | `PollarStyles` | No | Per-app style overrides; merged on top of `appConfig.styles` from the API |
95
- | `adapters` | `PollarAdapters` | No | Named set of `PollarAdapter` objects (e.g. Trustless Work). See below |
102
+ | Prop | Type | Required | Description |
103
+ | ----------- | --------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
104
+ | `client` | `PollarClient \| PollarClientConfig` | Yes | Either a pre-built `PollarClient` (testing, reuse outside React) or a `PollarClientConfig` the provider will construct one from. **Locked at first render** — swapping after mount is ignored |
105
+ | `appConfig` | `PollarConfig` | No | Local override of `/applications/config`. **Presence is the opt-out switch**: pass it (even `{}`) and the remote fetch is skipped. Omit it to keep the existing remote-fetch-on-mount behaviour |
106
+ | `ui` | `{ renderWallets?: RenderWalletsSlot }` | No | UI customisation slots. `renderWallets` replaces the default Freighter/Albedo buttons in `LoginModal`'s wallet picker. Receives `{ onConnect, authState }` and is expected to call `onConnect(walletId)` |
107
+ | `adapters` | `PollarAdapters` | No | Named set of `PollarAdapter` objects (e.g. Trustless Work). See below |
108
+
109
+ > **Renamed in 0.8.0** — `config` → `client`, `styles` → `appConfig.styles`.
110
+ > If you were passing `styles={{ ... }}` directly, move it to
111
+ > `appConfig={{ styles: { ... } }}` (which also opts you out of the remote
112
+ > `/applications/config` fetch). See [UPGRADE.md](../../UPGRADE.md) for the
113
+ > full migration matrix.
96
114
 
97
115
  ---
98
116
 
@@ -104,56 +122,56 @@ needed.
104
122
  ```ts
105
123
  const {
106
124
  // Session
107
- isAuthenticated, // boolean — true when a wallet public key is present
108
- walletAddress, // string — '' until authenticated
109
- walletType, // WalletId | null
125
+ isAuthenticated, // boolean — true when a wallet public key is present
126
+ walletAddress, // string — '' until authenticated
127
+ walletType, // WalletId | null
110
128
 
111
129
  // Client escape hatch
112
- getClient, // () => PollarClient — for getUserProfile(), listSessions(), …
130
+ getClient, // () => PollarClient — for getUserProfile(), listSessions(), …
113
131
 
114
132
  // Auth
115
- login, // (options: PollarLoginOptions) => void
116
- logout, // () => void (fire-and-forget; await getClient().logout() if you need the promise)
117
- openLoginModal, // () => void
133
+ login, // (options: PollarLoginOptions) => void
134
+ logout, // () => void (fire-and-forget; await getClient().logout() if you need the promise)
135
+ openLoginModal, // () => void
118
136
 
119
137
  // Sessions (new in 0.7.0)
120
- openSessionsModal, // () => void
138
+ openSessionsModal, // () => void
121
139
 
122
140
  // Transactions
123
- tx, // TransactionState
124
- buildTx, // (operation, params, options?) => Promise<void>
125
- signAndSubmitTx, // (unsignedXdr: string) => Promise<void>
126
- openTxModal, // () => void
141
+ tx, // TransactionState
142
+ buildTx, // (operation, params, options?) => Promise<void>
143
+ signAndSubmitTx, // (unsignedXdr: string) => Promise<void>
144
+ openTxModal, // () => void
127
145
 
128
146
  // Transaction history
129
- txHistory, // TxHistoryState
130
- openTxHistoryModal, // () => void
147
+ txHistory, // TxHistoryState
148
+ openTxHistoryModal, // () => void
131
149
 
132
150
  // Wallet balance
133
- walletBalance, // WalletBalanceState
134
- refreshWalletBalance, // () => Promise<void>
151
+ walletBalance, // WalletBalanceState
152
+ refreshWalletBalance, // () => Promise<void>
135
153
  openWalletBalanceModal, // () => void
136
154
 
137
155
  // Send / Receive
138
- openSendModal, // () => void
139
- openReceiveModal, // () => void
156
+ openSendModal, // () => void
157
+ openReceiveModal, // () => void
140
158
 
141
159
  // Network
142
- network, // StellarNetwork — 'mainnet' | 'testnet'
143
- setNetwork, // (network: StellarNetwork) => void
160
+ network, // StellarNetwork — 'mainnet' | 'testnet'
161
+ setNetwork, // (network: StellarNetwork) => void
144
162
 
145
163
  // KYC (UI ready — backend coming soon)
146
- openKycModal, // (options?: { country?, level?, onApproved? }) => void
164
+ openKycModal, // (options?: { country?, level?, onApproved? }) => void
147
165
 
148
166
  // Ramp (UI ready — backend coming soon)
149
- openRampModal, // () => void
167
+ openRampModal, // () => void
150
168
 
151
169
  // App config / styles served by the Pollar API
152
- appConfig, // PollarConfig
153
- styles, // PollarStyles
170
+ appConfig, // PollarConfig
171
+ styles, // PollarStyles
154
172
 
155
173
  // Adapters (from PollarProvider props)
156
- adapters, // PollarAdapters | undefined
174
+ adapters, // PollarAdapters | undefined
157
175
  } = usePollar();
158
176
  ```
159
177
 
@@ -187,16 +205,16 @@ login({ provider: 'wallet', type: 'lobstr' });
187
205
  Every modal mounts itself when its `openXModal()` action is called. You don't need to render these directly — they're
188
206
  already wired inside `<PollarProvider>` — but they're exported in case you want to mount them yourself.
189
207
 
190
- | Component | Purpose |
191
- | ------------------------- | ------------------------------------------------------------------------------------------------------------- |
192
- | `<WalletButton>` | Drop-in button. Opens login when signed out; signed in, shows the wallet address with a dropdown (Send, Receive, balance, history, sign out). Inline arc spinner during in-progress transactions |
193
- | `<SendModal>` | Full send flow: asset picker, amount, destination, inline build → sign → success/error |
194
- | `<ReceiveModal>` | Wallet address as QR code with copy-to-clipboard (no external QR dependency required) |
195
- | `<TxHistoryModal>` | Paginated transaction history with auto-fetch on open and stellar.expert explorer links |
196
- | `<WalletBalanceModal>` | Stellar account balances with refresh button |
197
- | `<SessionsModal>` | **New in 0.7.0.** Lists every active refresh-token family for the current user with device metadata, marks the local session, per-row revoke, and a "Sign out everywhere" button |
198
- | `<KycModal>` | Identity verification flow — provider selection + status polling *(UI preview — backend coming soon)* |
199
- | `<RampWidget>` | Buy/sell crypto — direction tabs, route comparison, payment instructions *(UI preview — backend coming soon)* |
208
+ | Component | Purpose |
209
+ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
210
+ | `<WalletButton>` | Drop-in button. Opens login when signed out; signed in, shows the wallet address with a dropdown (Send, Receive, balance, history, sign out). Inline arc spinner during in-progress transactions |
211
+ | `<SendModal>` | Full send flow: asset picker, amount, destination, inline build → sign → success/error |
212
+ | `<ReceiveModal>` | Wallet address as QR code with copy-to-clipboard (no external QR dependency required) |
213
+ | `<TxHistoryModal>` | Paginated transaction history with auto-fetch on open and stellar.expert explorer links |
214
+ | `<WalletBalanceModal>` | Stellar account balances with refresh button |
215
+ | `<SessionsModal>` | **New in 0.7.0.** Lists every active refresh-token family for the current user with device metadata, marks the local session, per-row revoke, and a "Sign out everywhere" button |
216
+ | `<KycModal>` | Identity verification flow — provider selection + status polling _(UI preview — backend coming soon)_ |
217
+ | `<RampWidget>` | Buy/sell crypto — direction tabs, route comparison, payment instructions _(UI preview — backend coming soon)_ |
200
218
 
201
219
  ```tsx
202
220
  import { WalletButton } from '@pollar/react';
@@ -213,18 +231,18 @@ export function Header() {
213
231
  Every modal ships a pure presentational "template" companion — same name with a `Template` suffix. Use these when you
214
232
  want to swap the chrome but keep the data wiring from `usePollar()`.
215
233
 
216
- | Wrapper | Template |
217
- | ---------------------- | ------------------------------ |
218
- | `<WalletButton>` | `<WalletButtonTemplate>` |
219
- | *(internal LoginModal)*| `<LoginModalTemplate>` |
220
- | `<SendModal>` | `<SendModalTemplate>` |
221
- | `<ReceiveModal>` | `<ReceiveModalTemplate>` |
222
- | `<TransactionModal>` | `<TransactionModalTemplate>` |
223
- | `<TxHistoryModal>` | `<TxHistoryModalTemplate>` |
224
- | `<WalletBalanceModal>` | `<WalletBalanceModalTemplate>` |
225
- | `<KycModal>` | `<KycModalTemplate>` |
226
- | `<RampWidget>` | `<RampWidgetTemplate>` |
227
- | `<SessionsModal>` | `<SessionsModalTemplate>` |
234
+ | Wrapper | Template |
235
+ | ----------------------- | ------------------------------ |
236
+ | `<WalletButton>` | `<WalletButtonTemplate>` |
237
+ | _(internal LoginModal)_ | `<LoginModalTemplate>` |
238
+ | `<SendModal>` | `<SendModalTemplate>` |
239
+ | `<ReceiveModal>` | `<ReceiveModalTemplate>` |
240
+ | `<TransactionModal>` | `<TransactionModalTemplate>` |
241
+ | `<TxHistoryModal>` | `<TxHistoryModalTemplate>` |
242
+ | `<WalletBalanceModal>` | `<WalletBalanceModalTemplate>` |
243
+ | `<KycModal>` | `<KycModalTemplate>` |
244
+ | `<RampWidget>` | `<RampWidgetTemplate>` |
245
+ | `<SessionsModal>` | `<SessionsModalTemplate>` |
228
246
 
229
247
  `<TxStatusView>` is the shared status component (build → sign → success/error) reused by `TransactionModal` and
230
248
  `SendModal`; it's exported on its own for consumers that want to embed the lifecycle elsewhere.
@@ -241,12 +259,12 @@ import type { PollarAdapter } from '@pollar/core';
241
259
 
242
260
  const trustlessWork: PollarAdapter = {
243
261
  initialize: async (params) => ({ unsignedTransaction: '…' }),
244
- release: async (params) => ({ unsignedTransaction: '…' }),
262
+ release: async (params) => ({ unsignedTransaction: '…' }),
245
263
  };
246
264
 
247
- <PollarProvider config={{ apiKey }} adapters={{ trustlessWork }}>
265
+ <PollarProvider client={{ apiKey }} adapters={{ trustlessWork }}>
248
266
 
249
- </PollarProvider>
267
+ </PollarProvider>;
250
268
  ```
251
269
 
252
270
  > **Renamed in 0.7.0** — `EscrowFn` → `AdapterFn` and `EscrowAdapter` → `PollarAdapter`. Runtime contract is
@@ -263,7 +281,9 @@ const useTrustlessWork = createPollarAdapterHook<typeof trustlessWork>('trustles
263
281
 
264
282
  function MyComponent() {
265
283
  const tw = useTrustlessWork();
266
- await tw.initialize({ /* … */ }); // unsigned XDR is built, signed, and submitted automatically
284
+ await tw.initialize({
285
+ /* … */
286
+ }); // unsigned XDR is built, signed, and submitted automatically
267
287
  }
268
288
  ```
269
289
 
@@ -271,7 +291,9 @@ function MyComponent() {
271
291
 
272
292
  ### External wallet stacks (Stellar Wallets Kit, …)
273
293
 
274
- Pass a `WalletAdapterResolver` to `config.walletAdapter` so Pollar can reach wallets that live outside `@pollar/core`:
294
+ Pass a `WalletAdapterResolver` to `client.walletAdapter` so Pollar can reach
295
+ wallets that live outside `@pollar/core`. The signing path alone (no UI
296
+ changes):
275
297
 
276
298
  ```tsx
277
299
  import { PollarProvider } from '@pollar/react';
@@ -279,16 +301,58 @@ import { stellarWalletsKit } from '@pollar/stellar-wallets-kit-adapter';
279
301
  import { Networks } from '@creit.tech/stellar-wallets-kit';
280
302
 
281
303
  <PollarProvider
282
- config={{
304
+ client={{
283
305
  apiKey: 'your-api-key',
284
306
  walletAdapter: stellarWalletsKit({ network: Networks.PUBLIC }),
285
307
  }}
286
308
  >
287
309
  {children}
288
- </PollarProvider>
310
+ </PollarProvider>;
289
311
  ```
290
312
 
291
- Then any `login({ provider: 'wallet', type: '<kit wallet id>' })` is routed through the kit.
313
+ Then any `login({ provider: 'wallet', type: '<kit wallet id>' })` is routed
314
+ through the kit. The built-in `LoginModal` still shows only Freighter / Albedo
315
+ unless you also wire `ui.renderWallets` (next section).
316
+
317
+ #### Showing every kit wallet in `LoginModal`
318
+
319
+ The `ui.renderWallets` slot replaces the hardcoded Freighter+Albedo buttons.
320
+ `@pollar/stellar-wallets-kit-adapter/picker` ships a bundle that builds both
321
+ halves (signing + picker UI) from a single options object — drop both into
322
+ `<PollarProvider>` and the kit's full wallet list (xBull, Lobstr, Rabet, …)
323
+ renders in `LoginModal`:
324
+
325
+ ```tsx
326
+ import { PollarProvider } from '@pollar/react';
327
+ import { createStellarWalletsKitBundle } from '@pollar/stellar-wallets-kit-adapter/picker';
328
+ import { Networks } from '@creit.tech/stellar-wallets-kit';
329
+
330
+ const bundle = createStellarWalletsKitBundle({
331
+ network: Networks.PUBLIC,
332
+ picker: { wallets: ['xbull', 'lobstr', 'freighter'] }, // subset, optional
333
+ });
334
+
335
+ <PollarProvider
336
+ client={{ apiKey: 'your-api-key', walletAdapter: bundle.walletAdapter }}
337
+ ui={{ renderWallets: bundle.renderWallets }}
338
+ >
339
+ {children}
340
+ </PollarProvider>;
341
+ ```
342
+
343
+ If you only want a custom picker (no kit), `renderWallets` is just a function
344
+ of `{ onConnect, authState }` — return whatever JSX you want and call
345
+ `onConnect(walletId)` when the user picks a wallet:
346
+
347
+ ```tsx
348
+ ui={{
349
+ renderWallets: ({ onConnect, authState }) => (
350
+ <button disabled={authState.step !== 'idle'} onClick={() => onConnect('xbull')}>
351
+ xBull
352
+ </button>
353
+ ),
354
+ }}
355
+ ```
292
356
 
293
357
  ---
294
358
 
@@ -317,6 +381,10 @@ import type {
317
381
  PollarConfig,
318
382
  PollarStyles,
319
383
 
384
+ // 0.8.0 — wallet picker slot
385
+ RenderWalletsProps,
386
+ RenderWalletsSlot,
387
+
320
388
  // Template props
321
389
  SendModalTemplateProps,
322
390
  ReceiveModalTemplateProps,
package/dist/index.css CHANGED
@@ -270,6 +270,97 @@
270
270
  animation: pollar-spin 1s linear infinite;
271
271
  }
272
272
 
273
+ /* src/components/distribution-rules-modal/DistributionRulesModal.css */
274
+ .pollar-dist-modal {
275
+ max-width: 460px;
276
+ }
277
+ .pollar-dist-list {
278
+ display: flex;
279
+ flex-direction: column;
280
+ gap: 0.625rem;
281
+ max-height: 420px;
282
+ overflow-y: auto;
283
+ margin-bottom: 1rem;
284
+ }
285
+ .pollar-dist-item {
286
+ display: flex;
287
+ flex-direction: column;
288
+ gap: 0.375rem;
289
+ background: var(--pollar-input-bg);
290
+ border: 1px solid var(--pollar-border);
291
+ border-radius: var(--pollar-card-border-radius, 10px);
292
+ padding: 0.875rem 1rem;
293
+ }
294
+ .pollar-dist-item[data-claimable=false] {
295
+ opacity: 0.7;
296
+ }
297
+ .pollar-dist-item-row {
298
+ display: flex;
299
+ align-items: baseline;
300
+ justify-content: space-between;
301
+ gap: 0.75rem;
302
+ }
303
+ .pollar-dist-item-name {
304
+ font-size: 0.9375rem;
305
+ font-weight: 600;
306
+ color: var(--pollar-text);
307
+ overflow: hidden;
308
+ text-overflow: ellipsis;
309
+ white-space: nowrap;
310
+ }
311
+ .pollar-dist-item-amount {
312
+ font-size: 0.9375rem;
313
+ font-weight: 700;
314
+ color: var(--pollar-text);
315
+ font-variant-numeric: tabular-nums;
316
+ white-space: nowrap;
317
+ }
318
+ .pollar-dist-item-asset {
319
+ font-size: 0.75rem;
320
+ color: var(--pollar-muted);
321
+ font-weight: 600;
322
+ margin-left: 2px;
323
+ }
324
+ .pollar-dist-item-meta {
325
+ font-size: 0.75rem;
326
+ color: var(--pollar-muted);
327
+ display: flex;
328
+ gap: 0.375rem;
329
+ flex-wrap: wrap;
330
+ }
331
+ .pollar-dist-item-action {
332
+ margin-top: 0.375rem;
333
+ display: flex;
334
+ align-items: center;
335
+ justify-content: flex-end;
336
+ }
337
+ .pollar-dist-claim-btn {
338
+ flex: 0 0 auto;
339
+ height: 32px;
340
+ padding: 0 0.875rem;
341
+ font-size: 0.8125rem;
342
+ }
343
+ .pollar-dist-item-status {
344
+ font-size: 0.75rem;
345
+ font-weight: 600;
346
+ padding: 4px 10px;
347
+ border-radius: 999px;
348
+ text-transform: uppercase;
349
+ letter-spacing: 0.04em;
350
+ }
351
+ .pollar-dist-item-status[data-kind=claimed] {
352
+ background: rgba(22, 163, 74, 0.12);
353
+ color: var(--pollar-success-text, #16a34a);
354
+ }
355
+ .pollar-dist-item-status[data-kind=unavailable] {
356
+ background: rgba(107, 114, 128, 0.12);
357
+ color: var(--pollar-muted);
358
+ }
359
+ .pollar-dist-item-error {
360
+ font-size: 0.75rem;
361
+ color: var(--pollar-error-text, #dc2626);
362
+ }
363
+
273
364
  /* src/components/kyc-modal/KycModal.css */
274
365
  .pollar-kyc-badge {
275
366
  display: inline-flex;
@@ -491,8 +582,8 @@
491
582
  padding: 0 1rem;
492
583
  position: relative;
493
584
  text-align: center;
494
- -webkit-transition: transform .15s, box-shadow .15s;
495
- transition: transform .15s, box-shadow .15s;
585
+ -webkit-transition: transform 0.15s, box-shadow 0.15s;
586
+ transition: transform 0.15s, box-shadow 0.15s;
496
587
  vertical-align: middle;
497
588
  white-space: nowrap;
498
589
  width: 100%;
@@ -530,8 +621,8 @@
530
621
  flex-grow: 0;
531
622
  }
532
623
  .gsi-material-button .gsi-material-button-state {
533
- -webkit-transition: opacity .218s;
534
- transition: opacity .218s;
624
+ -webkit-transition: opacity 0.218s;
625
+ transition: opacity 0.218s;
535
626
  bottom: 0;
536
627
  left: 0;
537
628
  opacity: 0;
@@ -663,7 +754,7 @@
663
754
  background-color: var(--pollar-bg);
664
755
  }
665
756
  .pollar-social-list {
666
- margin-bottom: .625rem;
757
+ margin-bottom: 0.625rem;
667
758
  display: flex;
668
759
  flex-direction: column;
669
760
  gap: 0.625rem;
@@ -864,65 +955,6 @@
864
955
  cursor: not-allowed;
865
956
  }
866
957
 
867
- /* src/components/receive-modal/ReceiveModal.css */
868
- .pollar-receive-modal {
869
- max-width: 380px;
870
- }
871
- .pollar-receive-qr {
872
- display: flex;
873
- align-items: center;
874
- justify-content: center;
875
- padding: 1.25rem;
876
- margin-bottom: 1rem;
877
- background: var(--pollar-input-bg);
878
- border: 1px solid var(--pollar-border);
879
- border-radius: var(--pollar-card-border-radius, 10px);
880
- }
881
- .pollar-receive-instructions {
882
- font-size: 0.8125rem;
883
- color: var(--pollar-muted);
884
- text-align: center;
885
- margin: 0 0 1rem;
886
- line-height: 1.5;
887
- }
888
- .pollar-receive-address-row {
889
- display: flex;
890
- align-items: center;
891
- gap: 0.625rem;
892
- background: var(--pollar-input-bg);
893
- border: 1px solid var(--pollar-border);
894
- border-radius: var(--pollar-card-border-radius, 10px);
895
- padding: 0.625rem 0.875rem;
896
- margin-bottom: 1rem;
897
- }
898
- .pollar-receive-address {
899
- flex: 1;
900
- font-size: 0.75rem;
901
- font-family: monospace;
902
- color: var(--pollar-text);
903
- word-break: break-all;
904
- line-height: 1.5;
905
- }
906
- .pollar-receive-copy-btn {
907
- display: inline-flex;
908
- align-items: center;
909
- gap: 0.375rem;
910
- flex-shrink: 0;
911
- padding: 0.375rem 0.75rem;
912
- border-radius: var(--pollar-buttons-border-radius, 6px);
913
- border: 1px solid var(--pollar-border);
914
- background: none;
915
- font-size: 0.75rem;
916
- font-weight: 500;
917
- color: var(--pollar-muted);
918
- cursor: pointer;
919
- transition: color 150ms, background 150ms;
920
- }
921
- .pollar-receive-copy-btn:hover {
922
- color: var(--pollar-text);
923
- background: var(--pollar-border);
924
- }
925
-
926
958
  /* src/components/ramp-widget/RampWidget.css */
927
959
  .pollar-ramp-modal {
928
960
  max-width: 480px;
@@ -1154,6 +1186,65 @@
1154
1186
  margin: 0;
1155
1187
  }
1156
1188
 
1189
+ /* src/components/receive-modal/ReceiveModal.css */
1190
+ .pollar-receive-modal {
1191
+ max-width: 380px;
1192
+ }
1193
+ .pollar-receive-qr {
1194
+ display: flex;
1195
+ align-items: center;
1196
+ justify-content: center;
1197
+ padding: 1.25rem;
1198
+ margin-bottom: 1rem;
1199
+ background: var(--pollar-input-bg);
1200
+ border: 1px solid var(--pollar-border);
1201
+ border-radius: var(--pollar-card-border-radius, 10px);
1202
+ }
1203
+ .pollar-receive-instructions {
1204
+ font-size: 0.8125rem;
1205
+ color: var(--pollar-muted);
1206
+ text-align: center;
1207
+ margin: 0 0 1rem;
1208
+ line-height: 1.5;
1209
+ }
1210
+ .pollar-receive-address-row {
1211
+ display: flex;
1212
+ align-items: center;
1213
+ gap: 0.625rem;
1214
+ background: var(--pollar-input-bg);
1215
+ border: 1px solid var(--pollar-border);
1216
+ border-radius: var(--pollar-card-border-radius, 10px);
1217
+ padding: 0.625rem 0.875rem;
1218
+ margin-bottom: 1rem;
1219
+ }
1220
+ .pollar-receive-address {
1221
+ flex: 1;
1222
+ font-size: 0.75rem;
1223
+ font-family: monospace;
1224
+ color: var(--pollar-text);
1225
+ word-break: break-all;
1226
+ line-height: 1.5;
1227
+ }
1228
+ .pollar-receive-copy-btn {
1229
+ display: inline-flex;
1230
+ align-items: center;
1231
+ gap: 0.375rem;
1232
+ flex-shrink: 0;
1233
+ padding: 0.375rem 0.75rem;
1234
+ border-radius: var(--pollar-buttons-border-radius, 6px);
1235
+ border: 1px solid var(--pollar-border);
1236
+ background: none;
1237
+ font-size: 0.75rem;
1238
+ font-weight: 500;
1239
+ color: var(--pollar-muted);
1240
+ cursor: pointer;
1241
+ transition: color 150ms, background 150ms;
1242
+ }
1243
+ .pollar-receive-copy-btn:hover {
1244
+ color: var(--pollar-text);
1245
+ background: var(--pollar-border);
1246
+ }
1247
+
1157
1248
  /* src/components/transaction-modal/TransactionModal.css */
1158
1249
  .pollar-tx-modal {
1159
1250
  max-width: 420px;