@adminide-stack/yantra-help-browser 12.0.17 → 12.0.19-alpha.1

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.
Files changed (140) hide show
  1. package/lib/components/HelpCenterFooter.d.ts.map +1 -1
  2. package/lib/components/HelpCenterFooter.js +44 -12
  3. package/lib/components/HelpCenterFooter.js.map +1 -1
  4. package/lib/components/HelpCenterHeader.d.ts +5 -1
  5. package/lib/components/HelpCenterHeader.d.ts.map +1 -1
  6. package/lib/components/HelpCenterHeader.js +40 -128
  7. package/lib/components/HelpCenterHeader.js.map +1 -1
  8. package/lib/components/Icons.js +1 -9
  9. package/lib/components/Icons.js.map +1 -1
  10. package/lib/components/PageHero.d.ts +6 -0
  11. package/lib/components/PageHero.d.ts.map +1 -1
  12. package/lib/components/PageHero.js +35 -39
  13. package/lib/components/PageHero.js.map +1 -1
  14. package/lib/components/SearchBar.d.ts +4 -0
  15. package/lib/components/SearchBar.d.ts.map +1 -1
  16. package/lib/components/SearchBar.js +56 -95
  17. package/lib/components/SearchBar.js.map +1 -1
  18. package/lib/components/SidebarSearch.d.ts.map +1 -1
  19. package/lib/components/SidebarSearch.js +6 -6
  20. package/lib/components/SidebarSearch.js.map +1 -1
  21. package/lib/components/navbar/index.d.ts.map +1 -1
  22. package/lib/components/navbar/index.js +38 -7
  23. package/lib/components/navbar/index.js.map +1 -1
  24. package/lib/compute.d.ts +1 -0
  25. package/lib/compute.d.ts.map +1 -1
  26. package/lib/compute.js +9 -0
  27. package/lib/compute.js.map +1 -1
  28. package/lib/config.d.ts +6 -0
  29. package/lib/config.d.ts.map +1 -1
  30. package/lib/config.js +66 -0
  31. package/lib/config.js.map +1 -0
  32. package/lib/pages/About/index.d.ts +1 -1
  33. package/lib/pages/About/index.d.ts.map +1 -1
  34. package/lib/pages/About/index.js +54 -55
  35. package/lib/pages/About/index.js.map +1 -1
  36. package/lib/pages/Blog/index.d.ts.map +1 -1
  37. package/lib/pages/Blog/index.js +26 -17
  38. package/lib/pages/Blog/index.js.map +1 -1
  39. package/lib/pages/BlogPost/index.d.ts.map +1 -1
  40. package/lib/pages/BlogPost/index.js +5 -5
  41. package/lib/pages/BlogPost/index.js.map +1 -1
  42. package/lib/pages/CategoryCollection/index.d.ts.map +1 -1
  43. package/lib/pages/CategoryCollection/index.js +54 -51
  44. package/lib/pages/CategoryCollection/index.js.map +1 -1
  45. package/lib/pages/Contact/index.d.ts.map +1 -1
  46. package/lib/pages/Contact/index.js +96 -14
  47. package/lib/pages/Contact/index.js.map +1 -1
  48. package/lib/pages/Feedback/index.d.ts +3 -0
  49. package/lib/pages/Feedback/index.d.ts.map +1 -0
  50. package/lib/pages/Feedback/index.js +261 -0
  51. package/lib/pages/Feedback/index.js.map +1 -0
  52. package/lib/pages/GetStarted/components/ExampleCard.d.ts.map +1 -1
  53. package/lib/pages/GetStarted/components/GetStartedHero.d.ts.map +1 -1
  54. package/lib/pages/GetStarted/components/TipCard.d.ts.map +1 -1
  55. package/lib/pages/GetStarted/index.d.ts +1 -1
  56. package/lib/pages/GetStarted/index.d.ts.map +1 -1
  57. package/lib/pages/GetStarted/index.js +129 -332
  58. package/lib/pages/GetStarted/index.js.map +1 -1
  59. package/lib/pages/HelpCenter/components/BookStack.d.ts.map +1 -1
  60. package/lib/pages/HelpCenter/components/HelpCategoryCard.d.ts.map +1 -1
  61. package/lib/pages/HelpCenter/components/HelpCategoryCard.js +54 -132
  62. package/lib/pages/HelpCenter/components/HelpCategoryCard.js.map +1 -1
  63. package/lib/pages/HelpCenter/components/PopularArticle.d.ts.map +1 -1
  64. package/lib/pages/HelpCenter/components/PopularArticle.js +21 -26
  65. package/lib/pages/HelpCenter/components/PopularArticle.js.map +1 -1
  66. package/lib/pages/HelpCenter/index.d.ts.map +1 -1
  67. package/lib/pages/HelpCenter/index.js +85 -223
  68. package/lib/pages/HelpCenter/index.js.map +1 -1
  69. package/lib/pages/HelpCenter/mockData.js +1 -19
  70. package/lib/pages/HelpCenter/mockData.js.map +1 -1
  71. package/lib/pages/LandingPage/components/ArticleCard.d.ts.map +1 -1
  72. package/lib/pages/LandingPage/components/ArticleCard.js +22 -28
  73. package/lib/pages/LandingPage/components/ArticleCard.js.map +1 -1
  74. package/lib/pages/LandingPage/components/CategoriesSection.d.ts.map +1 -1
  75. package/lib/pages/LandingPage/components/CategoriesSection.js +11 -15
  76. package/lib/pages/LandingPage/components/CategoriesSection.js.map +1 -1
  77. package/lib/pages/LandingPage/components/CategoryCard.d.ts.map +1 -1
  78. package/lib/pages/LandingPage/components/CategoryCard.js +23 -32
  79. package/lib/pages/LandingPage/components/CategoryCard.js.map +1 -1
  80. package/lib/pages/LandingPage/components/FeaturedSection.d.ts.map +1 -1
  81. package/lib/pages/LandingPage/components/FeaturedSection.js +10 -15
  82. package/lib/pages/LandingPage/components/FeaturedSection.js.map +1 -1
  83. package/lib/pages/LandingPage/components/HeroSection.d.ts +4 -0
  84. package/lib/pages/LandingPage/components/HeroSection.d.ts.map +1 -1
  85. package/lib/pages/LandingPage/components/HeroSection.js +53 -108
  86. package/lib/pages/LandingPage/components/HeroSection.js.map +1 -1
  87. package/lib/pages/LandingPage/components/ResourceCard.d.ts +0 -1
  88. package/lib/pages/LandingPage/components/ResourceCard.d.ts.map +1 -1
  89. package/lib/pages/LandingPage/components/ResourceCard.js +16 -23
  90. package/lib/pages/LandingPage/components/ResourceCard.js.map +1 -1
  91. package/lib/pages/LandingPage/components/ResourcesSection.d.ts +0 -1
  92. package/lib/pages/LandingPage/components/ResourcesSection.d.ts.map +1 -1
  93. package/lib/pages/LandingPage/components/ResourcesSection.js +10 -16
  94. package/lib/pages/LandingPage/components/ResourcesSection.js.map +1 -1
  95. package/lib/pages/LandingPage/index.d.ts.map +1 -1
  96. package/lib/pages/LandingPage/index.js +122 -236
  97. package/lib/pages/LandingPage/index.js.map +1 -1
  98. package/lib/pages/Markdown/MarkdownPageLayout.d.ts.map +1 -1
  99. package/lib/pages/Markdown/MarkdownPageLayout.js +10 -10
  100. package/lib/pages/Markdown/MarkdownPageLayout.js.map +1 -1
  101. package/lib/pages/ReleaseNotes/index.d.ts.map +1 -1
  102. package/lib/pages/ReleaseNotes/index.js +14 -11
  103. package/lib/pages/ReleaseNotes/index.js.map +1 -1
  104. package/lib/pages/StatusPage/index.d.ts.map +1 -1
  105. package/lib/pages/StatusPage/index.js +17 -12
  106. package/lib/pages/StatusPage/index.js.map +1 -1
  107. package/lib/routes.json +11 -0
  108. package/lib/slot-fill/LogoFill.js +1 -1
  109. package/lib/slot-fill/LogoFill.js.map +1 -1
  110. package/lib/templates/content/account-management/account-setup.md +3 -3
  111. package/lib/templates/content/account-management/delete-account.md +3 -3
  112. package/lib/templates/content/connectors/connector-triggers.md +76 -0
  113. package/lib/templates/content/connectors/creating-connector-triggers.md +121 -0
  114. package/lib/templates/content/connectors/managing-connector-triggers.md +125 -0
  115. package/lib/templates/content/connectors/subscribing-to-connector-events.md +162 -0
  116. package/lib/templates/content/content-manifest.json +194 -0
  117. package/lib/templates/content/data-privacy/privacy-policy.md +4 -4
  118. package/lib/templates/content/data-subject-privacy/data-access.md +1 -1
  119. package/lib/templates/content/data-subject-privacy/data-portability.md +1 -1
  120. package/lib/templates/content/data-subject-privacy/privacy-requests.md +3 -3
  121. package/lib/templates/content/getting-started/getting-started-guide.md +2 -2
  122. package/lib/templates/content/product-features/ai-models.md +1 -1
  123. package/lib/templates/content/scope-api/api-overview.md +2 -2
  124. package/lib/templates/content/security-compliance/compliance.md +1 -1
  125. package/lib/templates/content/security-compliance/security-overview.md +2 -2
  126. package/lib/templates/content/student-hub/student-overview.md +1 -1
  127. package/lib/templates/content/subscription-billing/billing-overview.md +2 -2
  128. package/lib/templates/content/subscription-billing/billing-support.md +8 -8
  129. package/lib/templates/content/subscription-billing/enterprise-pricing.md +1 -1
  130. package/lib/templates/content/subscription-billing/invoice-management.md +2 -2
  131. package/lib/templates/content/subscription-billing/promotional-offers.md +3 -3
  132. package/lib/templates/content/subscription-billing/refund-policy.md +2 -2
  133. package/lib/templates/content/subscription-billing/tax-information.md +3 -3
  134. package/lib/templates/content/technical-questions/api-technical.md +1 -1
  135. package/lib/templates/content/troubleshooting/common-issues.md +2 -2
  136. package/lib/utils/sendContactEmail.d.ts +18 -0
  137. package/lib/utils/sendContactEmail.d.ts.map +1 -0
  138. package/lib/utils/sendContactEmail.js +38 -0
  139. package/lib/utils/sendContactEmail.js.map +1 -0
  140. package/package.json +3 -3
