@provex/react 1.2.3

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.
@@ -0,0 +1,325 @@
1
+ /**
2
+ * @provex/react — Default Stylesheet
3
+ *
4
+ * All selectors use [data-provex-*] attributes for zero-specificity-conflict
5
+ * styling. Override any CSS custom property to theme the component.
6
+ *
7
+ * Usage:
8
+ * import '@provex/react/styles'
9
+ *
10
+ * Or copy this file and customize.
11
+ */
12
+
13
+ /* ─── CSS Custom Properties ─────────────────────────────────────────────── */
14
+
15
+ [data-provex-root] {
16
+ /* Colors — Light mode */
17
+ --provex-color-bg: #ffffff;
18
+ --provex-color-surface: #f8f9fa;
19
+ --provex-color-border: #e2e8f0;
20
+ --provex-color-text: #1a202c;
21
+ --provex-color-text-secondary: #718096;
22
+ --provex-color-primary: #3b82f6;
23
+ --provex-color-primary-hover: #2563eb;
24
+ --provex-color-primary-disabled: #93c5fd;
25
+ --provex-color-success: #10b981;
26
+ --provex-color-error: #ef4444;
27
+ --provex-color-warning: #f59e0b;
28
+
29
+ /* Spacing */
30
+ --provex-space-xs: 0.25rem;
31
+ --provex-space-sm: 0.5rem;
32
+ --provex-space-md: 1rem;
33
+ --provex-space-lg: 1.5rem;
34
+ --provex-space-xl: 2rem;
35
+
36
+ /* Typography */
37
+ --provex-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
38
+ --provex-font-size-sm: 0.875rem;
39
+ --provex-font-size-md: 1rem;
40
+ --provex-font-size-lg: 1.25rem;
41
+ --provex-font-size-xl: 1.5rem;
42
+ --provex-font-weight-normal: 400;
43
+ --provex-font-weight-medium: 500;
44
+ --provex-font-weight-bold: 600;
45
+
46
+ /* Layout */
47
+ --provex-border-radius: 0.5rem;
48
+ --provex-border-radius-sm: 0.375rem;
49
+ --provex-max-width: 420px;
50
+
51
+ /* Base styles */
52
+ font-family: var(--provex-font-family);
53
+ font-size: var(--provex-font-size-md);
54
+ color: var(--provex-color-text);
55
+ background: var(--provex-color-bg);
56
+ max-width: var(--provex-max-width);
57
+ padding: var(--provex-space-lg);
58
+ border: 1px solid var(--provex-color-border);
59
+ border-radius: var(--provex-border-radius);
60
+ box-sizing: border-box;
61
+ }
62
+
63
+ /* ─── Dark Mode ─────────────────────────────────────────────────────────── */
64
+
65
+ @media (prefers-color-scheme: dark) {
66
+ [data-provex-root] {
67
+ --provex-color-bg: #1a1a2e;
68
+ --provex-color-surface: #16213e;
69
+ --provex-color-border: #2d3748;
70
+ --provex-color-text: #e2e8f0;
71
+ --provex-color-text-secondary: #a0aec0;
72
+ --provex-color-primary: #60a5fa;
73
+ --provex-color-primary-hover: #3b82f6;
74
+ --provex-color-primary-disabled: #1e40af;
75
+ --provex-color-success: #34d399;
76
+ --provex-color-error: #f87171;
77
+ --provex-color-warning: #fbbf24;
78
+ }
79
+ }
80
+
81
+ /* ─── Phase Sections ────────────────────────────────────────────────────── */
82
+
83
+ [data-provex-section] {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: var(--provex-space-md);
87
+ }
88
+
89
+ /* ─── Fields ────────────────────────────────────────────────────────────── */
90
+
91
+ [data-provex-field] {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: var(--provex-space-xs);
95
+ }
96
+
97
+ [data-provex-label] {
98
+ font-size: var(--provex-font-size-sm);
99
+ font-weight: var(--provex-font-weight-medium);
100
+ color: var(--provex-color-text-secondary);
101
+ }
102
+
103
+ /* ─── Select ────────────────────────────────────────────────────────────── */
104
+
105
+ [data-provex-select] {
106
+ appearance: none;
107
+ background: var(--provex-color-surface);
108
+ border: 1px solid var(--provex-color-border);
109
+ border-radius: var(--provex-border-radius-sm);
110
+ padding: var(--provex-space-sm) var(--provex-space-md);
111
+ font-size: var(--provex-font-size-md);
112
+ font-family: var(--provex-font-family);
113
+ color: var(--provex-color-text);
114
+ cursor: pointer;
115
+ width: 100%;
116
+ box-sizing: border-box;
117
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23718096' d='M3 4.5L6 8l3-3.5H3z'/%3E%3C/svg%3E");
118
+ background-repeat: no-repeat;
119
+ background-position: right var(--provex-space-sm) center;
120
+ padding-right: var(--provex-space-xl);
121
+ }
122
+
123
+ [data-provex-select]:focus {
124
+ outline: 2px solid var(--provex-color-primary);
125
+ outline-offset: -1px;
126
+ border-color: var(--provex-color-primary);
127
+ }
128
+
129
+ /* ─── Input Group ───────────────────────────────────────────────────────── */
130
+
131
+ [data-provex-input-group] {
132
+ display: flex;
133
+ align-items: center;
134
+ background: var(--provex-color-surface);
135
+ border: 1px solid var(--provex-color-border);
136
+ border-radius: var(--provex-border-radius-sm);
137
+ overflow: hidden;
138
+ }
139
+
140
+ [data-provex-input-group]:focus-within {
141
+ outline: 2px solid var(--provex-color-primary);
142
+ outline-offset: -1px;
143
+ border-color: var(--provex-color-primary);
144
+ }
145
+
146
+ [data-provex-input-prefix] {
147
+ padding: var(--provex-space-sm) var(--provex-space-sm);
148
+ color: var(--provex-color-text-secondary);
149
+ font-size: var(--provex-font-size-md);
150
+ user-select: none;
151
+ }
152
+
153
+ [data-provex-input] {
154
+ flex: 1;
155
+ background: transparent;
156
+ border: none;
157
+ padding: var(--provex-space-sm) var(--provex-space-sm);
158
+ font-size: var(--provex-font-size-lg);
159
+ font-family: var(--provex-font-family);
160
+ color: var(--provex-color-text);
161
+ outline: none;
162
+ min-width: 0;
163
+ }
164
+
165
+ [data-provex-input]::placeholder {
166
+ color: var(--provex-color-text-secondary);
167
+ opacity: 0.6;
168
+ }
169
+
170
+ /* ─── Info Rows ─────────────────────────────────────────────────────────── */
171
+
172
+ [data-provex-info] {
173
+ display: flex;
174
+ justify-content: space-between;
175
+ align-items: center;
176
+ padding: var(--provex-space-xs) 0;
177
+ }
178
+
179
+ [data-provex-info] > [data-provex-label] {
180
+ font-size: var(--provex-font-size-sm);
181
+ }
182
+
183
+ [data-provex-info] > [data-provex-value] {
184
+ font-size: var(--provex-font-size-sm);
185
+ font-weight: var(--provex-font-weight-medium);
186
+ color: var(--provex-color-text);
187
+ }
188
+
189
+ /* ─── Detail Rows (order summary) ───────────────────────────────────────── */
190
+
191
+ [data-provex-detail] {
192
+ display: flex;
193
+ justify-content: space-between;
194
+ align-items: center;
195
+ padding: var(--provex-space-xs) 0;
196
+ border-bottom: 1px solid var(--provex-color-border);
197
+ }
198
+
199
+ [data-provex-detail]:last-of-type {
200
+ border-bottom: none;
201
+ }
202
+
203
+ [data-provex-detail] > [data-provex-label] {
204
+ font-size: var(--provex-font-size-sm);
205
+ }
206
+
207
+ [data-provex-detail] > [data-provex-value] {
208
+ font-size: var(--provex-font-size-sm);
209
+ font-weight: var(--provex-font-weight-medium);
210
+ font-variant-numeric: tabular-nums;
211
+ }
212
+
213
+ /* ─── Headings ──────────────────────────────────────────────────────────── */
214
+
215
+ [data-provex-heading] {
216
+ font-size: var(--provex-font-size-xl);
217
+ font-weight: var(--provex-font-weight-bold);
218
+ margin: 0;
219
+ }
220
+
221
+ /* ─── Status / Messages ─────────────────────────────────────────────────── */
222
+
223
+ [data-provex-message="validation"] {
224
+ font-size: var(--provex-font-size-sm);
225
+ color: var(--provex-color-text-secondary);
226
+ margin: 0;
227
+ }
228
+
229
+ [data-provex-message="error"] {
230
+ font-size: var(--provex-font-size-sm);
231
+ color: var(--provex-color-error);
232
+ margin: 0;
233
+ }
234
+
235
+ [data-provex-message="status"] {
236
+ font-size: var(--provex-font-size-sm);
237
+ color: var(--provex-color-primary);
238
+ margin: 0;
239
+ }
240
+
241
+ [data-provex-status] {
242
+ font-size: var(--provex-font-size-sm);
243
+ color: var(--provex-color-text-secondary);
244
+ }
245
+
246
+ [data-provex-status="loading"],
247
+ [data-provex-status="proving"] {
248
+ color: var(--provex-color-primary);
249
+ }
250
+
251
+ /* ─── Text ──────────────────────────────────────────────────────────────── */
252
+
253
+ [data-provex-text] {
254
+ font-size: var(--provex-font-size-sm);
255
+ color: var(--provex-color-text-secondary);
256
+ line-height: 1.5;
257
+ margin: 0;
258
+ }
259
+
260
+ /* ─── Buttons ───────────────────────────────────────────────────────────── */
261
+
262
+ [data-provex-button] {
263
+ display: block;
264
+ width: 100%;
265
+ padding: var(--provex-space-sm) var(--provex-space-md);
266
+ font-size: var(--provex-font-size-md);
267
+ font-weight: var(--provex-font-weight-bold);
268
+ font-family: var(--provex-font-family);
269
+ color: #ffffff;
270
+ background: var(--provex-color-primary);
271
+ border: none;
272
+ border-radius: var(--provex-border-radius-sm);
273
+ cursor: pointer;
274
+ transition: background-color 0.15s ease;
275
+ line-height: 1.5;
276
+ }
277
+
278
+ [data-provex-button]:hover:not(:disabled) {
279
+ background: var(--provex-color-primary-hover);
280
+ }
281
+
282
+ [data-provex-button]:disabled {
283
+ background: var(--provex-color-primary-disabled);
284
+ cursor: not-allowed;
285
+ opacity: 0.7;
286
+ }
287
+
288
+ [data-provex-button]:focus-visible {
289
+ outline: 2px solid var(--provex-color-primary);
290
+ outline-offset: 2px;
291
+ }
292
+
293
+ /* ─── Match Count ───────────────────────────────────────────────────────── */
294
+
295
+ [data-provex-info="match-count"] [data-provex-value] {
296
+ color: var(--provex-color-success);
297
+ font-size: var(--provex-font-size-sm);
298
+ }
299
+
300
+ /* ─── Order Summary ─────────────────────────────────────────────────────── */
301
+
302
+ [data-provex-info="order-summary"] {
303
+ display: flex;
304
+ flex-direction: column;
305
+ gap: var(--provex-space-xs);
306
+ background: var(--provex-color-surface);
307
+ padding: var(--provex-space-md);
308
+ border-radius: var(--provex-border-radius-sm);
309
+ }
310
+
311
+ /* ─── Instructions ──────────────────────────────────────────────────────── */
312
+
313
+ [data-provex-info="instructions"] {
314
+ display: block;
315
+ padding: var(--provex-space-sm) var(--provex-space-md);
316
+ background: var(--provex-color-surface);
317
+ border-radius: var(--provex-border-radius-sm);
318
+ border-left: 3px solid var(--provex-color-primary);
319
+ }
320
+
321
+ /* ─── Complete Phase ────────────────────────────────────────────────────── */
322
+
323
+ [data-provex-phase="complete"] [data-provex-heading] {
324
+ color: var(--provex-color-success);
325
+ }
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@provex/react",
3
+ "version": "1.2.3",
4
+ "description": "Portable React buy-flow component and hooks for the Provex protocol",
5
+ "type": "module",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/provex-tech/monorepo.git",
9
+ "directory": "packages/react"
10
+ },
11
+ "main": "src/index.ts",
12
+ "types": "src/index.ts",
13
+ "exports": {
14
+ ".": "./src/index.ts",
15
+ "./styles": "./dist/styles/default.css"
16
+ },
17
+ "publishConfig": {
18
+ "access": "restricted",
19
+ "main": "dist/index.cjs",
20
+ "module": "dist/index.js",
21
+ "types": "dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js",
26
+ "require": "./dist/index.cjs"
27
+ },
28
+ "./styles": "./dist/styles/default.css"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsup",
37
+ "dev": "tsup --watch",
38
+ "lint": "tsc --noEmit",
39
+ "test": "vitest run",
40
+ "test:coverage": "vitest run --coverage"
41
+ },
42
+ "dependencies": {
43
+ "@ponder/client": "^0.16.0",
44
+ "@provex/abis": "workspace:*",
45
+ "@provex/utils": "workspace:*"
46
+ },
47
+ "peerDependencies": {
48
+ "@tanstack/react-query": "^5.0.0",
49
+ "react": "^18.0.0",
50
+ "viem": "^2.0.0",
51
+ "wagmi": "^2.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@testing-library/dom": "^10.0.0",
55
+ "@testing-library/react": "^16.0.0",
56
+ "@types/react": "^18.3.3",
57
+ "jsdom": "^25.0.0",
58
+ "react-dom": "^18.0.0",
59
+ "tsup": "^8.0.0",
60
+ "typescript": "^5.9.2",
61
+ "vitest": "^3.0.0"
62
+ }
63
+ }
package/src/index.ts ADDED
@@ -0,0 +1,115 @@
1
+ // ─── Types ──────────────────────────────────────────────────────────────────
2
+ export type {
3
+ ProvexConfig,
4
+ BuyProps,
5
+ WalletAdapter,
6
+ BuyPhase,
7
+ ProvexTheme,
8
+ UseProvexBuyOptions,
9
+ UseProvexBuyReturn,
10
+ PhaseComponentProps,
11
+ PhaseRenderProps,
12
+ } from './types'
13
+
14
+ // ─── Provider + hook ────────────────────────────────────────────────────────
15
+ export { ProvexProvider, useProvex } from './ProvexProvider'
16
+ export type { ProvexContextValue, ProvexProviderProps } from './ProvexProvider'
17
+
18
+ // ─── Layer 1: useProvexBuy hook ─────────────────────────────────────────────
19
+ export { useProvexBuy } from './useProvexBuy'
20
+
21
+ // ─── Layer 2: Context provider + phase sub-components ───────────────────────
22
+ export { ProvexBuyProvider, useProvexBuyContext } from './ProvexBuyContext'
23
+ export type { ProvexBuyProviderProps } from './ProvexBuyContext'
24
+
25
+ export {
26
+ BrowsePhase,
27
+ CommittedPhase,
28
+ ProvingPhase,
29
+ CompletePhase,
30
+ } from './phases'
31
+
32
+ export type {
33
+ BrowsePhaseState,
34
+ CommittedPhaseState,
35
+ ProvingPhaseState,
36
+ CompletePhaseState,
37
+ } from './phases'
38
+
39
+ // ─── Layer 3: Ready-made widget ─────────────────────────────────────────────
40
+ export { ProvexBuy } from './ProvexBuy'
41
+ export { ProvexBuyWagmi } from './ProvexBuyWagmi'
42
+ export type { ProvexBuyWagmiProps } from './ProvexBuyWagmi'
43
+
44
+ // ─── ProveXClient (framework-agnostic core) ────────────────────────────────
45
+ export { ProveXClient, createProveXClient } from './client'
46
+ export {
47
+ ProveXError,
48
+ type ProveXClientConfig,
49
+ type ProveXErrorCode,
50
+ type PreparedTransaction,
51
+ type TransactionResult,
52
+ type WritableMethod,
53
+ type SignalIntentParams,
54
+ type SignalIntentResult,
55
+ type SignalIntentRawParams,
56
+ type CreateDepositParams,
57
+ type CreateDepositRawParams,
58
+ type DepositPaymentMethod,
59
+ type MakerRegistrationParams,
60
+ type PayeeDetails,
61
+ type AttestationParams,
62
+ type AttestationResponse,
63
+ } from './client'
64
+
65
+ // ─── Client factories (for advanced use outside React) ──────────────────────
66
+ export { createApiClient } from './lib/api'
67
+ export type { ApiClient } from './lib/api'
68
+
69
+ // ─── Protocol hooks ─────────────────────────────────────────────────────────
70
+ export {
71
+ useReputationLimits,
72
+ useProtocolFees,
73
+ useProtocolFeePercentage,
74
+ useReputation,
75
+ getTierDisplayInfo,
76
+ useDeposits,
77
+ getRate,
78
+ usePayeeDetails,
79
+ intentStatuses,
80
+ useSignalIntent,
81
+ useNullifierRegistry,
82
+ useAllowance,
83
+ useCancelIntent,
84
+ useReleaseFundsToPayer,
85
+ useV3Escrow,
86
+ useTransactionWithIndexer,
87
+ useProveXClient,
88
+ useWagmiWallet,
89
+ } from './hooks'
90
+
91
+ export type {
92
+ ReputationLimitsParams,
93
+ ReputationLimits,
94
+ ProtocolFeesResult,
95
+ UseProtocolFeesParams,
96
+ DepositInfo,
97
+ IntentStatus,
98
+ PayeeInfo,
99
+ SignalIntentStatus,
100
+ CancelIntentStatus,
101
+ ReleaseFundsStatus,
102
+ V3EscrowStatus,
103
+ V3EscrowCreateDepositParams,
104
+ TransactionPhase,
105
+ UseTransactionWithIndexerOptions,
106
+ TransactionSyncOptions,
107
+ MutationSyncOptions,
108
+ IndexerAdapter,
109
+ IndexedDeposit,
110
+ IndexedVerifier,
111
+ IndexedIntent,
112
+ ReputationData,
113
+ PaginationOptions,
114
+ PaginatedResult,
115
+ } from './hooks'