rankrunners-cms 0.0.52 → 0.0.54
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/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rankrunners-cms",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.54",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@puckeditor/core": "^0.21.
|
|
7
|
-
"@tanstack/react-router": "^1.
|
|
8
|
-
"@tanstack/router-core": "^1.
|
|
9
|
-
"lucide-react": "^1.
|
|
10
|
-
"next": "^16.2.
|
|
11
|
-
"react": "^19.2.
|
|
12
|
-
"valibot": "^1.
|
|
13
|
-
"hono": "^4.12.
|
|
6
|
+
"@puckeditor/core": "^0.21.3",
|
|
7
|
+
"@tanstack/react-router": "^1.170.15",
|
|
8
|
+
"@tanstack/router-core": "^1.171.13",
|
|
9
|
+
"lucide-react": "^1.18.0",
|
|
10
|
+
"next": "^16.2.9",
|
|
11
|
+
"react": "^19.2.7",
|
|
12
|
+
"valibot": "^1.4.1",
|
|
13
|
+
"hono": "^4.12.25"
|
|
14
14
|
},
|
|
15
15
|
"peerDependenciesMeta": {
|
|
16
16
|
"next": {
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@types/react": "^19.2.
|
|
34
|
-
"bun-types": "^1.3.
|
|
33
|
+
"@types/react": "^19.2.17",
|
|
34
|
+
"bun-types": "^1.3.14",
|
|
35
35
|
"typescript": "^6.0.3"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
package/src/api/types/public.ts
CHANGED
|
@@ -26,6 +26,7 @@ export type PublicMediaDTO = InferOutput<typeof PublicMediaSchema>;
|
|
|
26
26
|
const SeoTrackingFields = {
|
|
27
27
|
googleAnalyticsId: optional(string()),
|
|
28
28
|
googleTagManagerId: optional(string()),
|
|
29
|
+
googleAdsId: optional(string()),
|
|
29
30
|
metaPixelId: optional(string()),
|
|
30
31
|
universalPixelId: optional(string()),
|
|
31
32
|
universalPixelAdvertiserId: optional(string()),
|
|
@@ -5,14 +5,12 @@ import rankrunners from "../../assets/rankrunners.webp";
|
|
|
5
5
|
|
|
6
6
|
export const CaptchaBadge: React.FC = () => {
|
|
7
7
|
const [isHovered, setIsHovered] = useState(false);
|
|
8
|
-
const [isDialogOpen, setIsDialogOpen] = useState(false);
|
|
9
8
|
const [isLearnMoreHovered, setIsLearnMoreHovered] = useState(false);
|
|
10
|
-
const [isCloseHovered, setIsCloseHovered] = useState(false);
|
|
11
9
|
|
|
12
10
|
const handleMouseEnter = () => setIsHovered(true);
|
|
13
11
|
const handleMouseLeave = () => setIsHovered(false);
|
|
14
|
-
const handleLearnMoreClick = () =>
|
|
15
|
-
|
|
12
|
+
const handleLearnMoreClick = () =>
|
|
13
|
+
window.open("https://rankrunners.net/recaptcha", "_blank");
|
|
16
14
|
|
|
17
15
|
return (
|
|
18
16
|
<>
|
|
@@ -95,69 +93,6 @@ export const CaptchaBadge: React.FC = () => {
|
|
|
95
93
|
</div>
|
|
96
94
|
</div>
|
|
97
95
|
</div>
|
|
98
|
-
|
|
99
|
-
{isDialogOpen && (
|
|
100
|
-
<div
|
|
101
|
-
style={{
|
|
102
|
-
position: "fixed",
|
|
103
|
-
inset: 0,
|
|
104
|
-
zIndex: 100,
|
|
105
|
-
display: "flex",
|
|
106
|
-
alignItems: "center",
|
|
107
|
-
justifyContent: "center",
|
|
108
|
-
background: "rgb(0 0 0 / 0.5)",
|
|
109
|
-
}}
|
|
110
|
-
>
|
|
111
|
-
<div
|
|
112
|
-
style={{
|
|
113
|
-
margin: "0 auto",
|
|
114
|
-
maxWidth: 384,
|
|
115
|
-
borderRadius: 8,
|
|
116
|
-
background: "#ffffff",
|
|
117
|
-
padding: 24,
|
|
118
|
-
boxShadow:
|
|
119
|
-
"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -2px rgb(0 0 0 / 0.05)",
|
|
120
|
-
}}
|
|
121
|
-
>
|
|
122
|
-
<h3
|
|
123
|
-
style={{
|
|
124
|
-
margin: "0 0 16px",
|
|
125
|
-
fontSize: 18,
|
|
126
|
-
fontWeight: 700,
|
|
127
|
-
}}
|
|
128
|
-
>
|
|
129
|
-
About RankRunners Captcha
|
|
130
|
-
</h3>
|
|
131
|
-
<p
|
|
132
|
-
style={{
|
|
133
|
-
margin: "0 0 16px",
|
|
134
|
-
color: "#374151",
|
|
135
|
-
}}
|
|
136
|
-
>
|
|
137
|
-
RankRunners Captcha helps protect this site from spam and abuse.
|
|
138
|
-
<br />
|
|
139
|
-
<br /> It works by analyzing user behavior to distinguish between
|
|
140
|
-
humans and bots without interrupting the user experience.
|
|
141
|
-
</p>
|
|
142
|
-
<button
|
|
143
|
-
style={{
|
|
144
|
-
border: "none",
|
|
145
|
-
borderRadius: 6,
|
|
146
|
-
background: isCloseHovered ? "#1d4ed8" : "#3b82f6",
|
|
147
|
-
padding: "8px 16px",
|
|
148
|
-
color: "#ffffff",
|
|
149
|
-
fontWeight: 700,
|
|
150
|
-
cursor: "pointer",
|
|
151
|
-
}}
|
|
152
|
-
onClick={handleCloseDialog}
|
|
153
|
-
onMouseEnter={() => setIsCloseHovered(true)}
|
|
154
|
-
onMouseLeave={() => setIsCloseHovered(false)}
|
|
155
|
-
>
|
|
156
|
-
Close
|
|
157
|
-
</button>
|
|
158
|
-
</div>
|
|
159
|
-
</div>
|
|
160
|
-
)}
|
|
161
96
|
</>
|
|
162
97
|
);
|
|
163
98
|
};
|
|
@@ -3,14 +3,12 @@ import rankrunners from "../../assets/rankrunners.webp";
|
|
|
3
3
|
|
|
4
4
|
export const CaptchaBadge: React.FC = () => {
|
|
5
5
|
const [isHovered, setIsHovered] = useState(false);
|
|
6
|
-
const [isDialogOpen, setIsDialogOpen] = useState(false);
|
|
7
6
|
const [isLearnMoreHovered, setIsLearnMoreHovered] = useState(false);
|
|
8
|
-
const [isCloseHovered, setIsCloseHovered] = useState(false);
|
|
9
7
|
|
|
10
8
|
const handleMouseEnter = () => setIsHovered(true);
|
|
11
9
|
const handleMouseLeave = () => setIsHovered(false);
|
|
12
|
-
const handleLearnMoreClick = () =>
|
|
13
|
-
|
|
10
|
+
const handleLearnMoreClick = () =>
|
|
11
|
+
window.open("https://rankrunners.net/recaptcha", "_blank");
|
|
14
12
|
|
|
15
13
|
return (
|
|
16
14
|
<>
|
|
@@ -93,69 +91,6 @@ export const CaptchaBadge: React.FC = () => {
|
|
|
93
91
|
</div>
|
|
94
92
|
</div>
|
|
95
93
|
</div>
|
|
96
|
-
|
|
97
|
-
{isDialogOpen && (
|
|
98
|
-
<div
|
|
99
|
-
style={{
|
|
100
|
-
position: "fixed",
|
|
101
|
-
inset: 0,
|
|
102
|
-
zIndex: 100,
|
|
103
|
-
display: "flex",
|
|
104
|
-
alignItems: "center",
|
|
105
|
-
justifyContent: "center",
|
|
106
|
-
background: "rgb(0 0 0 / 0.5)",
|
|
107
|
-
}}
|
|
108
|
-
>
|
|
109
|
-
<div
|
|
110
|
-
style={{
|
|
111
|
-
margin: "0 auto",
|
|
112
|
-
maxWidth: 384,
|
|
113
|
-
borderRadius: 8,
|
|
114
|
-
background: "#ffffff",
|
|
115
|
-
padding: 24,
|
|
116
|
-
boxShadow:
|
|
117
|
-
"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -2px rgb(0 0 0 / 0.05)",
|
|
118
|
-
}}
|
|
119
|
-
>
|
|
120
|
-
<h3
|
|
121
|
-
style={{
|
|
122
|
-
margin: "0 0 16px",
|
|
123
|
-
fontSize: 18,
|
|
124
|
-
fontWeight: 700,
|
|
125
|
-
}}
|
|
126
|
-
>
|
|
127
|
-
About RankRunners Captcha
|
|
128
|
-
</h3>
|
|
129
|
-
<p
|
|
130
|
-
style={{
|
|
131
|
-
margin: "0 0 16px",
|
|
132
|
-
color: "#374151",
|
|
133
|
-
}}
|
|
134
|
-
>
|
|
135
|
-
RankRunners Captcha helps protect this site from spam and abuse.
|
|
136
|
-
<br />
|
|
137
|
-
<br /> It works by analyzing user behavior to distinguish between
|
|
138
|
-
humans and bots without interrupting the user experience.
|
|
139
|
-
</p>
|
|
140
|
-
<button
|
|
141
|
-
style={{
|
|
142
|
-
border: "none",
|
|
143
|
-
borderRadius: 6,
|
|
144
|
-
background: isCloseHovered ? "#1d4ed8" : "#3b82f6",
|
|
145
|
-
padding: "8px 16px",
|
|
146
|
-
color: "#ffffff",
|
|
147
|
-
fontWeight: 700,
|
|
148
|
-
cursor: "pointer",
|
|
149
|
-
}}
|
|
150
|
-
onClick={handleCloseDialog}
|
|
151
|
-
onMouseEnter={() => setIsCloseHovered(true)}
|
|
152
|
-
onMouseLeave={() => setIsCloseHovered(false)}
|
|
153
|
-
>
|
|
154
|
-
Close
|
|
155
|
-
</button>
|
|
156
|
-
</div>
|
|
157
|
-
</div>
|
|
158
|
-
)}
|
|
159
94
|
</>
|
|
160
95
|
);
|
|
161
96
|
};
|
package/src/tanstack/seo/head.ts
CHANGED
|
@@ -162,6 +162,22 @@ export function buildSeoScripts(seoDetails: AnySeoDetails): ScriptTag[] {
|
|
|
162
162
|
});
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
// Google Ads (separate from GA4 — uses AW- tracking IDs)
|
|
166
|
+
if (seoDetails.googleAdsId) {
|
|
167
|
+
scripts.push({
|
|
168
|
+
src: `https://www.googletagmanager.com/gtag/js?id=${seoDetails.googleAdsId}`,
|
|
169
|
+
async: true,
|
|
170
|
+
});
|
|
171
|
+
scripts.push({
|
|
172
|
+
children: `
|
|
173
|
+
window.dataLayer = window.dataLayer || [];
|
|
174
|
+
function gtag(){dataLayer.push(arguments);}
|
|
175
|
+
gtag('js', new Date());
|
|
176
|
+
gtag('config', '${seoDetails.googleAdsId}');
|
|
177
|
+
`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
165
181
|
// Trade Desk Universal Pixel
|
|
166
182
|
if (seoDetails.universalPixelId && seoDetails.universalPixelAdvertiserId) {
|
|
167
183
|
scripts.push({
|