PageSourceSearch

https://playful-page-builder-7502.taskade.app/

html playful-page-builder-7502.taskade.app collected 2026-10-03 15:03:36 UTC 13,276 bytes, 228 lines download raw bytes

1<!doctype html>
2<html lang="en">
3  <head>
4    <meta charset="UTF-8" />
5    <link rel="icon" href="/_genesis/assets/favicon" />
6    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7    <title>Cam’s Fun Channel</title>
8    
9    
9<script>
10      (function() {
11        var esc = function(s) { return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); };
12        var errorHtml = function(msg, id) {
13          return '<div style="position:fixed;inset:0;background:#000;padding:2rem;font-family:system-ui,sans-serif;color:#fff;overflow:auto">' +
14            '<div style="max-width:600px;margin:0 auto">' +
15            '<h2 style="margin:0 0 0.5rem;font-size:1.25rem">Something went wrong</h2>' +
16            '<p style="color:#999;margin:0 0 1rem;font-size:0.95rem">The app failed to load. Try refreshing the page.</p>' +
17            '<pre style="background:#1a1a1a;padding:1rem;border-radius:8px;overflow:auto;font-size:0.8rem;color:#f87171;margin:0;white-space:pre-wrap;word-break:break-word">' +
18            esc(msg) + '<\/pre>' +
19            '<p style="color:#666;margin:1rem 0 0;font-size:0.75rem">Error ID: <code>' + esc(id) + '<\/code><\/p>' +
20            '<\/div><\/div>';
21        };
22        var reported = false;
23        var errorId = null;
24        function getErrorId() {
25          if (errorId != null) return errorId;
26          try {
27            if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { errorId = crypto.randomUUID().replace(/-/g, ''); return errorId; }
28          } catch (e) { /* Fall through to the time+random id below */ }
29          errorId = Date.now().toString(36) + Math.random().toString(36).slice(2, 12);
30          return errorId;
31        }
32        function reportError(code, msg, stack) {
33          if (reported) return;
34          reported = true;
35          try {
36            var logger = window.__TASKADE_APP_LIFECYCLE_LOGGER__;
37            if (typeof logger?.log === 'function') {
38              logger.log({ level: 'error', message: 'Runtime Error', data: { code: code, message: msg, stack: stack || '' } });
39              return;
40            }
41            // Published: no logger, so beacon to the Taskade gateway instead of
42            // dropping the crash on the floor (#27626). Relative path — the
43            // Director proxy injects the gateway token server-side. Once per page
44            // session (the latch above) so a crash loop cannot flood the sink.
45            fetch('/api/taskade/telemetry/errors', {
46              method: 'POST',
47              headers: { 'Content-Type': 'application/json' },
48              body: JSON.stringify({
49                errorId: getErrorId(),
50                code: code,
51                message: String(msg || 'Unknown error').slice(0, 4000),
52                stack: String(stack || '').slice(0, 20000),
53                path: location.pathname.slice(0, 1000),
54                userAgent: navigator.userAgent.slice(0, 512)
55              }),
56              keepalive: true
57              // Default same-origin credentials: a password-protected app gates
58              // /api/taskade/* on its signed access cookie, so omitting them
59              // would redirect the beacon to the password page.
60            }).catch(function() {});
61          } catch (e) { /* Swallow — never block the fallback error UI */ }
62        }
63        function showError(code, msg, stack) {
64          var root = document.getElementById('root');
65          if (!root) return;
66          var spinner = root.querySelector('.genesis__spinner-container');
67          if (spinner) {
68            // Scenario 1: React never mounted — replace spinner
69            reportError('error.fatal', msg, stack);
70            spinner.outerHTML = errorHtml(msg, getErrorId());
71          } else if (!root.childElementCount) {
72            // Scenario 2: React crashed and unmounted — #root is empty
73            reportError('error.fatal', msg, stack);
74            root.innerHTML = errorHtml(msg, getErrorId());
75          } else {
76            // React is running fine — don't interfere with the DOM,
77            // but still report with the original code for diagnostics
78            reportError(code, msg, stack);
79          }
80        }
81        window.addEventListener('error', function(e) {
82          var msg = e.message || String(e.error) || 'Unknown error';
83          var stack = e.error && e.error.stack ? e.error.stack : (e.filename ? e.filename + ':' + e.lineno + ':' + e.colno : '');
84          showError('error.runtime_error', msg, stack);
85        });
86        window.addEventListener('unhandledrejection', function(e) {
87          var msg = e.reason ? String(e.reason) : 'Unhandled promise rejection';
88          var stack = e.reason && e.reason.stack ? e.reason.stack : '';
89          showError('error.unhandled_promise', msg, stack);
90        });
91        // A dead <img> degrades to a neutral placeholder instead of painting its
92        // raw alt string across the page (#27730) — the symptom half of the
93        // fabricated-hot-link fix, and the only half that helps an ALREADY
94        // published app, whose images can rot long after generation.
95        //
96        // Resource load errors do not bubble, so they reach window only in the
97        // CAPTURE phase. That is why neither handler above has ever seen one, and
98        // why this cannot disturb them: a broken image must never render the fatal
99        // error overlay or spend the once-per-session crash beacon.
100        //
101        // Swapping in a 1x1 transparent GIF is what actually stops the alt text —
102        // the element becomes a SUCCESSFUL load, so the browser has no broken image
103        // to caption, while the alt attribute stays for assistive tech. Layout is
104        // untouched: the app's own width/height/aspect classes still apply. The grey
105        // is translucent so it reads correctly on a light or a dark surface without
106        // this script having to know the app's theme.
107        var deadImagePixel = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
108        window.addEventListener('error', function(e) {
109          var el = e.target;
110          if (!el || el.tagName !== 'IMG') return;
111          // The swap fires a fresh load on the same element, so the latch is what
112          // keeps a failing data URI from looping.
113          if (el.getAttribute('data-genesis-image-fallback') !== null) return;
114          el.setAttribute('data-genesis-image-fallback', '');
115          el.removeAttribute('srcset');
116          el.src = deadImagePixel;
117          el.style.background = 'linear-gradient(135deg, rgba(127,127,127,0.16), rgba(127,127,127,0.28))';
118        }, true);
119      })();
120    </script>
120
121    <style>
122      /* Genesis spinner styles */
123      .genesis__spinner-container {
124        position: fixed;
125        inset: 0;
126        background: #000000;
127        display: flex;
128        align-items: center;
129        justify-content: center;
130        z-index: 9999;
131      }
132
133      .genesis__spinner-ring {
134        width: 20px;
135        height: 20px;
136        border: 1.5px solid transparent;
137        border-top: 1.5px solid rgba(255, 255, 255, 0.6);
138        border-radius: 50%;
139        animation: genesis__spin 1s linear infinite;
140      }
141
142      @keyframes genesis__spin {
143        0% { transform: rotate(0deg); }
144        100% { transform: rotate(360deg); }
145      }
146
147      /* Respect reduced motion preferences */
148      @media (prefers-reduced-motion: reduce) {
149        .genesis__spinner-ring {
150          animation: none;
151          border-top-color: rgba(255, 255, 255, 0.9);
152        }
153      }
154    </style>
155    
156
157
158<script type="module" src="/assets/main-KV3DTGJJ.js"></script>
158
159
160
161<link rel="stylesheet" href="/assets/main-LOHFB6BN.css" />
162  <meta charset="utf-8" /><meta name="language" content="en-US" /><meta name="robots" content="index,follow" /><meta name="author" content="Cam’s Fun Channel" /><link rel="icon" sizes="32x32" href="/_genesis/assets/favicon" /><link rel="apple-touch-icon" sizes="180x180" href="/_genesis/assets/favicon" /><meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)" /><meta name="theme-color" content="#2c64af" media="(prefers-color-scheme: dark)" /><meta name="title" content="Cam’s Fun Channel" /><meta property="og:title" content="Cam’s Fun Channel" /><meta name="twitter:title" content="Cam’s Fun Channel" /><meta name="description" content="Welcome to Cam’s Fun Channel!
163
164I’m Cam, and this is where I share all the fun things I love to do like drawing cool characters, playing with toys, building, creating, and really just having fun.
165
166On this channel you’ll find:
167🎨 Drawing with markers and art tools
168🧸 Toy play and creative games
169🚗 Fun builds, challenges, and surprises
170✨ New videos full of fun and creativity
171
172Thanks for hanging out with me,  let’s have some fun together!" /><meta property="og:description" content="Welcome to Cam’s Fun Channel!
173
174I’m Cam, and this is where I share all the fun things I love to do like drawing cool characters, playing with toys, building, creating, and really just having fun.
175
176On this channel you’ll find:
177🎨 Drawing with markers and art tools
178🧸 Toy play and creative games
179🚗 Fun builds, challenges, and surprises
180✨ New videos full of fun and creativity
181
182Thanks for hanging out with me,  let’s have some fun together!" /><meta name="twitter:description" content="Welcome to Cam’s Fun Channel!
183
184I’m Cam, and this is where I share all the fun things I love to do like drawing cool characters, playing with toys, building, creating, and really just having fun.
185
186On this channel you’ll find:
187🎨 Drawing with markers and art tools
188🧸 Toy play and creative games
189🚗 Fun builds, challenges, and surprises
190✨ New videos full of fun and creativity
191
192Thanks for hanging out with me,  let’s have some fun together!" /><meta property="og:type" content="website" /><meta property="og:url" content="https://playful-page-builder-7502.taskade.app" /><meta property="og:site_name" content="Cam’s Fun Channel" /><meta property="og:image" content="https://playful-page-builder-7502.taskade.app/_internal/screenshot" /><meta property="og:image:alt" content="Cam’s Fun Channel - Welcome to Cam’s Fun Channel!
193
194I’m Cam, and this is where I share all the fun things I love to do li..." /><meta property="og:locale" content="en_US" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:site" content="@taskade" /><meta name="twitter:creator" content="@taskade" /><meta name="twitter:image" content="https://playful-page-builder-7502.taskade.app/_internal/screenshot" /><meta name="twitter:image:alt" content="Cam’s Fun Channel - Welcome to Cam’s Fun Channel!
195
196I’m Cam, and this is where I share all the fun things I love to do li..." /><meta name="format-detection" content="telephone=no" /><meta name="mobile-web-app-capable" content="yes" /><meta name="apple-mobile-web-app-capable" content="yes" /><meta name="apple-mobile-web-app-status-bar-style" content="default" /><meta name="apple-mobile-web-app-title" content="Cam’s Fun Channel" /><meta name="application-name" content="Cam’s Fun Channel" /><link rel="canonical" href="https://playful-page-builder-7502.taskade.app" />
196<script type="application/ld+json">
197  {
198    "@context": "https://schema.org",
199    "@type": "WebSite",
200    "name": "Cam’s Fun Channel",
201    "alternateName": "Cam’s Fun Channel",
202    "description": "Welcome to Cam’s Fun Channel!\n\nI’m Cam, and this is where I share all the fun things I love to do like drawing cool characters, playing with toys, building, creating, and really just having fun.\n\nOn this channel you’ll find:\n🎨 Drawing with markers and art tools\n🧸 Toy play and creative games\n🚗 Fun builds, challenges, and surprises\n✨ New videos full of fun and creativity\n\nThanks for hanging out with me,  let’s have some fun together!",
203    "image": "https://playful-page-builder-7502.taskade.app/_internal/screenshot",
204    "url": "https://playful-page-builder-7502.taskade.app",
205    "author": {
206      "@type": "Organization",
207      "name": "Cam’s Fun Channel"
208    },
209    "publisher": {
210      "@type": "Organization",
211      "name": "Cam’s Fun Channel",
212      "url": "https://playful-page-builder-7502.taskade.app",
213      "logo": {
214        "@type": "ImageObject",
215        "url": "https://playful-page-builder-7502.taskade.app/_internal/screenshot"
216      }
217    }
218  }
219</script>
219<script defer src="/_genesis/vendor/flock.min.js" data-proxy-url="/_genesis/api/events" data-tenant-id="f257rygunzxruhcd:default" data-domain="playful-page-builder-7502.taskade.app"></script>
219<script defer src="/_genesis/vendor/scroll-guard.js"></script>
219</head>
220  <body>
221    <div id="root">
222      <div class="genesis__spinner-container">
223        <div class="genesis__spinner-ring"></div>
224      </div>
225    </div>
226  
226<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"8d4254f20c524f6fbf6ecde0b2c89fb4","spa":2}' crossorigin="anonymous"></script>
226
227</body>
228</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.