@@ -1,8 +1,50 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {PageHero}from'../../components/PageHero.js';import {Card,CardHeader,CardTitle,CardContent}from'@admin-layout/tailwind-ui/shardui/card.js';import {Button}from'@admin-layout/tailwind-ui/shardui/button.js';import {Input}from'@admin-layout/tailwind-ui/shardui/input.js';import {Label}from'@admin-layout/tailwind-ui/shardui/label.js';import {Icons}from'../../components/Icons.js';const ContactPage = () => {
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useMemo,useEffect}from'react';import {PageHero}from'../../components/PageHero.js';import {Card,CardHeader,CardTitle,CardContent}from'@admin-layout/tailwind-ui/shardui/card.js';import {Button}from'@admin-layout/tailwind-ui/shardui/button.js';import {Input}from'@admin-layout/tailwind-ui/shardui/input.js';import {Label}from'@admin-layout/tailwind-ui/shardui/label.js';import {Icons}from'../../components/Icons.js';import {config}from'../../config.js';import {sendContactEmail}from'../../utils/sendContactEmail.js';const SUCCESS_MESSAGE_MS = 4500;
2
+ const ContactPage = () => {
3
+ const [name, setName] = useState('');
4
+ const [email, setEmail] = useState('');
5
+ const [subject, setSubject] = useState('');
6
+ const [message, setMessage] = useState('');
2
7
  const [submitted, setSubmitted] = useState(false);
3
- const handleSubmit = e => {
8
+ const [loading, setLoading] = useState(false);
9
+ const [error, setError] = useState(null);
10
+ const emailJsConfigured = useMemo(() => Boolean(config.SUPPORT_EMAIL?.trim() && config.EMAILJS_PUBLIC_KEY?.trim() && config.EMAILJS_SERVICE_ID?.trim() && config.EMAILJS_TEMPLATE_ID?.trim()), []);
11
+ useEffect(() => {
12
+ if (!submitted) return;
13
+ const id = window.setTimeout(() => {
14
+ setSubmitted(false);
15
+ setName('');
16
+ setEmail('');
17
+ setSubject('');
18
+ setMessage('');
19
+ }, SUCCESS_MESSAGE_MS);
20
+ return () => window.clearTimeout(id);
21
+ }, [submitted]);
22
+ const handleSubmit = async e => {
4
23
  e.preventDefault();
5
- setSubmitted(true);
24
+ setError(null);
25
+ if (!emailJsConfigured) {
26
+ setError('Contact email is not configured. Set SUPPORT_EMAIL, EMAILJS_PUBLIC_KEY, EMAILJS_SERVICE_ID, and EMAILJS_TEMPLATE_ID in your environment.');
27
+ return;
28
+ }
29
+ setLoading(true);
30
+ try {
31
+ await sendContactEmail({
32
+ serviceId: config.EMAILJS_SERVICE_ID,
33
+ templateId: config.EMAILJS_TEMPLATE_ID,
34
+ publicKey: config.EMAILJS_PUBLIC_KEY,
35
+ supportEmail: config.SUPPORT_EMAIL.trim(),
36
+ fromName: name.trim(),
37
+ fromEmail: email.trim(),
38
+ subject: subject.trim(),
39
+ message: message.trim()
40
+ });
41
+ setSubmitted(true);
42
+ } catch (err) {
43
+ const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';
44
+ setError(msg);
45
+ } finally {
46
+ setLoading(false);
47
+ }
6
48
  };
7
49
  return jsxs("div", {
8
50
  className: "min-h-screen bg-background",
@@ -27,25 +69,51 @@ import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {Pa
27
69
  })
28
70
  }), jsx(CardContent, {
29
71
  children: submitted ? jsxs("div", {
30
- className: "flex flex-col items-center gap-4 rounded-xl border border-emerald-500/20 bg-emerald-500/10 py-12",
72
+ className: "flex flex-col items-center gap-4 rounded-themed-lg border border-success/20 bg-success/10 py-12",
31
73
  children: [jsx(Icons.MdCheckCircleIcon, {
32
- className: "h-12 w-12 text-emerald-500"
74
+ className: "h-12 w-12 text-success"
33
75
  }), jsx("p", {
34
- className: "text-center font-medium text-emerald-600",
35
- children: "Thanks! We'll get back to you soon."
76
+ className: "text-center font-medium text-success",
77
+ children: "Thanks. We\u2019ll get back to you soon."
36
78
  })]
37
79
  }) : jsxs("form", {
38
80
  onSubmit: handleSubmit,
39
81
  className: "space-y-4",
40
- children: [jsxs("div", {
82
+ children: [!emailJsConfigured && jsxs("div", {
83
+ className: "rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-sm text-amber-800 dark:text-amber-200",
84
+ children: ["EmailJS is not configured. Add", ' ', jsx("code", {
85
+ className: "rounded bg-amber-500/20 px-1",
86
+ children: "SUPPORT_EMAIL"
87
+ }), ",", ' ', jsx("code", {
88
+ className: "rounded bg-amber-500/20 px-1",
89
+ children: "EMAILJS_PUBLIC_KEY"
90
+ }), ",", ' ', jsx("code", {
91
+ className: "rounded bg-amber-500/20 px-1",
92
+ children: "EMAILJS_SERVICE_ID"
93
+ }), ", and", ' ', jsx("code", {
94
+ className: "rounded bg-amber-500/20 px-1",
95
+ children: "EMAILJS_TEMPLATE_ID"
96
+ }), ' ', "to your app environment. Set the template \"To email\" field to", ' ', jsx("code", {
97
+ className: "rounded bg-amber-500/20 px-1",
98
+ children: `{{support_email}}`
99
+ }), ". Body variables: support_email, from_name, from_email, subject, message."]
100
+ }), error && jsx("div", {
101
+ className: "rounded-lg border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive",
102
+ children: error
103
+ }), jsxs("div", {
41
104
  className: "space-y-2",
42
105
  children: [jsx(Label, {
43
106
  htmlFor: "name",
44
107
  children: "Name"
45
108
  }), jsx(Input, {
46
109
  id: "name",
110
+ name: "name",
111
+ value: name,
112
+ onChange: e => setName(e.target.value),
47
113
  placeholder: "Your name",
48
- required: true
114
+ required: true,
115
+ disabled: loading,
116
+ autoComplete: "name"
49
117
  })]
50
118
  }), jsxs("div", {
51
119
  className: "space-y-2",
@@ -54,9 +122,14 @@ import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {Pa
54
122
  children: "Email"
55
123
  }), jsx(Input, {
56
124
  id: "email",
125
+ name: "email",
57
126
  type: "email",
127
+ value: email,
128
+ onChange: e => setEmail(e.target.value),
58
129
  placeholder: "you@company.com",
59
- required: true
130
+ required: true,
131
+ disabled: loading,
132
+ autoComplete: "email"
60
133
  })]
61
134
  }), jsxs("div", {
62
135
  className: "space-y-2",
@@ -65,8 +138,12 @@ import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {Pa
65
138
  children: "Subject"
66
139
  }), jsx(Input, {
67
140
  id: "subject",
141
+ name: "subject",
142
+ value: subject,
143
+ onChange: e => setSubject(e.target.value),
68
144
  placeholder: "How can we help?",
69
- required: true
145
+ required: true,
146
+ disabled: loading
70
147
  })]
71
148
  }), jsxs("div", {
72
149
  className: "space-y-2",
@@ -75,15 +152,20 @@ import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {Pa
75
152
  children: "Message"
76
153
  }), jsx("textarea", {
77
154
  id: "message",
155
+ name: "message",
78
156
  rows: 4,
79
- className: "flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
157
+ value: message,
158
+ onChange: e => setMessage(e.target.value),
159
+ className: "flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
80
160
  placeholder: "Tell us more...",
81
- required: true
161
+ required: true,
162
+ disabled: loading
82
163
  })]
83
164
  }), jsx(Button, {
84
165
  type: "submit",
85
166
  className: "w-full",
86
- children: "Send Message"
167
+ disabled: loading || !emailJsConfigured,
168
+ children: loading ? 'Sending…' : 'Send Message'
87
169
  })]
88
170
  })
