@sdkrouter/payments 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/theme.ts","../src/styles/base.ts","../src/styles/form.ts","../src/styles/status.ts","../src/styles/modal.ts","../src/styles/mobile.ts","../src/styles/index.ts","../src/hooks/useInjectStyles.ts","../src/hooks/useMobile.ts","../src/components/PaymentPage/PaymentPage.tsx","../src/components/PaymentWidget/PaymentWidget.tsx"],"names":["useEffect","PaymentContent","useState","jsxs","jsx"],"mappings":";;;;;;;;AAAA,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuBlB,IAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuBjB,IAAM,GAAA,GAAM,WAAA;AACZ,IAAM,OAAA,GAAU,SAAS,GAAG,CAAA,CAAA;AAC5B,IAAM,WAAA,GAAc,uBAAuB,GAAG,CAAA,CAAA;AAC9C,IAAM,QAAA,GAAW,UAAU,GAAG,CAAA,CAAA;AAC9B,IAAM,YAAA,GAAe,wBAAwB,GAAG,CAAA,CAAA;AAChD,IAAM,YAAA,GAAe,+CAA+C,GAAG,CAAA,CAAA;AAEhE,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEnB,GAAG,MAAM,SAAS,CAAA;;AAAA;AAAA;AAAA,EAAA,EAIhB,YAAY,MAAM,QAAQ,CAAA;AAAA;;AAAA;AAAA,EAI5B,OAAO,CAAA;AAAA,EACP,WAAW,MAAM,QAAQ,CAAA;;AAAA;AAAA,EAGzB,QAAQ,CAAA;AAAA,EACR,YAAY,MAAM,SAAS,CAAA;AAAA,CAAA;;;ACpEtB,IAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACAb,IAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACAb,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;A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","file":"index.mjs","sourcesContent":["const lightVars = `\n --sdkr-pay-bg: #ffffff;\n --sdkr-pay-bg-subtle: #f8fafc;\n --sdkr-pay-fg: #1e293b;\n --sdkr-pay-fg-muted: #64748b;\n --sdkr-pay-border: #e2e8f0;\n --sdkr-pay-primary: #3b82f6;\n --sdkr-pay-primary-hover: #2563eb;\n --sdkr-pay-primary-fg: #ffffff;\n --sdkr-pay-error: #ef4444;\n --sdkr-pay-error-bg: #fef2f2;\n --sdkr-pay-success: #22c55e;\n --sdkr-pay-success-bg: #f0fdf4;\n --sdkr-pay-input-bg: #ffffff;\n --sdkr-pay-input-border: #d1d5db;\n --sdkr-pay-input-focus: #3b82f6;\n --sdkr-pay-badge-bg: #eff6ff;\n --sdkr-pay-badge-fg: #1d4ed8;\n --sdkr-pay-card-shadow: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);\n --sdkr-pay-qr-bg: #ffffff;\n --sdkr-pay-qr-fg: #1e293b;\n`;\n\nconst darkVars = `\n --sdkr-pay-bg: #141414;\n --sdkr-pay-bg-subtle: #0a0a0a;\n --sdkr-pay-fg: #fafafa;\n --sdkr-pay-fg-muted: #a1a1aa;\n --sdkr-pay-border: #262626;\n --sdkr-pay-primary: #3b82f6;\n --sdkr-pay-primary-hover: #60a5fa;\n --sdkr-pay-primary-fg: #ffffff;\n --sdkr-pay-error: #f87171;\n --sdkr-pay-error-bg: #1c1917;\n --sdkr-pay-success: #4ade80;\n --sdkr-pay-success-bg: #0a1a0f;\n --sdkr-pay-input-bg: #1a1a1a;\n --sdkr-pay-input-border: #333333;\n --sdkr-pay-input-focus: #3b82f6;\n --sdkr-pay-badge-bg: #1e293b;\n --sdkr-pay-badge-fg: #60a5fa;\n --sdkr-pay-card-shadow: 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.2);\n --sdkr-pay-qr-bg: #1a1a1a;\n --sdkr-pay-qr-fg: #fafafa;\n`;\n\nconst sel = '.sdkr-pay';\nconst darkSel = `.dark ${sel}`;\nconst darkAttrSel = `[data-theme=\"dark\"] ${sel}`;\nconst lightSel = `.light ${sel}`;\nconst lightAttrSel = `[data-theme=\"light\"] ${sel}`;\nconst darkMediaSel = `:root:not([data-theme=\"light\"]):not(.light) ${sel}`;\n\nexport const theme = `\n/* Light (default) */\n${sel} { ${lightVars} }\n\n/* Dark: system (only when no explicit theme) */\n@media (prefers-color-scheme: dark) {\n ${darkMediaSel} { ${darkVars} }\n}\n\n/* Dark: explicit */\n${darkSel},\n${darkAttrSel} { ${darkVars} }\n\n/* Light: explicit (overrides system dark) */\n${lightSel},\n${lightAttrSel} { ${lightVars} }\n`;\n","export const base = `\n/* Base */\n.sdkr-pay {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n color: var(--sdkr-pay-fg);\n background: var(--sdkr-pay-bg);\n line-height: 1.5;\n box-sizing: border-box;\n -webkit-font-smoothing: antialiased;\n}\n\n.sdkr-pay *, .sdkr-pay *::before, .sdkr-pay *::after {\n box-sizing: border-box;\n}\n\n/* Page layout */\n.sdkr-pay-page {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: var(--sdkr-pay-bg-subtle);\n}\n\n.sdkr-pay-card {\n width: 100%;\n max-width: 440px;\n background: var(--sdkr-pay-bg);\n border: 1px solid var(--sdkr-pay-border);\n border-radius: 12px;\n box-shadow: var(--sdkr-pay-card-shadow);\n overflow: hidden;\n}\n\n.sdkr-pay-widget {\n width: 100%;\n max-width: 440px;\n}\n\n.sdkr-pay-content {\n animation: sdkr-pay-fade-in 0.2s ease-out;\n}\n\n.sdkr-pay-separator {\n height: 1px;\n background: var(--sdkr-pay-border);\n margin: 0;\n border: none;\n}\n\n/* Loading */\n.sdkr-pay-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px;\n color: var(--sdkr-pay-fg-muted);\n}\n\n.sdkr-pay-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid var(--sdkr-pay-border);\n border-top-color: var(--sdkr-pay-primary);\n border-radius: 50%;\n animation: sdkr-pay-spin 0.6s linear infinite;\n}\n\n/* Error page */\n.sdkr-pay-error-page {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 48px 24px;\n text-align: center;\n}\n\n.sdkr-pay-error-text {\n font-size: 14px;\n color: var(--sdkr-pay-fg-muted);\n margin: 0;\n}\n\n/* Powered by */\n.sdkr-pay-powered {\n text-align: center;\n padding: 12px;\n font-size: 11px;\n color: var(--sdkr-pay-fg-muted);\n}\n\n.sdkr-pay-powered a {\n color: var(--sdkr-pay-fg-muted);\n text-decoration: none;\n}\n\n.sdkr-pay-powered a:hover {\n text-decoration: underline;\n}\n\n/* Keyframes */\n@keyframes sdkr-pay-spin {\n to { transform: rotate(360deg); }\n}\n\n@keyframes sdkr-pay-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes sdkr-pay-slide-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes sdkr-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n\n@keyframes sdkr-pulse {\n 0%, 100% { opacity: 0.3; transform: scale(0.8); }\n 50% { opacity: 1; transform: scale(1.2); }\n}\n`;\n","export const form = `\n/* Info section */\n.sdkr-pay-info {\n padding: 24px 24px 0;\n}\n\n.sdkr-pay-info-icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n background: var(--sdkr-pay-badge-bg);\n color: var(--sdkr-pay-badge-fg);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 12px;\n}\n\n.sdkr-pay-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0 0 4px;\n color: var(--sdkr-pay-fg);\n letter-spacing: -0.01em;\n}\n\n.sdkr-pay-description {\n font-size: 14px;\n color: var(--sdkr-pay-fg-muted);\n margin: 0 0 16px;\n white-space: pre-wrap;\n line-height: 1.5;\n}\n\n.sdkr-pay-amount-badge {\n display: inline-flex;\n align-items: baseline;\n gap: 6px;\n padding: 8px 14px;\n background: var(--sdkr-pay-badge-bg);\n border-radius: 10px;\n margin-bottom: 16px;\n}\n\n.sdkr-pay-amount-value {\n font-size: 20px;\n font-weight: 700;\n color: var(--sdkr-pay-badge-fg);\n letter-spacing: -0.02em;\n}\n\n.sdkr-pay-amount-currency {\n font-size: 13px;\n font-weight: 500;\n color: var(--sdkr-pay-fg-muted);\n}\n\n/* Form */\n.sdkr-pay-form {\n padding: 20px 24px 24px;\n}\n\n.sdkr-pay-field {\n margin-bottom: 16px;\n}\n\n.sdkr-pay-label {\n display: block;\n font-size: 13px;\n font-weight: 500;\n color: var(--sdkr-pay-fg);\n margin-bottom: 6px;\n}\n\n.sdkr-pay-label-optional {\n color: var(--sdkr-pay-fg-muted);\n font-weight: 400;\n}\n\n.sdkr-pay-input {\n width: 100%;\n padding: 10px 12px;\n font-size: 16px;\n line-height: 1.5;\n color: var(--sdkr-pay-fg);\n background: var(--sdkr-pay-input-bg);\n border: 1px solid var(--sdkr-pay-input-border);\n border-radius: 8px;\n outline: none;\n transition: border-color 0.15s, box-shadow 0.15s;\n -webkit-appearance: none;\n}\n\n.sdkr-pay-input:focus {\n border-color: var(--sdkr-pay-input-focus);\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);\n}\n\n.sdkr-pay-input::placeholder {\n color: var(--sdkr-pay-fg-muted);\n}\n\n.sdkr-pay-input-error {\n border-color: var(--sdkr-pay-error);\n}\n\n.sdkr-pay-input-error:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n}\n\n.sdkr-pay-amount-prefix {\n position: relative;\n}\n\n.sdkr-pay-amount-prefix .sdkr-pay-input {\n padding-left: 28px;\n}\n\n.sdkr-pay-amount-prefix::before {\n content: '$';\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--sdkr-pay-fg-muted);\n font-size: 14px;\n pointer-events: none;\n}\n\n.sdkr-pay-field-error {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--sdkr-pay-error);\n font-size: 12px;\n margin-top: 4px;\n}\n\n.sdkr-pay-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--sdkr-pay-error-bg);\n color: var(--sdkr-pay-error);\n border-radius: 8px;\n font-size: 14px;\n margin-bottom: 16px;\n}\n\n/* Button */\n.sdkr-pay-btn {\n width: 100%;\n padding: 12px 20px;\n font-size: 15px;\n font-weight: 600;\n color: var(--sdkr-pay-primary-fg);\n background: var(--sdkr-pay-primary);\n border: none;\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s, opacity 0.15s, transform 0.1s;\n}\n\n.sdkr-pay-btn:hover:not(:disabled) {\n background: var(--sdkr-pay-primary-hover);\n}\n\n.sdkr-pay-btn:active:not(:disabled) {\n transform: scale(0.98);\n}\n\n.sdkr-pay-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.sdkr-pay-btn-content {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.sdkr-pay-btn-spinner {\n animation: sdkr-pay-spin 0.8s linear infinite;\n}\n\n.sdkr-pay-btn--ghost {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n background: transparent;\n color: var(--sdkr-pay-fg-muted);\n border: none;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n padding: 8px 16px;\n border-radius: 8px;\n transition: color 0.15s, background 0.15s;\n width: auto;\n}\n\n.sdkr-pay-btn--ghost:hover {\n color: var(--sdkr-pay-fg);\n background: var(--sdkr-pay-bg-subtle);\n}\n`;\n","export const status = `\n/* Status */\n.sdkr-pay-status {\n padding: 24px;\n}\n\n.sdkr-pay-status-header {\n text-align: center;\n margin-bottom: 20px;\n}\n\n.sdkr-pay-status-icon {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 12px;\n}\n\n.sdkr-pay-status-icon--waiting {\n background: var(--sdkr-pay-badge-bg);\n color: var(--sdkr-pay-badge-fg);\n}\n\n.sdkr-pay-status-icon--success {\n background: var(--sdkr-pay-success-bg);\n color: var(--sdkr-pay-success);\n}\n\n.sdkr-pay-status-icon--error {\n background: var(--sdkr-pay-error-bg);\n color: var(--sdkr-pay-error);\n}\n\n.sdkr-pay-status-icon--paid {\n background: #22c55e;\n color: white;\n}\n\n.sdkr-pay-status-title {\n font-size: 18px;\n font-weight: 600;\n margin: 0 0 4px;\n letter-spacing: -0.01em;\n}\n\n.sdkr-pay-status-subtitle {\n font-size: 13px;\n color: var(--sdkr-pay-fg-muted);\n margin: 0;\n}\n\n.sdkr-pay-status-actions {\n padding: 8px 24px 16px;\n text-align: center;\n}\n\n/* Hero amount */\n.sdkr-pay-hero-amount {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 16px;\n margin: 0 24px 16px;\n background: var(--sdkr-pay-badge-bg);\n border-radius: 12px;\n}\n\n.sdkr-pay-hero-amount-icon {\n color: var(--sdkr-pay-badge-fg);\n}\n\n.sdkr-pay-hero-amount-value {\n font-size: 24px;\n font-weight: 700;\n letter-spacing: -0.02em;\n font-variant-numeric: tabular-nums;\n color: var(--sdkr-pay-fg);\n}\n\n.sdkr-pay-hero-amount-coin {\n font-size: 14px;\n font-weight: 500;\n color: var(--sdkr-pay-fg-muted);\n}\n\n/* QR */\n.sdkr-pay-qr {\n display: flex;\n justify-content: center;\n padding: 16px;\n}\n\n.sdkr-pay-qr svg {\n border-radius: 12px;\n padding: 12px;\n background: var(--sdkr-pay-qr-bg);\n}\n\n/* Payment details */\n.sdkr-pay-detail {\n padding: 12px 16px;\n background: var(--sdkr-pay-bg-subtle);\n border: 1px solid var(--sdkr-pay-border);\n border-radius: 8px;\n margin-bottom: 12px;\n}\n\n.sdkr-pay-detail-label {\n font-size: 11px;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--sdkr-pay-fg-muted);\n margin-bottom: 4px;\n}\n\n.sdkr-pay-detail-value {\n font-size: 14px;\n font-weight: 500;\n word-break: break-all;\n color: var(--sdkr-pay-fg);\n}\n\n.sdkr-pay-detail-mono {\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'Consolas', monospace;\n font-size: 13px;\n}\n\n.sdkr-pay-detail-copyable {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sdkr-pay-detail-copyable span {\n flex: 1;\n min-width: 0;\n word-break: break-all;\n}\n\n.sdkr-pay-copy-btn {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border: 1px solid var(--sdkr-pay-border);\n border-radius: 8px;\n background: var(--sdkr-pay-bg);\n color: var(--sdkr-pay-fg-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s;\n}\n\n.sdkr-pay-copy-btn:hover {\n background: var(--sdkr-pay-primary);\n color: white;\n border-color: var(--sdkr-pay-primary);\n}\n\n.sdkr-pay-copy-btn:active {\n transform: scale(0.92);\n}\n\n.sdkr-pay-network-badge {\n display: inline-block;\n font-size: 11px;\n font-weight: 500;\n padding: 1px 6px;\n border-radius: 4px;\n background: var(--sdkr-pay-bg-subtle);\n color: var(--sdkr-pay-fg-muted);\n margin-left: 4px;\n}\n\n/* Countdown */\n.sdkr-pay-countdown {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n margin: 8px 0;\n border-radius: 8px;\n background: var(--sdkr-pay-bg-subtle);\n}\n\n.sdkr-pay-countdown-icon {\n color: var(--sdkr-pay-fg-muted);\n}\n\n.sdkr-pay-countdown-value {\n font-size: 20px;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n color: var(--sdkr-pay-fg);\n}\n\n.sdkr-pay-countdown--urgent .sdkr-pay-countdown-value {\n color: var(--sdkr-pay-error);\n animation: sdkr-blink 1s ease-in-out infinite;\n}\n\n/* Confirmations */\n.sdkr-pay-confirmations {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-size: 13px;\n color: var(--sdkr-pay-primary);\n padding: 8px;\n font-variant-numeric: tabular-nums;\n}\n\n.sdkr-pay-confirmations-icon {\n animation: sdkr-pay-spin 1.5s linear infinite;\n}\n\n/* Polling */\n.sdkr-pay-polling {\n text-align: center;\n font-size: 13px;\n color: var(--sdkr-pay-primary);\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n}\n\n.sdkr-pay-polling-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--sdkr-pay-primary);\n animation: sdkr-pulse 1.5s ease-in-out infinite;\n}\n\n/* Warning */\n.sdkr-pay-warning {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-size: 12px;\n color: var(--sdkr-pay-fg-muted);\n padding: 8px 16px;\n margin: 8px 0;\n border-radius: 8px;\n background: var(--sdkr-pay-bg-subtle);\n}\n\n/* History */\n.sdkr-pay-history {\n padding: 24px;\n}\n\n.sdkr-pay-history-title {\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--sdkr-pay-fg-muted);\n margin: 0 0 12px;\n}\n\n.sdkr-pay-history-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid var(--sdkr-pay-border);\n}\n\n.sdkr-pay-history-item:last-child {\n border-bottom: none;\n}\n\n.sdkr-pay-history-amount {\n font-size: 14px;\n font-weight: 600;\n color: var(--sdkr-pay-fg);\n}\n\n.sdkr-pay-history-status {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n font-size: 12px;\n font-weight: 500;\n border-radius: 6px;\n}\n\n.sdkr-pay-history-status--completed {\n background: var(--sdkr-pay-success-bg);\n color: var(--sdkr-pay-success);\n}\n\n.sdkr-pay-history-status--pending {\n background: var(--sdkr-pay-badge-bg);\n color: var(--sdkr-pay-badge-fg);\n}\n\n.sdkr-pay-history-status--failed {\n background: var(--sdkr-pay-error-bg);\n color: var(--sdkr-pay-error);\n}\n\n.sdkr-pay-history-date {\n font-size: 13px;\n color: var(--sdkr-pay-fg-muted);\n}\n`;\n","export const modal = `\n/* Modal overlay */\n.sdkr-pay-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n padding: 24px;\n animation: sdkr-pay-fade-in 0.15s ease-out;\n}\n\n.sdkr-pay-overlay .sdkr-pay-card {\n animation: sdkr-pay-slide-up 0.2s ease-out;\n}\n\n/* Modal close */\n.sdkr-pay-close {\n position: absolute;\n top: 12px;\n right: 12px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n color: var(--sdkr-pay-fg-muted);\n cursor: pointer;\n border-radius: 6px;\n font-size: 18px;\n line-height: 1;\n transition: background 0.15s;\n}\n\n.sdkr-pay-close:hover {\n background: var(--sdkr-pay-bg-subtle);\n}\n`;\n","export const mobile = `\n/* ── Mobile ──────────────────────────────────────────────────────────────── */\n\n.sdkr-pay--mobile .sdkr-pay-page {\n padding: 0;\n align-items: stretch;\n min-height: 100dvh;\n}\n\n.sdkr-pay--mobile .sdkr-pay-card {\n max-width: none;\n border: none;\n border-radius: 0;\n box-shadow: none;\n min-height: 100dvh;\n display: flex;\n flex-direction: column;\n}\n\n.sdkr-pay--mobile .sdkr-pay-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.sdkr-pay--mobile .sdkr-pay-status {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.sdkr-pay--mobile .sdkr-pay-status-actions {\n margin-top: auto;\n padding-bottom: env(safe-area-inset-bottom, 16px);\n}\n\n.sdkr-pay--mobile .sdkr-pay-form {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.sdkr-pay--mobile .sdkr-pay-form .sdkr-pay-btn {\n margin-top: auto;\n}\n\n.sdkr-pay--mobile .sdkr-pay-powered {\n padding-bottom: env(safe-area-inset-bottom, 12px);\n}\n\n.sdkr-pay--mobile .sdkr-pay-qr svg {\n width: 180px;\n height: 180px;\n}\n\n.sdkr-pay--mobile .sdkr-pay-detail-value {\n font-size: 13px;\n}\n\n.sdkr-pay--mobile .sdkr-pay-input {\n font-size: 16px;\n}\n\n/* CSS-only fallback for no-JS mobile */\n@media (max-width: 767px) {\n .sdkr-pay-page {\n padding: 0;\n align-items: stretch;\n }\n .sdkr-pay-card {\n max-width: none;\n border: none;\n border-radius: 0;\n box-shadow: none;\n min-height: 100dvh;\n }\n}\n`;\n","import { theme } from './theme';\nimport { base } from './base';\nimport { form } from './form';\nimport { status } from './status';\nimport { modal } from './modal';\nimport { mobile } from './mobile';\n\nexport const styles = [theme, base, form, status, modal, mobile].join('\\n');\n\nexport { theme } from './theme';\nexport { base } from './base';\nexport { form } from './form';\nexport { status } from './status';\nexport { modal } from './modal';\nexport { mobile } from './mobile';\n","'use client';\n\nimport { useEffect } from 'react';\nimport { styles } from '../styles';\nimport { STYLE_ID } from '../config';\n\nlet refCount = 0;\n\nexport function useInjectStyles() {\n useEffect(() => {\n refCount++;\n\n if (!document.getElementById(STYLE_ID)) {\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = styles;\n document.head.appendChild(style);\n }\n\n return () => {\n refCount--;\n if (refCount === 0) {\n document.getElementById(STYLE_ID)?.remove();\n }\n };\n }, []);\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useMobile(): boolean {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n return isMobile;\n}\n","'use client';\n\nimport { lazy, Suspense } from 'react';\nimport { useInjectStyles } from '../../hooks/useInjectStyles';\nimport { useMobile } from '../../hooks/useMobile';\nimport { PaymentProvider } from '../../context';\nimport type { PaymentLinkConfig } from '../../types';\n\nconst PaymentContent = lazy(() =>\n import('../PaymentContent').then((m) => ({ default: m.PaymentContent })),\n);\n\nfunction PaymentLoader() {\n return (\n <div className=\"sdkr-pay-loading\" style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: 48, gap: 12 }}>\n <span className=\"sdkr-pay-spinner\" />\n </div>\n );\n}\n\nexport function PaymentPage(props: PaymentLinkConfig) {\n useInjectStyles();\n const isMobile = useMobile();\n\n const rootClass = isMobile ? 'sdkr-pay sdkr-pay--mobile' : 'sdkr-pay';\n\n return (\n <PaymentProvider {...props}>\n <div className={rootClass}>\n <div className=\"sdkr-pay-page\">\n <div className=\"sdkr-pay-card\">\n <Suspense fallback={<PaymentLoader />}>\n <PaymentContent />\n </Suspense>\n <div className=\"sdkr-pay-powered\">\n Powered by <a href=\"https://sdkrouter.com\" target=\"_blank\" rel=\"noopener noreferrer\">SDKRouter</a>\n </div>\n </div>\n </div>\n </div>\n </PaymentProvider>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { useInjectStyles } from '../../hooks/useInjectStyles';\nimport { PaymentProvider } from '../../context';\nimport { PaymentContent } from '../PaymentContent';\nimport type { PaymentLinkConfig } from '../../types';\n\ninterface PaymentWidgetProps extends PaymentLinkConfig {\n mode?: 'inline' | 'button';\n buttonText?: string;\n}\n\nexport function PaymentWidget(props: PaymentWidgetProps) {\n const { mode = 'inline', buttonText = 'Pay Now', ...config } = props;\n useInjectStyles();\n\n const [isOpen, setIsOpen] = useState(false);\n\n const card = (\n <div className=\"sdkr-pay-card\" style={{ position: 'relative' }}>\n {mode === 'button' && (\n <button className=\"sdkr-pay-close\" onClick={() => setIsOpen(false)}>&times;</button>\n )}\n <PaymentContent />\n </div>\n );\n\n return (\n <PaymentProvider {...config}>\n <div className=\"sdkr-pay\">\n {mode === 'button' ? (\n <>\n <button className=\"sdkr-pay-btn\" onClick={() => setIsOpen(true)}>{buttonText}</button>\n {isOpen && (\n <div className=\"sdkr-pay-overlay\" onClick={(e) => { if (e.target === e.currentTarget) setIsOpen(false); }}>\n {card}\n </div>\n )}\n </>\n ) : (\n <div className=\"sdkr-pay-widget\">{card}</div>\n )}\n </div>\n </PaymentProvider>\n );\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@sdkrouter/payments",
3
+ "version": "0.1.2",
4
+ "description": "Embeddable React payment widget for SDKRouter payment links — crypto payments via NOWPayments",
5
+ "keywords": [
6
+ "payments",
7
+ "crypto",
8
+ "widget",
9
+ "react",
10
+ "nowpayments",
11
+ "payment-link"
12
+ ],
13
+ "author": {
14
+ "name": "CMDOP",
15
+ "url": "https://sdkrouter.com"
16
+ },
17
+ "homepage": "https://sdkrouter.com",
18
+ "license": "MIT",
19
+ "type": "module",
20
+ "main": "./dist/index.cjs",
21
+ "module": "./dist/index.mjs",
22
+ "types": "./dist/index.d.ts",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.mjs",
27
+ "require": "./dist/index.cjs"
28
+ },
29
+ "./api": {
30
+ "types": "./dist/_api/index.d.ts",
31
+ "import": "./dist/_api/index.mjs",
32
+ "require": "./dist/_api/index.cjs"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "clean": "rm -rf dist",
42
+ "dev": "vite --config example/vite.config.ts",
43
+ "check": "tsc --noEmit"
44
+ },
45
+ "dependencies": {
46
+ "consola": "^3.4.2",
47
+ "lucide-react": "^0.545.0",
48
+ "moment": "^2.30.1",
49
+ "p-retry": "^7.1.1",
50
+ "react-qr-code": "^2.0.18",
51
+ "zod": "^4.3.4"
52
+ },
53
+ "peerDependencies": {
54
+ "@djangocfg/ui-core": ">=2.0.0",
55
+ "react": "^18.0.0 || ^19.0.0",
56
+ "react-dom": "^18.0.0 || ^19.0.0"
57
+ },
58
+ "devDependencies": {
59
+ "@types/react": "^19.2.9",
60
+ "@types/react-dom": "^19.2.3",
61
+ "@vitejs/plugin-react": "^4.3.0",
62
+ "react": "^19.0.0",
63
+ "react-dom": "^19.0.0",
64
+ "tsup": "^8.5.0",
65
+ "typescript": "^5.9.3",
66
+ "vite": "^6.3.0"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public"
70
+ }
71
+ }