@burdenoff/website-sdk 2026.817.1 → 2026.817.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.
- package/dist/index.d.mts +31 -1
- package/dist/index.d.ts +31 -1
- package/dist/index.js +287 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +285 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -69,6 +69,36 @@ interface CareersApplyFormProps {
|
|
|
69
69
|
}
|
|
70
70
|
declare function CareersApplyForm({ productName, recaptchaSiteKey, positions, postings, heroTitle, heroDescription, headingLevel, maxResumeBytes, className, seo, }: CareersApplyFormProps): react_jsx_runtime.JSX.Element;
|
|
71
71
|
|
|
72
|
+
interface CareersSubmissionFormProps {
|
|
73
|
+
/** Product name (falls back to product context / SDK config). */
|
|
74
|
+
productName?: string;
|
|
75
|
+
/** reCAPTCHA site key (falls back to SDK config). */
|
|
76
|
+
recaptchaSiteKey?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Job postings for the dropdown (e.g. from `usePublicJobPostings`). When
|
|
79
|
+
* non-empty the selected posting's ID is sent as `jobPostingId` and its
|
|
80
|
+
* title as `position`. When empty, a free-text "position" input is shown
|
|
81
|
+
* instead so the form works before a postings list exists.
|
|
82
|
+
*/
|
|
83
|
+
postings?: readonly CareersPostingOption[];
|
|
84
|
+
heroTitle?: string;
|
|
85
|
+
heroDescription?: string;
|
|
86
|
+
/**
|
|
87
|
+
* `1` (default) renders a full page hero `<h1>`; `2` renders a compact
|
|
88
|
+
* `<h2>` section header for embedding under a page that owns the `<h1>`.
|
|
89
|
+
*/
|
|
90
|
+
headingLevel?: 1 | 2;
|
|
91
|
+
className?: string;
|
|
92
|
+
seo?: {
|
|
93
|
+
title?: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
keywords?: string;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** True when `value` parses as an absolute http(s) URL. */
|
|
99
|
+
declare function isValidUrl(value: string): boolean;
|
|
100
|
+
declare function CareersSubmissionForm({ productName, recaptchaSiteKey, postings, heroTitle, heroDescription, headingLevel, className, seo, }: CareersSubmissionFormProps): react_jsx_runtime.JSX.Element;
|
|
101
|
+
|
|
72
102
|
declare const buttonVariants: (props?: ({
|
|
73
103
|
variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
|
|
74
104
|
size?: "icon" | "default" | "sm" | "lg" | null | undefined;
|
|
@@ -95,4 +125,4 @@ declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLP
|
|
|
95
125
|
*/
|
|
96
126
|
declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
|
|
97
127
|
|
|
98
|
-
export { Button, type ButtonProps, CareersApplyForm, type CareersApplyFormProps, type CareersPostingOption, ECOSYSTEM_PRODUCTS, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants };
|
|
128
|
+
export { Button, type ButtonProps, CareersApplyForm, type CareersApplyFormProps, type CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, ECOSYSTEM_PRODUCTS, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants, isValidUrl };
|
package/dist/index.d.ts
CHANGED
|
@@ -69,6 +69,36 @@ interface CareersApplyFormProps {
|
|
|
69
69
|
}
|
|
70
70
|
declare function CareersApplyForm({ productName, recaptchaSiteKey, positions, postings, heroTitle, heroDescription, headingLevel, maxResumeBytes, className, seo, }: CareersApplyFormProps): react_jsx_runtime.JSX.Element;
|
|
71
71
|
|
|
72
|
+
interface CareersSubmissionFormProps {
|
|
73
|
+
/** Product name (falls back to product context / SDK config). */
|
|
74
|
+
productName?: string;
|
|
75
|
+
/** reCAPTCHA site key (falls back to SDK config). */
|
|
76
|
+
recaptchaSiteKey?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Job postings for the dropdown (e.g. from `usePublicJobPostings`). When
|
|
79
|
+
* non-empty the selected posting's ID is sent as `jobPostingId` and its
|
|
80
|
+
* title as `position`. When empty, a free-text "position" input is shown
|
|
81
|
+
* instead so the form works before a postings list exists.
|
|
82
|
+
*/
|
|
83
|
+
postings?: readonly CareersPostingOption[];
|
|
84
|
+
heroTitle?: string;
|
|
85
|
+
heroDescription?: string;
|
|
86
|
+
/**
|
|
87
|
+
* `1` (default) renders a full page hero `<h1>`; `2` renders a compact
|
|
88
|
+
* `<h2>` section header for embedding under a page that owns the `<h1>`.
|
|
89
|
+
*/
|
|
90
|
+
headingLevel?: 1 | 2;
|
|
91
|
+
className?: string;
|
|
92
|
+
seo?: {
|
|
93
|
+
title?: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
keywords?: string;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** True when `value` parses as an absolute http(s) URL. */
|
|
99
|
+
declare function isValidUrl(value: string): boolean;
|
|
100
|
+
declare function CareersSubmissionForm({ productName, recaptchaSiteKey, postings, heroTitle, heroDescription, headingLevel, className, seo, }: CareersSubmissionFormProps): react_jsx_runtime.JSX.Element;
|
|
101
|
+
|
|
72
102
|
declare const buttonVariants: (props?: ({
|
|
73
103
|
variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
|
|
74
104
|
size?: "icon" | "default" | "sm" | "lg" | null | undefined;
|
|
@@ -95,4 +125,4 @@ declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLP
|
|
|
95
125
|
*/
|
|
96
126
|
declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
|
|
97
127
|
|
|
98
|
-
export { Button, type ButtonProps, CareersApplyForm, type CareersApplyFormProps, type CareersPostingOption, ECOSYSTEM_PRODUCTS, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants };
|
|
128
|
+
export { Button, type ButtonProps, CareersApplyForm, type CareersApplyFormProps, type CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, ECOSYSTEM_PRODUCTS, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants, isValidUrl };
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var lucideReact = require('lucide-react');
|
|
6
|
-
var
|
|
6
|
+
var ReCAPTCHA4 = require('react-google-recaptcha');
|
|
7
7
|
var sonner = require('sonner');
|
|
8
8
|
var reactHelmetAsync = require('react-helmet-async');
|
|
9
9
|
var reactSlot = require('@radix-ui/react-slot');
|
|
@@ -41,7 +41,7 @@ function _interopNamespace(e) {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
44
|
-
var
|
|
44
|
+
var ReCAPTCHA4__default = /*#__PURE__*/_interopDefault(ReCAPTCHA4);
|
|
45
45
|
var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
|
|
46
46
|
var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
|
|
47
47
|
var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
|
|
@@ -1011,7 +1011,7 @@ function ContactPage({
|
|
|
1011
1011
|
] }),
|
|
1012
1012
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
1013
1013
|
effectiveRecaptchaSiteKey && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center sm:justify-start", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1014
|
-
|
|
1014
|
+
ReCAPTCHA4__default.default,
|
|
1015
1015
|
{
|
|
1016
1016
|
ref: recaptchaRef,
|
|
1017
1017
|
sitekey: effectiveRecaptchaSiteKey
|
|
@@ -1977,7 +1977,7 @@ function CareersApplyForm({
|
|
|
1977
1977
|
)
|
|
1978
1978
|
] }),
|
|
1979
1979
|
effectiveRecaptchaSiteKey && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1980
|
-
|
|
1980
|
+
ReCAPTCHA4__default.default,
|
|
1981
1981
|
{
|
|
1982
1982
|
ref: recaptchaRef,
|
|
1983
1983
|
sitekey: effectiveRecaptchaSiteKey
|
|
@@ -2002,6 +2002,284 @@ function CareersApplyForm({
|
|
|
2002
2002
|
)
|
|
2003
2003
|
] });
|
|
2004
2004
|
}
|
|
2005
|
+
var SUBMIT_ASSIGNMENT_RESPONSE_MUTATION = (
|
|
2006
|
+
/* GraphQL */
|
|
2007
|
+
`
|
|
2008
|
+
mutation SubmitAssignmentResponse($input: SubmitAssignmentResponseInput!) {
|
|
2009
|
+
submitAssignmentResponse(input: $input) {
|
|
2010
|
+
success
|
|
2011
|
+
message
|
|
2012
|
+
applicationId
|
|
2013
|
+
roundId
|
|
2014
|
+
}
|
|
2015
|
+
}
|
|
2016
|
+
`
|
|
2017
|
+
);
|
|
2018
|
+
function isValidUrl(value) {
|
|
2019
|
+
try {
|
|
2020
|
+
const url = new URL(value);
|
|
2021
|
+
return url.protocol === "http:" || url.protocol === "https:";
|
|
2022
|
+
} catch {
|
|
2023
|
+
return false;
|
|
2024
|
+
}
|
|
2025
|
+
}
|
|
2026
|
+
async function submitAssignmentResponse(client, data) {
|
|
2027
|
+
try {
|
|
2028
|
+
const result = await client.mutate(SUBMIT_ASSIGNMENT_RESPONSE_MUTATION, {
|
|
2029
|
+
input: {
|
|
2030
|
+
email: data.email.trim().toLowerCase(),
|
|
2031
|
+
repoUrl: data.repoUrl.trim(),
|
|
2032
|
+
videoUrl: data.videoUrl.trim(),
|
|
2033
|
+
recaptchaToken: data.recaptchaToken ?? "",
|
|
2034
|
+
...data.name ? { name: data.name } : {},
|
|
2035
|
+
...data.position ? { position: data.position } : {},
|
|
2036
|
+
...data.jobPostingId ? { jobPostingId: data.jobPostingId } : {},
|
|
2037
|
+
...data.notes ? { notes: data.notes } : {}
|
|
2038
|
+
}
|
|
2039
|
+
});
|
|
2040
|
+
if (result.errors?.length) {
|
|
2041
|
+
return {
|
|
2042
|
+
success: false,
|
|
2043
|
+
message: result.errors[0]?.message ?? "Failed to submit assignment"
|
|
2044
|
+
};
|
|
2045
|
+
}
|
|
2046
|
+
const response = result.data?.submitAssignmentResponse;
|
|
2047
|
+
return response?.success ? { success: true, message: response.message || "Assignment submitted!" } : {
|
|
2048
|
+
success: false,
|
|
2049
|
+
message: response?.message || "Failed to submit assignment"
|
|
2050
|
+
};
|
|
2051
|
+
} catch (error) {
|
|
2052
|
+
console.error("Assignment submission error:", error);
|
|
2053
|
+
return { success: false, message: "Network error. Please try again." };
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
var NO_APPLICATION_HINT = "Please use the same email address you applied with \u2014 or submit an application first.";
|
|
2057
|
+
function isNoApplicationError(message) {
|
|
2058
|
+
return /no application|not found/i.test(message);
|
|
2059
|
+
}
|
|
2060
|
+
function CareersSubmissionForm({
|
|
2061
|
+
productName,
|
|
2062
|
+
recaptchaSiteKey,
|
|
2063
|
+
postings = [],
|
|
2064
|
+
heroTitle = "Submit your assignment",
|
|
2065
|
+
heroDescription = "Share your GitHub repo and a short video walkthrough \u2014 make sure to use the same email you applied with.",
|
|
2066
|
+
headingLevel = 1,
|
|
2067
|
+
className,
|
|
2068
|
+
seo
|
|
2069
|
+
}) {
|
|
2070
|
+
const client = useWebSDK();
|
|
2071
|
+
const config = useWebSDKConfig();
|
|
2072
|
+
const { product } = useProduct();
|
|
2073
|
+
const displayName = productName ?? product?.name ?? config.productId;
|
|
2074
|
+
const effectiveRecaptchaSiteKey = recaptchaSiteKey ?? product?.recaptchaSiteKey ?? config.recaptchaSiteKey ?? "";
|
|
2075
|
+
const recaptchaRef = React.useRef(null);
|
|
2076
|
+
const [isSubmitting, setIsSubmitting] = React.useState(false);
|
|
2077
|
+
const [submittedMessage, setSubmittedMessage] = React.useState(null);
|
|
2078
|
+
const [formError, setFormError] = React.useState(null);
|
|
2079
|
+
const handleSubmit = async (e) => {
|
|
2080
|
+
e.preventDefault();
|
|
2081
|
+
setFormError(null);
|
|
2082
|
+
const recaptchaToken = recaptchaRef.current?.getValue() ?? "";
|
|
2083
|
+
if (effectiveRecaptchaSiteKey && !recaptchaToken) {
|
|
2084
|
+
sonner.toast.error("Please complete the reCAPTCHA verification");
|
|
2085
|
+
return;
|
|
2086
|
+
}
|
|
2087
|
+
const form = e.currentTarget;
|
|
2088
|
+
const formData = new FormData(form);
|
|
2089
|
+
const name = (formData.get("name") ?? "").trim();
|
|
2090
|
+
const email = (formData.get("email") ?? "").trim();
|
|
2091
|
+
const positionValue = (formData.get("position") ?? "").trim();
|
|
2092
|
+
const repoUrl = (formData.get("repoUrl") ?? "").trim();
|
|
2093
|
+
const videoUrl = (formData.get("videoUrl") ?? "").trim();
|
|
2094
|
+
const notes = (formData.get("notes") ?? "").trim();
|
|
2095
|
+
const selectedPosting = postings.length > 0 ? postings.find((p) => p.id === positionValue) : void 0;
|
|
2096
|
+
const position = selectedPosting ? selectedPosting.title : positionValue;
|
|
2097
|
+
if (!email) {
|
|
2098
|
+
setFormError("Please enter the email address you applied with.");
|
|
2099
|
+
return;
|
|
2100
|
+
}
|
|
2101
|
+
if (!position) {
|
|
2102
|
+
setFormError("Please select or enter the position you applied for.");
|
|
2103
|
+
return;
|
|
2104
|
+
}
|
|
2105
|
+
if (!repoUrl || !isValidUrl(repoUrl)) {
|
|
2106
|
+
setFormError(
|
|
2107
|
+
"Please enter a valid GitHub repository URL (e.g. https://github.com/you/project)."
|
|
2108
|
+
);
|
|
2109
|
+
return;
|
|
2110
|
+
}
|
|
2111
|
+
if (!videoUrl || !isValidUrl(videoUrl)) {
|
|
2112
|
+
setFormError(
|
|
2113
|
+
"Please enter a valid video URL (e.g. a Jam or Loom link starting with https://)."
|
|
2114
|
+
);
|
|
2115
|
+
return;
|
|
2116
|
+
}
|
|
2117
|
+
setIsSubmitting(true);
|
|
2118
|
+
try {
|
|
2119
|
+
const result = await submitAssignmentResponse(client, {
|
|
2120
|
+
name: name || void 0,
|
|
2121
|
+
email,
|
|
2122
|
+
position,
|
|
2123
|
+
jobPostingId: selectedPosting?.id,
|
|
2124
|
+
repoUrl,
|
|
2125
|
+
videoUrl,
|
|
2126
|
+
notes: notes || void 0,
|
|
2127
|
+
recaptchaToken
|
|
2128
|
+
});
|
|
2129
|
+
if (result.success) {
|
|
2130
|
+
setSubmittedMessage(result.message ?? "Assignment submitted!");
|
|
2131
|
+
sonner.toast.success(result.message ?? "Assignment submitted!");
|
|
2132
|
+
} else {
|
|
2133
|
+
const message = result.message ?? "Failed to submit assignment";
|
|
2134
|
+
setFormError(
|
|
2135
|
+
isNoApplicationError(message) ? `${message} ${NO_APPLICATION_HINT}` : message
|
|
2136
|
+
);
|
|
2137
|
+
sonner.toast.error(message);
|
|
2138
|
+
recaptchaRef.current?.reset();
|
|
2139
|
+
}
|
|
2140
|
+
} catch (err) {
|
|
2141
|
+
console.error("Careers submission form error:", err);
|
|
2142
|
+
setFormError("Something went wrong. Please try again.");
|
|
2143
|
+
sonner.toast.error("Something went wrong. Please try again.");
|
|
2144
|
+
recaptchaRef.current?.reset();
|
|
2145
|
+
} finally {
|
|
2146
|
+
setIsSubmitting(false);
|
|
2147
|
+
}
|
|
2148
|
+
};
|
|
2149
|
+
const Heading = headingLevel === 2 ? "h2" : "h1";
|
|
2150
|
+
const headingClass = headingLevel === 2 ? "text-2xl md:text-3xl font-bold mb-3" : "text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6";
|
|
2151
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
2152
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2153
|
+
PageHead,
|
|
2154
|
+
{
|
|
2155
|
+
title: seo.title ?? `Submit your assignment \u2014 ${displayName}`,
|
|
2156
|
+
description: seo.description ?? heroDescription,
|
|
2157
|
+
keywords: seo.keywords
|
|
2158
|
+
}
|
|
2159
|
+
),
|
|
2160
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2161
|
+
"section",
|
|
2162
|
+
{
|
|
2163
|
+
className: headingLevel === 2 ? "py-12 md:py-16" : "bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24",
|
|
2164
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-3xl mx-auto px-4 sm:px-6 lg:px-8", children: [
|
|
2165
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-8 sm:mb-10", children: [
|
|
2166
|
+
/* @__PURE__ */ jsxRuntime.jsx(Heading, { className: headingClass, children: heroTitle }),
|
|
2167
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg text-muted-foreground leading-relaxed", children: heroDescription })
|
|
2168
|
+
] }),
|
|
2169
|
+
submittedMessage ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center rounded-xl border border-border bg-card p-10", children: [
|
|
2170
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle, { className: "mx-auto mb-4 h-12 w-12 text-accent" }),
|
|
2171
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl font-semibold text-foreground mb-2", children: "Assignment received" }),
|
|
2172
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: submittedMessage })
|
|
2173
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: "space-y-5", children: [
|
|
2174
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-5", children: [
|
|
2175
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2176
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "name", children: "Name" }),
|
|
2177
|
+
/* @__PURE__ */ jsxRuntime.jsx(Input, { id: "name", name: "name", placeholder: "Ada Lovelace" })
|
|
2178
|
+
] }),
|
|
2179
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2180
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "email", children: "Email *" }),
|
|
2181
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2182
|
+
Input,
|
|
2183
|
+
{
|
|
2184
|
+
id: "email",
|
|
2185
|
+
name: "email",
|
|
2186
|
+
type: "email",
|
|
2187
|
+
required: true,
|
|
2188
|
+
placeholder: "ada@example.com"
|
|
2189
|
+
}
|
|
2190
|
+
)
|
|
2191
|
+
] })
|
|
2192
|
+
] }),
|
|
2193
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2194
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "position", children: "Position *" }),
|
|
2195
|
+
postings.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2196
|
+
"select",
|
|
2197
|
+
{
|
|
2198
|
+
id: "position",
|
|
2199
|
+
name: "position",
|
|
2200
|
+
required: true,
|
|
2201
|
+
defaultValue: "",
|
|
2202
|
+
className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring",
|
|
2203
|
+
children: [
|
|
2204
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, children: "Select a role" }),
|
|
2205
|
+
postings.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.id, children: p.title }, p.id))
|
|
2206
|
+
]
|
|
2207
|
+
}
|
|
2208
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
2209
|
+
Input,
|
|
2210
|
+
{
|
|
2211
|
+
id: "position",
|
|
2212
|
+
name: "position",
|
|
2213
|
+
required: true,
|
|
2214
|
+
placeholder: "Role you applied for"
|
|
2215
|
+
}
|
|
2216
|
+
)
|
|
2217
|
+
] }),
|
|
2218
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2219
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "repoUrl", children: "GitHub repository URL *" }),
|
|
2220
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2221
|
+
Input,
|
|
2222
|
+
{
|
|
2223
|
+
id: "repoUrl",
|
|
2224
|
+
name: "repoUrl",
|
|
2225
|
+
type: "url",
|
|
2226
|
+
required: true,
|
|
2227
|
+
placeholder: "https://github.com/you/assignment"
|
|
2228
|
+
}
|
|
2229
|
+
)
|
|
2230
|
+
] }),
|
|
2231
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2232
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "videoUrl", children: "Video walkthrough URL (Jam, Loom, \u2026) *" }),
|
|
2233
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2234
|
+
Input,
|
|
2235
|
+
{
|
|
2236
|
+
id: "videoUrl",
|
|
2237
|
+
name: "videoUrl",
|
|
2238
|
+
type: "url",
|
|
2239
|
+
required: true,
|
|
2240
|
+
placeholder: "https://jam.dev/c/\u2026"
|
|
2241
|
+
}
|
|
2242
|
+
)
|
|
2243
|
+
] }),
|
|
2244
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2245
|
+
/* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "notes", children: "Notes" }),
|
|
2246
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2247
|
+
Textarea,
|
|
2248
|
+
{
|
|
2249
|
+
id: "notes",
|
|
2250
|
+
name: "notes",
|
|
2251
|
+
rows: 4,
|
|
2252
|
+
placeholder: "Anything we should know before reviewing\u2026"
|
|
2253
|
+
}
|
|
2254
|
+
)
|
|
2255
|
+
] }),
|
|
2256
|
+
formError && /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "text-sm text-destructive", children: formError }),
|
|
2257
|
+
effectiveRecaptchaSiteKey && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2258
|
+
ReCAPTCHA4__default.default,
|
|
2259
|
+
{
|
|
2260
|
+
ref: recaptchaRef,
|
|
2261
|
+
sitekey: effectiveRecaptchaSiteKey
|
|
2262
|
+
}
|
|
2263
|
+
),
|
|
2264
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2265
|
+
Button,
|
|
2266
|
+
{
|
|
2267
|
+
type: "submit",
|
|
2268
|
+
size: "lg",
|
|
2269
|
+
disabled: isSubmitting,
|
|
2270
|
+
className: "w-full sm:w-auto",
|
|
2271
|
+
children: isSubmitting ? "Submitting\u2026" : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2272
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Send, { className: "mr-2 h-4 w-4" }),
|
|
2273
|
+
" Submit assignment"
|
|
2274
|
+
] })
|
|
2275
|
+
}
|
|
2276
|
+
)
|
|
2277
|
+
] })
|
|
2278
|
+
] })
|
|
2279
|
+
}
|
|
2280
|
+
)
|
|
2281
|
+
] });
|
|
2282
|
+
}
|
|
2005
2283
|
var newsletterSchema = zod.z.object({
|
|
2006
2284
|
email: zod.z.string().email("Please enter a valid email address")
|
|
2007
2285
|
});
|
|
@@ -2291,7 +2569,7 @@ function NewsletterPage({
|
|
|
2291
2569
|
errors.email && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: errors.email.message })
|
|
2292
2570
|
] }),
|
|
2293
2571
|
effectiveRecaptchaSiteKey && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2294
|
-
|
|
2572
|
+
ReCAPTCHA4__default.default,
|
|
2295
2573
|
{
|
|
2296
2574
|
ref: recaptchaRef,
|
|
2297
2575
|
sitekey: effectiveRecaptchaSiteKey
|
|
@@ -2343,7 +2621,7 @@ function NewsletterPage({
|
|
|
2343
2621
|
errors.email && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: errors.email.message })
|
|
2344
2622
|
] }),
|
|
2345
2623
|
effectiveRecaptchaSiteKey && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center sm:justify-start", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2346
|
-
|
|
2624
|
+
ReCAPTCHA4__default.default,
|
|
2347
2625
|
{
|
|
2348
2626
|
ref: recaptchaRef,
|
|
2349
2627
|
sitekey: effectiveRecaptchaSiteKey
|
|
@@ -2521,7 +2799,7 @@ function NewsletterForm({
|
|
|
2521
2799
|
justifyContent: "flex-start"
|
|
2522
2800
|
},
|
|
2523
2801
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2524
|
-
|
|
2802
|
+
ReCAPTCHA4__default.default,
|
|
2525
2803
|
{
|
|
2526
2804
|
ref: recaptchaRef,
|
|
2527
2805
|
sitekey: effectiveRecaptchaSiteKey,
|
|
@@ -9267,6 +9545,7 @@ exports.BlogListPage = BlogListPage;
|
|
|
9267
9545
|
exports.BlogPostPage = BlogPostPage;
|
|
9268
9546
|
exports.Button = Button;
|
|
9269
9547
|
exports.CareersApplyForm = CareersApplyForm;
|
|
9548
|
+
exports.CareersSubmissionForm = CareersSubmissionForm;
|
|
9270
9549
|
exports.CaseStudiesListPage = CaseStudiesListPage;
|
|
9271
9550
|
exports.CaseStudyPage = CaseStudyPage;
|
|
9272
9551
|
exports.ChangelogPage = ChangelogPage;
|
|
@@ -9313,6 +9592,7 @@ exports.fetchPublicJobPosting = fetchPublicJobPosting;
|
|
|
9313
9592
|
exports.fetchPublicJobPostings = fetchPublicJobPostings;
|
|
9314
9593
|
exports.formatDownloads = formatDownloads;
|
|
9315
9594
|
exports.formatPrice = formatPrice2;
|
|
9595
|
+
exports.isValidUrl = isValidUrl;
|
|
9316
9596
|
exports.useContentPage = useContentPage;
|
|
9317
9597
|
exports.useContentPages = useContentPages;
|
|
9318
9598
|
exports.useProduct = useProduct;
|