@samsheena/payment-ui 1.0.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 ADDED
@@ -0,0 +1,17 @@
1
+ # glh-payment-ui
2
+
3
+ Frontend-only Payment Account + Subscription UI.
4
+
5
+ - ₹5/month fixed
6
+ - Plans exist but only 6-month plan enabled & default
7
+ - Always shows 100% discount and Net Payable ₹0
8
+ - No backend
9
+
10
+ ## Install
11
+ npm i glh-payment-ui
12
+
13
+ ## Usage
14
+ import { AccountButton } from "glh-payment-ui";
15
+ import "glh-payment-ui/dist/styles.css";
16
+
17
+ Place <AccountButton /> in the center area of your navbar.
@@ -0,0 +1,286 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const PRICE_PER_MONTH = 5;
6
+ const PLAN_LIST = [{
7
+ key: "monthly",
8
+ label: "Monthly",
9
+ months: 1,
10
+ enabled: false
11
+ }, {
12
+ key: "3m",
13
+ label: "3 Months",
14
+ months: 3,
15
+ enabled: false
16
+ }, {
17
+ key: "6m",
18
+ label: "6 Months",
19
+ months: 6,
20
+ enabled: true
21
+ },
22
+ // ONLY enabled + default
23
+ {
24
+ key: "1y",
25
+ label: "Yearly",
26
+ months: 12,
27
+ enabled: false
28
+ }, {
29
+ key: "3y",
30
+ label: "3 Years",
31
+ months: 36,
32
+ enabled: false
33
+ }];
34
+ function PaymentModal({
35
+ open,
36
+ onClose
37
+ }) {
38
+ const defaultPlanKey = "6m";
39
+ const [fullName, setFullName] = React.useState("");
40
+ const [email, setEmail] = React.useState("");
41
+ const [planKey, setPlanKey] = React.useState(defaultPlanKey);
42
+ const [accountCreated, setAccountCreated] = React.useState(false);
43
+ const selectedPlan = React.useMemo(() => {
44
+ return PLAN_LIST.find(p => p.key === planKey) || PLAN_LIST[2];
45
+ }, [planKey]);
46
+ const total = React.useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);
47
+ const discountPercent = 100;
48
+ const discountAmount = total; // 100% discount
49
+ const netPayable = 0; // always zero
50
+
51
+ function handleBackdropClick(e) {
52
+ if (e.target?.classList?.contains("glh-pay-backdrop")) onClose?.();
53
+ }
54
+ function createAccountAndSubscribe() {
55
+ // Frontend-only: store in localStorage so app can show "created" state later
56
+ const payload = {
57
+ createdAt: new Date().toISOString(),
58
+ fullName,
59
+ email,
60
+ plan: selectedPlan,
61
+ pricePerMonth: PRICE_PER_MONTH,
62
+ total,
63
+ discountPercent,
64
+ discountAmount,
65
+ netPayable
66
+ };
67
+ try {
68
+ localStorage.setItem("glh_payment_account", JSON.stringify(payload));
69
+ setAccountCreated(true);
70
+ } catch (err) {
71
+ // ignore; still show UI success
72
+ setAccountCreated(true);
73
+ }
74
+ }
75
+ if (!open) return null;
76
+ return /*#__PURE__*/React.createElement("div", {
77
+ className: "glh-pay-backdrop",
78
+ onMouseDown: handleBackdropClick,
79
+ role: "dialog",
80
+ "aria-modal": "true"
81
+ }, /*#__PURE__*/React.createElement("div", {
82
+ className: "glh-pay-modal",
83
+ onMouseDown: e => e.stopPropagation()
84
+ }, /*#__PURE__*/React.createElement("div", {
85
+ className: "glh-pay-header"
86
+ }, /*#__PURE__*/React.createElement("h3", {
87
+ className: "glh-pay-title"
88
+ }, "Create Payment Account"), /*#__PURE__*/React.createElement("button", {
89
+ className: "glh-pay-close",
90
+ onClick: onClose,
91
+ "aria-label": "Close"
92
+ }, "\u2715")), /*#__PURE__*/React.createElement("div", {
93
+ className: "glh-pay-body"
94
+ }, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
95
+ className: "glh-pay-row"
96
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
97
+ className: "glh-pay-label"
98
+ }, "Full Name"), /*#__PURE__*/React.createElement("input", {
99
+ className: "glh-pay-input",
100
+ value: fullName,
101
+ onChange: e => setFullName(e.target.value),
102
+ placeholder: "Enter your name"
103
+ })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
104
+ className: "glh-pay-label"
105
+ }, "Email"), /*#__PURE__*/React.createElement("input", {
106
+ className: "glh-pay-input",
107
+ value: email,
108
+ onChange: e => setEmail(e.target.value),
109
+ placeholder: "Enter your email"
110
+ }))), /*#__PURE__*/React.createElement("div", {
111
+ className: "glh-pay-label",
112
+ style: {
113
+ marginBottom: 8
114
+ }
115
+ }, "Subscription Plans (\u20B9", PRICE_PER_MONTH, " / month)"), /*#__PURE__*/React.createElement("div", {
116
+ className: "glh-pay-plans"
117
+ }, PLAN_LIST.map(p => {
118
+ const disabled = !p.enabled;
119
+ const selected = p.key === planKey;
120
+ function pickPlan() {
121
+ if (disabled) return;
122
+ setPlanKey(p.key);
123
+ }
124
+ return /*#__PURE__*/React.createElement("div", {
125
+ key: p.key,
126
+ className: ["glh-pay-plan", disabled ? "glh-pay-planDisabled" : "", selected ? "glh-pay-selected" : ""].join(" "),
127
+ onClick: pickPlan,
128
+ role: "button",
129
+ tabIndex: disabled ? -1 : 0,
130
+ onKeyDown: e => {
131
+ if ((e.key === "Enter" || e.key === " ") && !disabled) pickPlan();
132
+ },
133
+ "aria-disabled": disabled,
134
+ "aria-pressed": selected
135
+ }, /*#__PURE__*/React.createElement("div", {
136
+ style: {
137
+ display: "grid",
138
+ gap: 4
139
+ }
140
+ }, /*#__PURE__*/React.createElement("div", {
141
+ style: {
142
+ fontWeight: 900
143
+ }
144
+ }, p.label), /*#__PURE__*/React.createElement("div", {
145
+ style: {
146
+ fontSize: 12,
147
+ color: "rgba(0,0,0,0.65)"
148
+ }
149
+ }, "Duration: ", p.months, " month(s)")), /*#__PURE__*/React.createElement("div", {
150
+ style: {
151
+ display: "flex",
152
+ gap: 8,
153
+ alignItems: "center"
154
+ }
155
+ }, p.enabled ? /*#__PURE__*/React.createElement("span", {
156
+ className: "glh-pay-pill"
157
+ }, "ENABLED") : /*#__PURE__*/React.createElement("span", {
158
+ className: "glh-pay-pill"
159
+ }, "DISABLED"), selected ? /*#__PURE__*/React.createElement("span", {
160
+ className: "glh-pay-pill"
161
+ }, "SELECTED") : null));
162
+ })), /*#__PURE__*/React.createElement("div", {
163
+ className: "glh-pay-summary"
164
+ }, /*#__PURE__*/React.createElement("div", {
165
+ className: "glh-pay-line"
166
+ }, /*#__PURE__*/React.createElement("span", null, "Total (", selectedPlan.months, " \xD7 \u20B9", PRICE_PER_MONTH, ")"), /*#__PURE__*/React.createElement("span", {
167
+ className: "glh-pay-strong"
168
+ }, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
169
+ className: "glh-pay-line"
170
+ }, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
171
+ className: "glh-pay-strong"
172
+ }, discountPercent, "% (-\u20B9", discountAmount, ")")), /*#__PURE__*/React.createElement("div", {
173
+ className: "glh-pay-line"
174
+ }, /*#__PURE__*/React.createElement("span", {
175
+ className: "glh-pay-strong"
176
+ }, "Net Payable"), /*#__PURE__*/React.createElement("span", {
177
+ className: "glh-pay-strong"
178
+ }, "\u20B9", netPayable))), /*#__PURE__*/React.createElement("div", {
179
+ className: "glh-pay-note"
180
+ }, "Note: This package is frontend-only. Payment is always \u20B90 because 100% discount is applied.")) : /*#__PURE__*/React.createElement("div", {
181
+ style: {
182
+ padding: 6
183
+ }
184
+ }, /*#__PURE__*/React.createElement("div", {
185
+ style: {
186
+ fontWeight: 900,
187
+ fontSize: 16,
188
+ marginBottom: 8
189
+ }
190
+ }, "\u2705 Account Created"), /*#__PURE__*/React.createElement("div", {
191
+ style: {
192
+ fontSize: 13,
193
+ color: "rgba(0,0,0,0.7)"
194
+ }
195
+ }, "Your subscription is ready with ", /*#__PURE__*/React.createElement("b", null, "100% discount"), ". Net payable is ", /*#__PURE__*/React.createElement("b", null, "\u20B90"), "."), /*#__PURE__*/React.createElement("div", {
196
+ className: "glh-pay-summary",
197
+ style: {
198
+ marginTop: 14
199
+ }
200
+ }, /*#__PURE__*/React.createElement("div", {
201
+ className: "glh-pay-line"
202
+ }, /*#__PURE__*/React.createElement("span", null, "Selected Plan"), /*#__PURE__*/React.createElement("span", {
203
+ className: "glh-pay-strong"
204
+ }, selectedPlan.label)), /*#__PURE__*/React.createElement("div", {
205
+ className: "glh-pay-line"
206
+ }, /*#__PURE__*/React.createElement("span", null, "Total"), /*#__PURE__*/React.createElement("span", {
207
+ className: "glh-pay-strong"
208
+ }, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
209
+ className: "glh-pay-line"
210
+ }, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
211
+ className: "glh-pay-strong"
212
+ }, "100% (-\u20B9", total, ")")), /*#__PURE__*/React.createElement("div", {
213
+ className: "glh-pay-line"
214
+ }, /*#__PURE__*/React.createElement("span", {
215
+ className: "glh-pay-strong"
216
+ }, "Net Payable"), /*#__PURE__*/React.createElement("span", {
217
+ className: "glh-pay-strong"
218
+ }, "\u20B90"))))), /*#__PURE__*/React.createElement("div", {
219
+ className: "glh-pay-footer"
220
+ }, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
221
+ className: "glh-pay-secondary",
222
+ onClick: onClose
223
+ }, "Cancel"), /*#__PURE__*/React.createElement("button", {
224
+ className: "glh-pay-primary",
225
+ onClick: createAccountAndSubscribe,
226
+ disabled: !fullName || !email,
227
+ title: !fullName || !email ? "Enter name & email" : "Create account",
228
+ style: !fullName || !email ? {
229
+ opacity: 0.6,
230
+ cursor: "not-allowed"
231
+ } : null
232
+ }, "Create Account")) : /*#__PURE__*/React.createElement("button", {
233
+ className: "glh-pay-primary",
234
+ onClick: onClose
235
+ }, "Done"))));
236
+ }
237
+
238
+ /**
239
+ * AccountButton
240
+ * - Place this component in the CENTER area of your navbar.
241
+ * - It renders a button and a modal for account creation + subscription summary.
242
+ */
243
+ function AccountButton({
244
+ buttonText = "Account",
245
+ wrapperClassName = "",
246
+ buttonClassName = "",
247
+ onAccountCreated
248
+ }) {
249
+ const [open, setOpen] = React.useState(false);
250
+ const [hasAccount, setHasAccount] = React.useState(false);
251
+ React.useEffect(() => {
252
+ try {
253
+ const saved = localStorage.getItem("glh_payment_account");
254
+ setHasAccount(!!saved);
255
+ } catch (e) {
256
+ setHasAccount(false);
257
+ }
258
+ }, [open]);
259
+ function handleClose() {
260
+ setOpen(false);
261
+ // refresh state after close
262
+ try {
263
+ const saved = localStorage.getItem("glh_payment_account");
264
+ const ok = !!saved;
265
+ setHasAccount(ok);
266
+ if (ok && typeof onAccountCreated === "function") {
267
+ onAccountCreated(JSON.parse(saved));
268
+ }
269
+ } catch (e) {
270
+ // ignore
271
+ }
272
+ }
273
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
274
+ className: `glh-pay-centerWrap ${wrapperClassName}`
275
+ }, /*#__PURE__*/React.createElement("button", {
276
+ className: `glh-pay-btn ${buttonClassName}`,
277
+ onClick: () => setOpen(true),
278
+ type: "button"
279
+ }, hasAccount ? `${buttonText} ✓` : buttonText)), /*#__PURE__*/React.createElement(PaymentModal, {
280
+ open: open,
281
+ onClose: handleClose
282
+ }));
283
+ }
284
+
285
+ exports.AccountButton = AccountButton;
286
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/components/PaymentModal.jsx","../src/components/AccountButton.jsx"],"sourcesContent":["import React, { useMemo, useState } from \"react\";\r\nimport \"./styles.css\";\r\n\r\nconst PRICE_PER_MONTH = 5;\r\n\r\nconst PLAN_LIST = [\r\n { key: \"monthly\", label: \"Monthly\", months: 1, enabled: false },\r\n { key: \"3m\", label: \"3 Months\", months: 3, enabled: false },\r\n { key: \"6m\", label: \"6 Months\", months: 6, enabled: true }, // ONLY enabled + default\r\n { key: \"1y\", label: \"Yearly\", months: 12, enabled: false },\r\n { key: \"3y\", label: \"3 Years\", months: 36, enabled: false }\r\n];\r\n\r\nexport function PaymentModal({ open, onClose }) {\r\n const defaultPlanKey = \"6m\";\r\n\r\n const [fullName, setFullName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [planKey, setPlanKey] = useState(defaultPlanKey);\r\n const [accountCreated, setAccountCreated] = useState(false);\r\n\r\n const selectedPlan = useMemo(() => {\r\n return PLAN_LIST.find((p) => p.key === planKey) || PLAN_LIST[2];\r\n }, [planKey]);\r\n\r\n const total = useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);\r\n const discountPercent = 100;\r\n const discountAmount = total; // 100% discount\r\n const netPayable = 0; // always zero\r\n\r\n function handleBackdropClick(e) {\r\n if (e.target?.classList?.contains(\"glh-pay-backdrop\")) onClose?.();\r\n }\r\n\r\n function createAccountAndSubscribe() {\r\n // Frontend-only: store in localStorage so app can show \"created\" state later\r\n const payload = {\r\n createdAt: new Date().toISOString(),\r\n fullName,\r\n email,\r\n plan: selectedPlan,\r\n pricePerMonth: PRICE_PER_MONTH,\r\n total,\r\n discountPercent,\r\n discountAmount,\r\n netPayable\r\n };\r\n try {\r\n localStorage.setItem(\"glh_payment_account\", JSON.stringify(payload));\r\n setAccountCreated(true);\r\n } catch (err) {\r\n // ignore; still show UI success\r\n setAccountCreated(true);\r\n }\r\n }\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"glh-pay-backdrop\" onMouseDown={handleBackdropClick} role=\"dialog\" aria-modal=\"true\">\r\n <div className=\"glh-pay-modal\" onMouseDown={(e) => e.stopPropagation()}>\r\n <div className=\"glh-pay-header\">\r\n <h3 className=\"glh-pay-title\">Create Payment Account</h3>\r\n <button className=\"glh-pay-close\" onClick={onClose} aria-label=\"Close\">✕</button>\r\n </div>\r\n\r\n <div className=\"glh-pay-body\">\r\n {!accountCreated ? (\r\n <>\r\n <div className=\"glh-pay-row\">\r\n <div>\r\n <div className=\"glh-pay-label\">Full Name</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={fullName}\r\n onChange={(e) => setFullName(e.target.value)}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <div className=\"glh-pay-label\">Email</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-label\" style={{ marginBottom: 8 }}>\r\n Subscription Plans (₹{PRICE_PER_MONTH} / month)\r\n </div>\r\n\r\n <div className=\"glh-pay-plans\">\r\n {PLAN_LIST.map((p) => {\r\n const disabled = !p.enabled;\r\n const selected = p.key === planKey;\r\n\r\n function pickPlan() {\r\n if (disabled) return;\r\n setPlanKey(p.key);\r\n }\r\n\r\n return (\r\n <div\r\n key={p.key}\r\n className={[\r\n \"glh-pay-plan\",\r\n disabled ? \"glh-pay-planDisabled\" : \"\",\r\n selected ? \"glh-pay-selected\" : \"\"\r\n ].join(\" \")}\r\n onClick={pickPlan}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n onKeyDown={(e) => {\r\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) pickPlan();\r\n }}\r\n aria-disabled={disabled}\r\n aria-pressed={selected}\r\n >\r\n <div style={{ display: \"grid\", gap: 4 }}>\r\n <div style={{ fontWeight: 900 }}>{p.label}</div>\r\n <div style={{ fontSize: 12, color: \"rgba(0,0,0,0.65)\" }}>\r\n Duration: {p.months} month(s)\r\n </div>\r\n </div>\r\n\r\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\r\n {p.enabled ? <span className=\"glh-pay-pill\">ENABLED</span> : <span className=\"glh-pay-pill\">DISABLED</span>}\r\n {selected ? <span className=\"glh-pay-pill\">SELECTED</span> : null}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\">\r\n <div className=\"glh-pay-line\">\r\n <span>Total ({selectedPlan.months} × ₹{PRICE_PER_MONTH})</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">{discountPercent}% (-₹{discountAmount})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹{netPayable}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-note\">\r\n Note: This package is frontend-only. Payment is always ₹0 because 100% discount is applied.\r\n </div>\r\n </>\r\n ) : (\r\n <div style={{ padding: 6 }}>\r\n <div style={{ fontWeight: 900, fontSize: 16, marginBottom: 8 }}>✅ Account Created</div>\r\n <div style={{ fontSize: 13, color: \"rgba(0,0,0,0.7)\" }}>\r\n Your subscription is ready with <b>100% discount</b>. Net payable is <b>₹0</b>.\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\" style={{ marginTop: 14 }}>\r\n <div className=\"glh-pay-line\">\r\n <span>Selected Plan</span>\r\n <span className=\"glh-pay-strong\">{selectedPlan.label}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Total</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">100% (-₹{total})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹0</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"glh-pay-footer\">\r\n {!accountCreated ? (\r\n <>\r\n <button className=\"glh-pay-secondary\" onClick={onClose}>Cancel</button>\r\n <button\r\n className=\"glh-pay-primary\"\r\n onClick={createAccountAndSubscribe}\r\n disabled={!fullName || !email}\r\n title={!fullName || !email ? \"Enter name & email\" : \"Create account\"}\r\n style={!fullName || !email ? { opacity: 0.6, cursor: \"not-allowed\" } : null}\r\n >\r\n Create Account\r\n </button>\r\n </>\r\n ) : (\r\n <button className=\"glh-pay-primary\" onClick={onClose}>Done</button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { PaymentModal } from \"./PaymentModal.jsx\";\r\nimport \"./styles.css\";\r\n\r\n/**\r\n * AccountButton\r\n * - Place this component in the CENTER area of your navbar.\r\n * - It renders a button and a modal for account creation + subscription summary.\r\n */\r\nexport function AccountButton({\r\n buttonText = \"Account\",\r\n wrapperClassName = \"\",\r\n buttonClassName = \"\",\r\n onAccountCreated\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const [hasAccount, setHasAccount] = useState(false);\r\n\r\n useEffect(() => {\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n setHasAccount(!!saved);\r\n } catch (e) {\r\n setHasAccount(false);\r\n }\r\n }, [open]);\r\n\r\n function handleClose() {\r\n setOpen(false);\r\n // refresh state after close\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n const ok = !!saved;\r\n setHasAccount(ok);\r\n if (ok && typeof onAccountCreated === \"function\") {\r\n onAccountCreated(JSON.parse(saved));\r\n }\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`glh-pay-centerWrap ${wrapperClassName}`}>\r\n <button\r\n className={`glh-pay-btn ${buttonClassName}`}\r\n onClick={() => setOpen(true)}\r\n type=\"button\"\r\n >\r\n {hasAccount ? `${buttonText} ✓` : buttonText}\r\n </button>\r\n </div>\r\n\r\n <PaymentModal open={open} onClose={handleClose} />\r\n </>\r\n );\r\n}\r\n"],"names":["PRICE_PER_MONTH","PLAN_LIST","key","label","months","enabled","PaymentModal","open","onClose","defaultPlanKey","fullName","setFullName","useState","email","setEmail","planKey","setPlanKey","accountCreated","setAccountCreated","selectedPlan","useMemo","find","p","total","discountPercent","discountAmount","netPayable","handleBackdropClick","e","target","classList","contains","createAccountAndSubscribe","payload","createdAt","Date","toISOString","plan","pricePerMonth","localStorage","setItem","JSON","stringify","err","React","createElement","className","onMouseDown","role","stopPropagation","onClick","Fragment","value","onChange","placeholder","style","marginBottom","map","disabled","selected","pickPlan","join","tabIndex","onKeyDown","display","gap","fontWeight","fontSize","color","alignItems","padding","marginTop","title","opacity","cursor","AccountButton","buttonText","wrapperClassName","buttonClassName","onAccountCreated","setOpen","hasAccount","setHasAccount","useEffect","saved","getItem","handleClose","ok","parse","type"],"mappings":"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"}
@@ -0,0 +1,284 @@
1
+ import React, { useState, useMemo, useEffect } from 'react';
2
+
3
+ const PRICE_PER_MONTH = 5;
4
+ const PLAN_LIST = [{
5
+ key: "monthly",
6
+ label: "Monthly",
7
+ months: 1,
8
+ enabled: false
9
+ }, {
10
+ key: "3m",
11
+ label: "3 Months",
12
+ months: 3,
13
+ enabled: false
14
+ }, {
15
+ key: "6m",
16
+ label: "6 Months",
17
+ months: 6,
18
+ enabled: true
19
+ },
20
+ // ONLY enabled + default
21
+ {
22
+ key: "1y",
23
+ label: "Yearly",
24
+ months: 12,
25
+ enabled: false
26
+ }, {
27
+ key: "3y",
28
+ label: "3 Years",
29
+ months: 36,
30
+ enabled: false
31
+ }];
32
+ function PaymentModal({
33
+ open,
34
+ onClose
35
+ }) {
36
+ const defaultPlanKey = "6m";
37
+ const [fullName, setFullName] = useState("");
38
+ const [email, setEmail] = useState("");
39
+ const [planKey, setPlanKey] = useState(defaultPlanKey);
40
+ const [accountCreated, setAccountCreated] = useState(false);
41
+ const selectedPlan = useMemo(() => {
42
+ return PLAN_LIST.find(p => p.key === planKey) || PLAN_LIST[2];
43
+ }, [planKey]);
44
+ const total = useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);
45
+ const discountPercent = 100;
46
+ const discountAmount = total; // 100% discount
47
+ const netPayable = 0; // always zero
48
+
49
+ function handleBackdropClick(e) {
50
+ if (e.target?.classList?.contains("glh-pay-backdrop")) onClose?.();
51
+ }
52
+ function createAccountAndSubscribe() {
53
+ // Frontend-only: store in localStorage so app can show "created" state later
54
+ const payload = {
55
+ createdAt: new Date().toISOString(),
56
+ fullName,
57
+ email,
58
+ plan: selectedPlan,
59
+ pricePerMonth: PRICE_PER_MONTH,
60
+ total,
61
+ discountPercent,
62
+ discountAmount,
63
+ netPayable
64
+ };
65
+ try {
66
+ localStorage.setItem("glh_payment_account", JSON.stringify(payload));
67
+ setAccountCreated(true);
68
+ } catch (err) {
69
+ // ignore; still show UI success
70
+ setAccountCreated(true);
71
+ }
72
+ }
73
+ if (!open) return null;
74
+ return /*#__PURE__*/React.createElement("div", {
75
+ className: "glh-pay-backdrop",
76
+ onMouseDown: handleBackdropClick,
77
+ role: "dialog",
78
+ "aria-modal": "true"
79
+ }, /*#__PURE__*/React.createElement("div", {
80
+ className: "glh-pay-modal",
81
+ onMouseDown: e => e.stopPropagation()
82
+ }, /*#__PURE__*/React.createElement("div", {
83
+ className: "glh-pay-header"
84
+ }, /*#__PURE__*/React.createElement("h3", {
85
+ className: "glh-pay-title"
86
+ }, "Create Payment Account"), /*#__PURE__*/React.createElement("button", {
87
+ className: "glh-pay-close",
88
+ onClick: onClose,
89
+ "aria-label": "Close"
90
+ }, "\u2715")), /*#__PURE__*/React.createElement("div", {
91
+ className: "glh-pay-body"
92
+ }, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
93
+ className: "glh-pay-row"
94
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
95
+ className: "glh-pay-label"
96
+ }, "Full Name"), /*#__PURE__*/React.createElement("input", {
97
+ className: "glh-pay-input",
98
+ value: fullName,
99
+ onChange: e => setFullName(e.target.value),
100
+ placeholder: "Enter your name"
101
+ })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
102
+ className: "glh-pay-label"
103
+ }, "Email"), /*#__PURE__*/React.createElement("input", {
104
+ className: "glh-pay-input",
105
+ value: email,
106
+ onChange: e => setEmail(e.target.value),
107
+ placeholder: "Enter your email"
108
+ }))), /*#__PURE__*/React.createElement("div", {
109
+ className: "glh-pay-label",
110
+ style: {
111
+ marginBottom: 8
112
+ }
113
+ }, "Subscription Plans (\u20B9", PRICE_PER_MONTH, " / month)"), /*#__PURE__*/React.createElement("div", {
114
+ className: "glh-pay-plans"
115
+ }, PLAN_LIST.map(p => {
116
+ const disabled = !p.enabled;
117
+ const selected = p.key === planKey;
118
+ function pickPlan() {
119
+ if (disabled) return;
120
+ setPlanKey(p.key);
121
+ }
122
+ return /*#__PURE__*/React.createElement("div", {
123
+ key: p.key,
124
+ className: ["glh-pay-plan", disabled ? "glh-pay-planDisabled" : "", selected ? "glh-pay-selected" : ""].join(" "),
125
+ onClick: pickPlan,
126
+ role: "button",
127
+ tabIndex: disabled ? -1 : 0,
128
+ onKeyDown: e => {
129
+ if ((e.key === "Enter" || e.key === " ") && !disabled) pickPlan();
130
+ },
131
+ "aria-disabled": disabled,
132
+ "aria-pressed": selected
133
+ }, /*#__PURE__*/React.createElement("div", {
134
+ style: {
135
+ display: "grid",
136
+ gap: 4
137
+ }
138
+ }, /*#__PURE__*/React.createElement("div", {
139
+ style: {
140
+ fontWeight: 900
141
+ }
142
+ }, p.label), /*#__PURE__*/React.createElement("div", {
143
+ style: {
144
+ fontSize: 12,
145
+ color: "rgba(0,0,0,0.65)"
146
+ }
147
+ }, "Duration: ", p.months, " month(s)")), /*#__PURE__*/React.createElement("div", {
148
+ style: {
149
+ display: "flex",
150
+ gap: 8,
151
+ alignItems: "center"
152
+ }
153
+ }, p.enabled ? /*#__PURE__*/React.createElement("span", {
154
+ className: "glh-pay-pill"
155
+ }, "ENABLED") : /*#__PURE__*/React.createElement("span", {
156
+ className: "glh-pay-pill"
157
+ }, "DISABLED"), selected ? /*#__PURE__*/React.createElement("span", {
158
+ className: "glh-pay-pill"
159
+ }, "SELECTED") : null));
160
+ })), /*#__PURE__*/React.createElement("div", {
161
+ className: "glh-pay-summary"
162
+ }, /*#__PURE__*/React.createElement("div", {
163
+ className: "glh-pay-line"
164
+ }, /*#__PURE__*/React.createElement("span", null, "Total (", selectedPlan.months, " \xD7 \u20B9", PRICE_PER_MONTH, ")"), /*#__PURE__*/React.createElement("span", {
165
+ className: "glh-pay-strong"
166
+ }, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
167
+ className: "glh-pay-line"
168
+ }, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
169
+ className: "glh-pay-strong"
170
+ }, discountPercent, "% (-\u20B9", discountAmount, ")")), /*#__PURE__*/React.createElement("div", {
171
+ className: "glh-pay-line"
172
+ }, /*#__PURE__*/React.createElement("span", {
173
+ className: "glh-pay-strong"
174
+ }, "Net Payable"), /*#__PURE__*/React.createElement("span", {
175
+ className: "glh-pay-strong"
176
+ }, "\u20B9", netPayable))), /*#__PURE__*/React.createElement("div", {
177
+ className: "glh-pay-note"
178
+ }, "Note: This package is frontend-only. Payment is always \u20B90 because 100% discount is applied.")) : /*#__PURE__*/React.createElement("div", {
179
+ style: {
180
+ padding: 6
181
+ }
182
+ }, /*#__PURE__*/React.createElement("div", {
183
+ style: {
184
+ fontWeight: 900,
185
+ fontSize: 16,
186
+ marginBottom: 8
187
+ }
188
+ }, "\u2705 Account Created"), /*#__PURE__*/React.createElement("div", {
189
+ style: {
190
+ fontSize: 13,
191
+ color: "rgba(0,0,0,0.7)"
192
+ }
193
+ }, "Your subscription is ready with ", /*#__PURE__*/React.createElement("b", null, "100% discount"), ". Net payable is ", /*#__PURE__*/React.createElement("b", null, "\u20B90"), "."), /*#__PURE__*/React.createElement("div", {
194
+ className: "glh-pay-summary",
195
+ style: {
196
+ marginTop: 14
197
+ }
198
+ }, /*#__PURE__*/React.createElement("div", {
199
+ className: "glh-pay-line"
200
+ }, /*#__PURE__*/React.createElement("span", null, "Selected Plan"), /*#__PURE__*/React.createElement("span", {
201
+ className: "glh-pay-strong"
202
+ }, selectedPlan.label)), /*#__PURE__*/React.createElement("div", {
203
+ className: "glh-pay-line"
204
+ }, /*#__PURE__*/React.createElement("span", null, "Total"), /*#__PURE__*/React.createElement("span", {
205
+ className: "glh-pay-strong"
206
+ }, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
207
+ className: "glh-pay-line"
208
+ }, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
209
+ className: "glh-pay-strong"
210
+ }, "100% (-\u20B9", total, ")")), /*#__PURE__*/React.createElement("div", {
211
+ className: "glh-pay-line"
212
+ }, /*#__PURE__*/React.createElement("span", {
213
+ className: "glh-pay-strong"
214
+ }, "Net Payable"), /*#__PURE__*/React.createElement("span", {
215
+ className: "glh-pay-strong"
216
+ }, "\u20B90"))))), /*#__PURE__*/React.createElement("div", {
217
+ className: "glh-pay-footer"
218
+ }, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
219
+ className: "glh-pay-secondary",
220
+ onClick: onClose
221
+ }, "Cancel"), /*#__PURE__*/React.createElement("button", {
222
+ className: "glh-pay-primary",
223
+ onClick: createAccountAndSubscribe,
224
+ disabled: !fullName || !email,
225
+ title: !fullName || !email ? "Enter name & email" : "Create account",
226
+ style: !fullName || !email ? {
227
+ opacity: 0.6,
228
+ cursor: "not-allowed"
229
+ } : null
230
+ }, "Create Account")) : /*#__PURE__*/React.createElement("button", {
231
+ className: "glh-pay-primary",
232
+ onClick: onClose
233
+ }, "Done"))));
234
+ }
235
+
236
+ /**
237
+ * AccountButton
238
+ * - Place this component in the CENTER area of your navbar.
239
+ * - It renders a button and a modal for account creation + subscription summary.
240
+ */
241
+ function AccountButton({
242
+ buttonText = "Account",
243
+ wrapperClassName = "",
244
+ buttonClassName = "",
245
+ onAccountCreated
246
+ }) {
247
+ const [open, setOpen] = useState(false);
248
+ const [hasAccount, setHasAccount] = useState(false);
249
+ useEffect(() => {
250
+ try {
251
+ const saved = localStorage.getItem("glh_payment_account");
252
+ setHasAccount(!!saved);
253
+ } catch (e) {
254
+ setHasAccount(false);
255
+ }
256
+ }, [open]);
257
+ function handleClose() {
258
+ setOpen(false);
259
+ // refresh state after close
260
+ try {
261
+ const saved = localStorage.getItem("glh_payment_account");
262
+ const ok = !!saved;
263
+ setHasAccount(ok);
264
+ if (ok && typeof onAccountCreated === "function") {
265
+ onAccountCreated(JSON.parse(saved));
266
+ }
267
+ } catch (e) {
268
+ // ignore
269
+ }
270
+ }
271
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
272
+ className: `glh-pay-centerWrap ${wrapperClassName}`
273
+ }, /*#__PURE__*/React.createElement("button", {
274
+ className: `glh-pay-btn ${buttonClassName}`,
275
+ onClick: () => setOpen(true),
276
+ type: "button"
277
+ }, hasAccount ? `${buttonText} ✓` : buttonText)), /*#__PURE__*/React.createElement(PaymentModal, {
278
+ open: open,
279
+ onClose: handleClose
280
+ }));
281
+ }
282
+
283
+ export { AccountButton };
284
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/components/PaymentModal.jsx","../src/components/AccountButton.jsx"],"sourcesContent":["import React, { useMemo, useState } from \"react\";\r\nimport \"./styles.css\";\r\n\r\nconst PRICE_PER_MONTH = 5;\r\n\r\nconst PLAN_LIST = [\r\n { key: \"monthly\", label: \"Monthly\", months: 1, enabled: false },\r\n { key: \"3m\", label: \"3 Months\", months: 3, enabled: false },\r\n { key: \"6m\", label: \"6 Months\", months: 6, enabled: true }, // ONLY enabled + default\r\n { key: \"1y\", label: \"Yearly\", months: 12, enabled: false },\r\n { key: \"3y\", label: \"3 Years\", months: 36, enabled: false }\r\n];\r\n\r\nexport function PaymentModal({ open, onClose }) {\r\n const defaultPlanKey = \"6m\";\r\n\r\n const [fullName, setFullName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [planKey, setPlanKey] = useState(defaultPlanKey);\r\n const [accountCreated, setAccountCreated] = useState(false);\r\n\r\n const selectedPlan = useMemo(() => {\r\n return PLAN_LIST.find((p) => p.key === planKey) || PLAN_LIST[2];\r\n }, [planKey]);\r\n\r\n const total = useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);\r\n const discountPercent = 100;\r\n const discountAmount = total; // 100% discount\r\n const netPayable = 0; // always zero\r\n\r\n function handleBackdropClick(e) {\r\n if (e.target?.classList?.contains(\"glh-pay-backdrop\")) onClose?.();\r\n }\r\n\r\n function createAccountAndSubscribe() {\r\n // Frontend-only: store in localStorage so app can show \"created\" state later\r\n const payload = {\r\n createdAt: new Date().toISOString(),\r\n fullName,\r\n email,\r\n plan: selectedPlan,\r\n pricePerMonth: PRICE_PER_MONTH,\r\n total,\r\n discountPercent,\r\n discountAmount,\r\n netPayable\r\n };\r\n try {\r\n localStorage.setItem(\"glh_payment_account\", JSON.stringify(payload));\r\n setAccountCreated(true);\r\n } catch (err) {\r\n // ignore; still show UI success\r\n setAccountCreated(true);\r\n }\r\n }\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"glh-pay-backdrop\" onMouseDown={handleBackdropClick} role=\"dialog\" aria-modal=\"true\">\r\n <div className=\"glh-pay-modal\" onMouseDown={(e) => e.stopPropagation()}>\r\n <div className=\"glh-pay-header\">\r\n <h3 className=\"glh-pay-title\">Create Payment Account</h3>\r\n <button className=\"glh-pay-close\" onClick={onClose} aria-label=\"Close\">✕</button>\r\n </div>\r\n\r\n <div className=\"glh-pay-body\">\r\n {!accountCreated ? (\r\n <>\r\n <div className=\"glh-pay-row\">\r\n <div>\r\n <div className=\"glh-pay-label\">Full Name</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={fullName}\r\n onChange={(e) => setFullName(e.target.value)}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <div className=\"glh-pay-label\">Email</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-label\" style={{ marginBottom: 8 }}>\r\n Subscription Plans (₹{PRICE_PER_MONTH} / month)\r\n </div>\r\n\r\n <div className=\"glh-pay-plans\">\r\n {PLAN_LIST.map((p) => {\r\n const disabled = !p.enabled;\r\n const selected = p.key === planKey;\r\n\r\n function pickPlan() {\r\n if (disabled) return;\r\n setPlanKey(p.key);\r\n }\r\n\r\n return (\r\n <div\r\n key={p.key}\r\n className={[\r\n \"glh-pay-plan\",\r\n disabled ? \"glh-pay-planDisabled\" : \"\",\r\n selected ? \"glh-pay-selected\" : \"\"\r\n ].join(\" \")}\r\n onClick={pickPlan}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n onKeyDown={(e) => {\r\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) pickPlan();\r\n }}\r\n aria-disabled={disabled}\r\n aria-pressed={selected}\r\n >\r\n <div style={{ display: \"grid\", gap: 4 }}>\r\n <div style={{ fontWeight: 900 }}>{p.label}</div>\r\n <div style={{ fontSize: 12, color: \"rgba(0,0,0,0.65)\" }}>\r\n Duration: {p.months} month(s)\r\n </div>\r\n </div>\r\n\r\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\r\n {p.enabled ? <span className=\"glh-pay-pill\">ENABLED</span> : <span className=\"glh-pay-pill\">DISABLED</span>}\r\n {selected ? <span className=\"glh-pay-pill\">SELECTED</span> : null}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\">\r\n <div className=\"glh-pay-line\">\r\n <span>Total ({selectedPlan.months} × ₹{PRICE_PER_MONTH})</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">{discountPercent}% (-₹{discountAmount})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹{netPayable}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-note\">\r\n Note: This package is frontend-only. Payment is always ₹0 because 100% discount is applied.\r\n </div>\r\n </>\r\n ) : (\r\n <div style={{ padding: 6 }}>\r\n <div style={{ fontWeight: 900, fontSize: 16, marginBottom: 8 }}>✅ Account Created</div>\r\n <div style={{ fontSize: 13, color: \"rgba(0,0,0,0.7)\" }}>\r\n Your subscription is ready with <b>100% discount</b>. Net payable is <b>₹0</b>.\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\" style={{ marginTop: 14 }}>\r\n <div className=\"glh-pay-line\">\r\n <span>Selected Plan</span>\r\n <span className=\"glh-pay-strong\">{selectedPlan.label}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Total</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">100% (-₹{total})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹0</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"glh-pay-footer\">\r\n {!accountCreated ? (\r\n <>\r\n <button className=\"glh-pay-secondary\" onClick={onClose}>Cancel</button>\r\n <button\r\n className=\"glh-pay-primary\"\r\n onClick={createAccountAndSubscribe}\r\n disabled={!fullName || !email}\r\n title={!fullName || !email ? \"Enter name & email\" : \"Create account\"}\r\n style={!fullName || !email ? { opacity: 0.6, cursor: \"not-allowed\" } : null}\r\n >\r\n Create Account\r\n </button>\r\n </>\r\n ) : (\r\n <button className=\"glh-pay-primary\" onClick={onClose}>Done</button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { PaymentModal } from \"./PaymentModal.jsx\";\r\nimport \"./styles.css\";\r\n\r\n/**\r\n * AccountButton\r\n * - Place this component in the CENTER area of your navbar.\r\n * - It renders a button and a modal for account creation + subscription summary.\r\n */\r\nexport function AccountButton({\r\n buttonText = \"Account\",\r\n wrapperClassName = \"\",\r\n buttonClassName = \"\",\r\n onAccountCreated\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const [hasAccount, setHasAccount] = useState(false);\r\n\r\n useEffect(() => {\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n setHasAccount(!!saved);\r\n } catch (e) {\r\n setHasAccount(false);\r\n }\r\n }, [open]);\r\n\r\n function handleClose() {\r\n setOpen(false);\r\n // refresh state after close\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n const ok = !!saved;\r\n setHasAccount(ok);\r\n if (ok && typeof onAccountCreated === \"function\") {\r\n onAccountCreated(JSON.parse(saved));\r\n }\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`glh-pay-centerWrap ${wrapperClassName}`}>\r\n <button\r\n className={`glh-pay-btn ${buttonClassName}`}\r\n onClick={() => setOpen(true)}\r\n type=\"button\"\r\n >\r\n {hasAccount ? `${buttonText} ✓` : buttonText}\r\n </button>\r\n </div>\r\n\r\n <PaymentModal open={open} onClose={handleClose} />\r\n </>\r\n );\r\n}\r\n"],"names":["PRICE_PER_MONTH","PLAN_LIST","key","label","months","enabled","PaymentModal","open","onClose","defaultPlanKey","fullName","setFullName","useState","email","setEmail","planKey","setPlanKey","accountCreated","setAccountCreated","selectedPlan","useMemo","find","p","total","discountPercent","discountAmount","netPayable","handleBackdropClick","e","target","classList","contains","createAccountAndSubscribe","payload","createdAt","Date","toISOString","plan","pricePerMonth","localStorage","setItem","JSON","stringify","err","React","createElement","className","onMouseDown","role","stopPropagation","onClick","Fragment","value","onChange","placeholder","style","marginBottom","map","disabled","selected","pickPlan","join","tabIndex","onKeyDown","display","gap","fontWeight","fontSize","color","alignItems","padding","marginTop","title","opacity","cursor","AccountButton","buttonText","wrapperClassName","buttonClassName","onAccountCreated","setOpen","hasAccount","setHasAccount","useEffect","saved","getItem","handleClose","ok","parse","type"],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ .glh-pay-centerWrap {
2
+ width: 100%;
3
+ display: flex;
4
+ justify-content: center;
5
+ align-items: center;
6
+ }
7
+
8
+ .glh-pay-btn {
9
+ -webkit-appearance: none;
10
+ -moz-appearance: none;
11
+ appearance: none;
12
+ border: 1px solid rgba(0,0,0,0.15);
13
+ background: #ffffff;
14
+ color: #111;
15
+ padding: 10px 16px;
16
+ border-radius: 10px;
17
+ font-weight: 600;
18
+ cursor: pointer;
19
+ transition: transform 0.06s ease, box-shadow 0.2s ease, background 0.2s ease;
20
+ box-shadow: 0 6px 18px rgba(0,0,0,0.06);
21
+ }
22
+
23
+ .glh-pay-btn:active {
24
+ transform: scale(0.98);
25
+ }
26
+
27
+ .glh-pay-btn:hover {
28
+ background: #fafafa;
29
+ }
30
+
31
+ .glh-pay-backdrop {
32
+ position: fixed;
33
+ inset: 0;
34
+ background: rgba(0,0,0,0.45);
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ padding: 16px;
39
+ z-index: 9999;
40
+ }
41
+
42
+ .glh-pay-modal {
43
+ width: 100%;
44
+ max-width: 520px;
45
+ background: #fff;
46
+ border-radius: 16px;
47
+ box-shadow: 0 20px 60px rgba(0,0,0,0.25);
48
+ overflow: hidden;
49
+ }
50
+
51
+ .glh-pay-header {
52
+ padding: 16px 18px;
53
+ border-bottom: 1px solid rgba(0,0,0,0.08);
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: space-between;
57
+ gap: 12px;
58
+ }
59
+
60
+ .glh-pay-title {
61
+ margin: 0;
62
+ font-size: 16px;
63
+ font-weight: 800;
64
+ }
65
+
66
+ .glh-pay-close {
67
+ border: none;
68
+ background: transparent;
69
+ cursor: pointer;
70
+ font-size: 18px;
71
+ line-height: 1;
72
+ padding: 6px 10px;
73
+ border-radius: 10px;
74
+ }
75
+
76
+ .glh-pay-close:hover {
77
+ background: rgba(0,0,0,0.06);
78
+ }
79
+
80
+ .glh-pay-body {
81
+ padding: 16px 18px;
82
+ }
83
+
84
+ .glh-pay-row {
85
+ display: grid;
86
+ grid-template-columns: 1fr;
87
+ gap: 10px;
88
+ margin-bottom: 14px;
89
+ }
90
+
91
+ .glh-pay-label {
92
+ font-size: 12px;
93
+ font-weight: 700;
94
+ color: rgba(0,0,0,0.7);
95
+ }
96
+
97
+ .glh-pay-input {
98
+ width: 100%;
99
+ padding: 10px 12px;
100
+ border-radius: 10px;
101
+ border: 1px solid rgba(0,0,0,0.15);
102
+ outline: none;
103
+ }
104
+
105
+ .glh-pay-input:focus {
106
+ border-color: rgba(0,0,0,0.35);
107
+ }
108
+
109
+ .glh-pay-plans {
110
+ display: grid;
111
+ grid-template-columns: 1fr;
112
+ gap: 10px;
113
+ }
114
+
115
+ .glh-pay-plan {
116
+ display: flex;
117
+ justify-content: space-between;
118
+ align-items: center;
119
+ gap: 12px;
120
+ padding: 12px 12px;
121
+ border-radius: 12px;
122
+ border: 1px solid rgba(0,0,0,0.12);
123
+ background: #fff;
124
+ cursor: pointer;
125
+ }
126
+
127
+ .glh-pay-plan:hover {
128
+ background: #fafafa;
129
+ }
130
+
131
+ .glh-pay-planDisabled {
132
+ opacity: 0.45;
133
+ cursor: not-allowed;
134
+ }
135
+
136
+ .glh-pay-pill {
137
+ font-size: 11px;
138
+ font-weight: 800;
139
+ padding: 4px 8px;
140
+ border-radius: 999px;
141
+ background: rgba(0,0,0,0.06);
142
+ }
143
+
144
+ .glh-pay-selected {
145
+ border-color: rgba(0,0,0,0.4);
146
+ box-shadow: 0 10px 22px rgba(0,0,0,0.08);
147
+ }
148
+
149
+ .glh-pay-summary {
150
+ margin-top: 14px;
151
+ padding: 12px;
152
+ border-radius: 12px;
153
+ border: 1px dashed rgba(0,0,0,0.22);
154
+ background: rgba(0,0,0,0.02);
155
+ display: grid;
156
+ gap: 6px;
157
+ }
158
+
159
+ .glh-pay-line {
160
+ display: flex;
161
+ justify-content: space-between;
162
+ gap: 10px;
163
+ font-size: 13px;
164
+ }
165
+
166
+ .glh-pay-strong {
167
+ font-weight: 900;
168
+ }
169
+
170
+ .glh-pay-footer {
171
+ padding: 14px 18px 18px;
172
+ border-top: 1px solid rgba(0,0,0,0.08);
173
+ display: flex;
174
+ gap: 10px;
175
+ justify-content: flex-end;
176
+ }
177
+
178
+ .glh-pay-primary {
179
+ border: none;
180
+ background: #111;
181
+ color: #fff;
182
+ padding: 10px 14px;
183
+ border-radius: 12px;
184
+ font-weight: 800;
185
+ cursor: pointer;
186
+ }
187
+
188
+ .glh-pay-primary:hover {
189
+ opacity: 0.92;
190
+ }
191
+
192
+ .glh-pay-secondary {
193
+ border: 1px solid rgba(0,0,0,0.15);
194
+ background: #fff;
195
+ color: #111;
196
+ padding: 10px 14px;
197
+ border-radius: 12px;
198
+ font-weight: 800;
199
+ cursor: pointer;
200
+ }
201
+
202
+ .glh-pay-note {
203
+ margin-top: 10px;
204
+ font-size: 12px;
205
+ color: rgba(0,0,0,0.65);
206
+ }
207
+
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@samsheena/payment-ui",
3
+ "version": "1.0.0",
4
+ "description": "Frontend-only payment account + subscription UI (₹5/month) with 100% discount",
5
+ "main": "dist/index.cjs.js",
6
+ "module": "dist/index.esm.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "sideEffects": [
12
+ "*.css"
13
+ ],
14
+ "scripts": {
15
+ "clean": "rimraf dist",
16
+ "build": "npm run clean && rollup -c rollup.config.cjs",
17
+ "dev": "rollup -c rollup.config.cjs -w",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+
21
+ "keywords": [
22
+ "react",
23
+ "subscription",
24
+ "payment",
25
+ "modal",
26
+ "navbar",
27
+ "frontend-only"
28
+ ],
29
+ "author": "",
30
+ "license": "MIT",
31
+ "peerDependencies": {
32
+ "react": ">=17",
33
+ "react-dom": ">=17"
34
+ },
35
+ "devDependencies": {
36
+ "@babel/core": "^7.26.0",
37
+ "@babel/preset-react": "^7.26.0",
38
+ "@rollup/plugin-babel": "^6.0.4",
39
+ "@rollup/plugin-commonjs": "^28.0.2",
40
+ "@rollup/plugin-node-resolve": "^16.0.0",
41
+ "autoprefixer": "^10.4.20",
42
+ "postcss": "^8.4.49",
43
+ "rimraf": "^6.0.1",
44
+ "rollup": "^4.28.1",
45
+ "rollup-plugin-peer-deps-external": "^2.2.4",
46
+ "rollup-plugin-postcss": "^4.0.2",
47
+ "react": "^18.3.1",
48
+ "react-dom": "^18.3.1"
49
+ }
50
+ }
51
+