89
171
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/pages/Contact/index.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"qcAQM,MAAA,WAAW,GAAG,MAAK;QACf,CAAA,SAAU,EAAA,YAAc,CAAA,WAAY,CAAA,KAAM,CAAA;AAEhD,EAAA,MAAA,YAAkB,GAAA,CAAA;oBACE,EAAA;gBACJ,CAAA,IAAC,CAAI;AACrB,GAAA;AAEA,EAAA,OAAAA,IACS,CAAA,KAAA,EAAA;AA8Eb,IAAE,SAAA,EAAA,4BAAA;AAEF,IAAA,QAAA,EAAA,CAAeC,YAAY,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/pages/Contact/index.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"2jBAUA,MAAM,kBAAkB,GAAG,IAAI;AAEzB,MAAA,WAAW,GAAG,MAAK;QACf,CAAA,IAAK,EAAA,OAAS,CAAA,WAAY,CAAA,EAAC,CAAE;QAC7B,CAAA,KAAM,EAAA,QAAU,CAAA,WAAY,CAAA,EAAC,CAAE;QAC/B,CAAA,OAAQ,EAAA,UAAY,CAAA,WAAY,CAAA,EAAC,CAAE;QACnC,CAAA,OAAQ,EAAA,UAAY,CAAA,WAAY,CAAA,EAAC,CAAE;QACnC,CAAA,SAAU,EAAA,YAAc,CAAA,WAAY,CAAA,KAAM,CAAA;QAC1C,CAAA,OAAQ,EAAA,UAAY,CAAA,WAAY,CAAA,KAAM,CAAA;QACtC,CAAA,KAAM,EAAA,QAAU,CAAA,WAAY,CAAA,IAAoB,CAAA;AAEtD,EAAA,MAAA,iBAAuB,GAAA,OAAU,CAAA,MACxB,OACM,CAAA,MACG,CAAA,aAAc,EAAA,MAAM,IAAE,MAAA,CAAA,kBAAA,EAAA,IAAA,EAAA,IAAA,MAAA,CAAA,kBAAA,EAAA,IAAA,EAAA,IAAA,MAAA,CAAA,mBAAA,EAAA,IAAA,EAAA,CAAA,EAAA,EAAA,CAAA;AAC5B,EAAA,SAAA,CAAA,MAAO;AACP,IAAA,IAAA,CAAA,SAAO,EAAA;UACD,EAAA,GAAC,wBAAqB;MAK/B,YAAM,CAAA,KAAA,CAAA;AACX,MAAA,OAAK,CAAS,EAAA,CAAA;cAAS,CAAA,EAAA,CAAA;AACvB,MAAA,UAAQ,CAAG,EAAA,CAAA;gBACK,CAAA,EAAA,CAAA;yBACA,CAAA;iBACJ,MAAG,CAAC,YAAC,CAAA,EAAA,CAAA;eACH,CAAA,CAAA;oBACA,GAAC,MAAI,CAAA,IAAA;oBACE,EAAA;YACd,CAAA,IAAA,CAAG;AACd,IAAA,IAAI,CAAS,iBAAG,EAAA;AAEhB,MAAA,mJAAkD,CAAA;;;cAIxB,CAAA,IAAA,CAAA;;YAIlB,gBAAO,CAAA;QACX,SAAC,EAAA,MAAA,CAAA,kBAAA;QAED,UAAU,EAAK,MAAE,CAAA,mBAAA;AACjB,QAAA,SAAK,EAAA,MAAA,CAAA,kBAAA;AACD,QAAA,kCAAuB,CAAA,IAAA,EAAA;gBACnB,EAAS,IAAA,CAAA,IAAE,EAAM;iBACP,EAAA,KAAA,CAAA,IAAQ,EAAA;iBACT,OAAA,CAAA,IAAQ,EAAA;AACjB,QAAA,OAAA,EAAA,OAAA,CAAA;AACA,OAAA,CAAA;AACA,MAAA,YAAA,CAAA,IAAA,CAAA;AACA,KAAA,CAAA,OAAA,GAAA,EAAA;AACA,MAAA,MAAA,GAAA,GAAA,GAAA,YAAiB,KAAM,GAAA,GAAA,CAAA,OAAA,GAAA,yCAAA;AAC1B,MAAA,QAAC,CAAC,GAAA,CAAA;cACS;gBACf,CAAA,KAAA,CAAA;;AACG,GAAA;aACQ,CAAA,KAAA,EAAI;aACf,EAAA,4BAAA;kBAAU,CAAA,QAAA,EAAA;aACG,YAAM;iBACnB,EAAA,oEAAA;AACL,MAAE,IAAA,EAAAA,GAAA,CAAA,KAAA,CAAA,iBAAA,EAAA;AAEF,QAAA,SACI,EAAA;AAyIR,OAAE;AAEF,KAAA,CAAA,EAAAA,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,3 @@
1
+ declare const FeedbackPage: () => import("react/jsx-runtime").JSX.Element;
2
+ export default FeedbackPage;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/Feedback/index.tsx"],"names":[],"mappings":"AAoBA,QAAA,MAAM,YAAY,+CA6PjB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,261 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useMemo,useEffect}from'react';import {Link}from'@remix-run/react';import {PageHero}from'../../components/PageHero.js';import {Card,CardHeader,CardTitle,CardContent}from'@admin-layout/tailwind-ui/shardui/card.js';import {Button}from'@admin-layout/tailwind-ui/shardui/button.js';import {Input}from'@admin-layout/tailwind-ui/shardui/input.js';import {Label}from'@admin-layout/tailwind-ui/shardui/label.js';import {Icons}from'../../components/Icons.js';import {config}from'../../config.js';import {sendContactEmail}from'../../utils/sendContactEmail.js';const SUCCESS_MESSAGE_MS = 4500;
2
+ const FEEDBACK_TYPES = [{
3
+ value: 'feature',
4
+ label: 'Feature request'
5
+ }, {
6
+ value: 'bug',
7
+ label: 'Bug report'
8
+ }, {
9
+ value: 'improvement',
10
+ label: 'Improvement'
11
+ }, {
12
+ value: 'general',
13
+ label: 'General feedback'
14
+ }];
15
+ const FeedbackPage = () => {
16
+ const [name, setName] = useState('');
17
+ const [email, setEmail] = useState('');
18
+ const [feedbackType, setFeedbackType] = useState('feature');
19
+ const [topic, setTopic] = useState('');
20
+ const [message, setMessage] = useState('');
21
+ const [submitted, setSubmitted] = useState(false);
22
+ const [loading, setLoading] = useState(false);
23
+ const [error, setError] = useState(null);
24
+ const emailJsConfigured = useMemo(() => Boolean(config.SUPPORT_EMAIL?.trim() && config.EMAILJS_PUBLIC_KEY?.trim() && config.EMAILJS_SERVICE_ID?.trim() && config.EMAILJS_FEEDBACK_TEMPLATE_ID?.trim()), []);
25
+ useEffect(() => {
26
+ if (!submitted) return;
27
+ const id = window.setTimeout(() => {
28
+ setSubmitted(false);
29
+ setName('');
30
+ setEmail('');
31
+ setFeedbackType('feature');
32
+ setTopic('');
33
+ setMessage('');
34
+ }, SUCCESS_MESSAGE_MS);
35
+ return () => window.clearTimeout(id);
36
+ }, [submitted]);
37
+ const handleSubmit = async e => {
38
+ e.preventDefault();
39
+ setError(null);
40
+ if (!emailJsConfigured) {
41
+ setError('Feedback email is not configured. Set SUPPORT_EMAIL, EMAILJS_PUBLIC_KEY, EMAILJS_SERVICE_ID, and EMAILJS_TEMPLATE_ID (or EMAILJS_FEEDBACK_TEMPLATE_ID) in your environment.');
42
+ return;
43
+ }
44
+ const typeLabel = FEEDBACK_TYPES.find(t => t.value === feedbackType)?.label ?? feedbackType;
45
+ const subjectParts = [`[Feedback] ${typeLabel}`];
46
+ if (topic.trim()) subjectParts.push(topic.trim());
47
+ const subject = subjectParts.join(' — ');
48
+ setLoading(true);
49
+ try {
50
+ await sendContactEmail({
51
+ serviceId: config.EMAILJS_SERVICE_ID,
52
+ templateId: config.EMAILJS_FEEDBACK_TEMPLATE_ID,
53
+ publicKey: config.EMAILJS_PUBLIC_KEY,
54
+ supportEmail: config.SUPPORT_EMAIL.trim(),
55
+ fromName: name.trim(),
56
+ fromEmail: email.trim(),
57
+ subject,
58
+ message: message.trim(),
59
+ feedbackStructured: {
60
+ typeLabel,
61
+ topic
62
+ }
63
+ });
64
+ setSubmitted(true);
65
+ } catch (err) {
66
+ const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';
67
+ setError(msg);
68
+ } finally {
69
+ setLoading(false);
70
+ }
71
+ };
72
+ return jsxs("div", {
73
+ className: "min-h-screen bg-background",
74
+ children: [jsx(PageHero, {
75
+ title: "Share feedback",
76
+ description: "Tell us what works, what doesn\u2019t, and what you\u2019d like to see next. Your input shapes our roadmap.",
77
+ icon: jsx(Icons.Feedback, {
78
+ className: "h-7 w-7"
79
+ })
80
+ }), jsx("section", {
81
+ className: "py-16",
82
+ children: jsx("div", {
83
+ className: "container mx-auto max-w-4xl px-6 lg:px-16",
84
+ children: jsxs("div", {
85
+ className: "grid gap-8 lg:grid-cols-2",
86
+ children: [jsxs(Card, {
87
+ className: "border-border/60",
88
+ children: [jsx(CardHeader, {
89
+ children: jsx(CardTitle, {
90
+ className: "text-foreground",
91
+ children: "Send feedback"
92
+ })
93
+ }), jsx(CardContent, {
94
+ children: submitted ? jsxs("div", {
95
+ className: "flex flex-col items-center gap-4 rounded-xl border border-emerald-500/20 bg-emerald-500/10 py-12",
96
+ children: [jsx(Icons.MdCheckCircleIcon, {
97
+ className: "h-12 w-12 text-emerald-500"
98
+ }), jsx("p", {
99
+ className: "text-center font-medium text-emerald-600",
100
+ children: "Thank you \u2014 we read every submission."
101
+ })]
102
+ }) : jsxs("form", {
103
+ onSubmit: handleSubmit,
104
+ className: "space-y-4",
105
+ children: [!emailJsConfigured && jsxs("div", {
106
+ className: "rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-sm text-amber-800 dark:text-amber-200",
107
+ children: ["EmailJS is not configured. Add", ' ', jsx("code", {
108
+ className: "rounded bg-amber-500/20 px-1",
109
+ children: "SUPPORT_EMAIL"
110
+ }), ",", ' ', jsx("code", {
111
+ className: "rounded bg-amber-500/20 px-1",
112
+ children: "EMAILJS_PUBLIC_KEY"
113
+ }), ",", ' ', jsx("code", {
114
+ className: "rounded bg-amber-500/20 px-1",
115
+ children: "EMAILJS_SERVICE_ID"
116
+ }), ", and", ' ', jsx("code", {
117
+ className: "rounded bg-amber-500/20 px-1",
118
+ children: "EMAILJS_FEEDBACK_TEMPLATE_ID"
119
+ }), ' ', "(or contact's", ' ', jsx("code", {
120
+ className: "rounded bg-amber-500/20 px-1",
121
+ children: "EMAILJS_TEMPLATE_ID"
122
+ }), ") to your app environment. Set template \"To email\" to", ' ', jsx("code", {
123
+ className: "rounded bg-amber-500/20 px-1",
124
+ children: `{{support_email}}`
125
+ }), "."]
126
+ }), error && jsx("div", {
127
+ className: "rounded-lg border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive",
128
+ children: error
129
+ }), jsxs("div", {
130
+ className: "space-y-2",
131
+ children: [jsx(Label, {
132
+ htmlFor: "fb-name",
133
+ children: "Name"
134
+ }), jsx(Input, {
135
+ id: "fb-name",
136
+ name: "name",
137
+ value: name,
138
+ onChange: e => setName(e.target.value),
139
+ placeholder: "Your name",
140
+ required: true,
141
+ disabled: loading,
142
+ autoComplete: "name"
143
+ })]
144
+ }), jsxs("div", {
145
+ className: "space-y-2",
146
+ children: [jsx(Label, {
147
+ htmlFor: "fb-email",
148
+ children: "Email"
149
+ }), jsx(Input, {
150
+ id: "fb-email",
151
+ name: "email",
152
+ type: "email",
153
+ value: email,
154
+ onChange: e => setEmail(e.target.value),
155
+ placeholder: "you@company.com",
156
+ required: true,
157
+ disabled: loading,
158
+ autoComplete: "email"
159
+ })]
160
+ }), jsxs("div", {
161
+ className: "space-y-2",
162
+ children: [jsx(Label, {
163
+ htmlFor: "fb-type",
164
+ children: "Type"
165
+ }), jsx("select", {
166
+ id: "fb-type",
167
+ name: "type",
168
+ value: feedbackType,
169
+ onChange: e => setFeedbackType(e.target.value),
170
+ disabled: loading,
171
+ className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
172
+ children: FEEDBACK_TYPES.map(t => jsx("option", {
173
+ value: t.value,
174
+ children: t.label
175
+ }, t.value))
176
+ })]
177
+ }), jsxs("div", {
178
+ className: "space-y-2",
179
+ children: [jsx(Label, {
180
+ htmlFor: "fb-topic",
181
+ children: "Topic (optional)"
182
+ }), jsx(Input, {
183
+ id: "fb-topic",
184
+ name: "topic",
185
+ value: topic,
186
+ onChange: e => setTopic(e.target.value),
187
+ placeholder: "Short summary, e.g. \u201CFocus mode on mobile\u201D",
188
+ disabled: loading
189
+ })]
190
+ }), jsxs("div", {
191
+ className: "space-y-2",
192
+ children: [jsx(Label, {
193
+ htmlFor: "fb-message",
194
+ children: "Details"
195
+ }), jsx("textarea", {
196
+ id: "fb-message",
197
+ name: "message",
198
+ rows: 5,
199
+ value: message,
200
+ onChange: e => setMessage(e.target.value),
201
+ className: "flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
202
+ placeholder: "What happened? What would help?",
203
+ required: true,
204
+ disabled: loading
205
+ })]
206
+ }), jsx(Button, {
207
+ type: "submit",
208
+ className: "w-full",
209
+ disabled: loading || !emailJsConfigured,
210
+ children: loading ? 'Sending…' : 'Submit feedback'
211
+ })]
212
+ })
213
+ })]
214
+ }), jsxs("div", {
215
+ className: "space-y-6",
216
+ children: [jsxs(Card, {
217
+ className: "border-border/60",
218
+ children: [jsx(CardHeader, {
219
+ children: jsx(CardTitle, {
220
+ className: "text-foreground",
221
+ children: "Why we ask"
222
+ })
223
+ }), jsxs(CardContent, {
224
+ className: "text-muted-foreground",
225
+ children: [jsx("p", {
226
+ className: "mb-3",
227
+ children: "Product, design, and engineering review feedback regularly to prioritize fixes and new capabilities."
228
+ }), jsxs("p", {
229
+ className: "text-sm",
230
+ children: ["For account or billing issues,", ' ', jsx(Link, {
231
+ to: "/contact",
232
+ className: "font-medium text-foreground underline-offset-4 hover:underline",
233
+ children: "contact support"
234
+ }), ' ', "for a faster resolution."]
235
+ })]
236
+ })]
237
+ }), jsxs(Card, {
238
+ className: "border-border/60",
239
+ children: [jsx(CardHeader, {
240
+ children: jsx(CardTitle, {
241
+ className: "text-foreground",
242
+ children: "Tips"
243
+ })
244
+ }), jsx(CardContent, {
245
+ className: "text-muted-foreground",
246
+ children: jsxs("ul", {
247
+ className: "list-inside list-disc space-y-2 text-sm",
248
+ children: [jsx("li", {
249
+ children: "Bug reports: steps to reproduce and what you expected vs. what happened."
250
+ }), jsx("li", {
251
+ children: "Feature ideas: the problem you\u2019re solving and how you\u2019d use it."
252
+ })]
253
+ })
254
+ })]
255
+ })]
256
+ })]
257
+ })
258
+ })
259
+ })]
260
+ });
261
+ };export{FeedbackPage as default};//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/pages/Feedback/index.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExampleCard.d.ts","sourceRoot":"","sources":["../../../../src/pages/GetStarted/components/ExampleCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,gBAAgB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAgBlD,CAAC"}
1
+ {"version":3,"file":"ExampleCard.d.ts","sourceRoot":"","sources":["../../../../src/pages/GetStarted/components/ExampleCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,gBAAgB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAWlD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"GetStartedHero.d.ts","sourceRoot":"","sources":["../../../../src/pages/GetStarted/components/GetStartedHero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,mBAAmB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAgBxD,CAAC"}
1
+ {"version":3,"file":"GetStartedHero.d.ts","sourceRoot":"","sources":["../../../../src/pages/GetStarted/components/GetStartedHero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,mBAAmB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAYxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TipCard.d.ts","sourceRoot":"","sources":["../../../../src/pages/GetStarted/components/TipCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,YAAY;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAiB1C,CAAC"}
1
+ {"version":3,"file":"TipCard.d.ts","sourceRoot":"","sources":["../../../../src/pages/GetStarted/components/TipCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,YAAY;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAY1C,CAAC"}
@@ -1,3 +1,3 @@
1
- declare const GetStartedPage: () => import("react/jsx-runtime").JSX.Element;
1
+ declare function GetStartedPage(): import("react/jsx-runtime").JSX.Element;
2
2
  export default GetStartedPage;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/GetStarted/index.tsx"],"names":[],"mappings":"AAwFA,QAAA,MAAM,cAAc,+CAsSnB,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/GetStarted/index.tsx"],"names":[],"mappings":"AAkEA,iBAAS,cAAc,4CAiItB;AAED,eAAe,cAAc,CAAC"}