diff --git a/.parcel-cache/01f6c16286515649 b/.parcel-cache/01f6c16286515649 new file mode 100644 index 0000000..009414a Binary files /dev/null and b/.parcel-cache/01f6c16286515649 differ diff --git a/.parcel-cache/02764895e954050b b/.parcel-cache/02764895e954050b new file mode 100644 index 0000000..573e5c8 Binary files /dev/null and b/.parcel-cache/02764895e954050b differ diff --git a/.parcel-cache/048e672f2ff872ec b/.parcel-cache/048e672f2ff872ec new file mode 100644 index 0000000..9c57fba Binary files /dev/null and b/.parcel-cache/048e672f2ff872ec differ diff --git a/.parcel-cache/aefcecc43958bc7b b/.parcel-cache/aefcecc43958bc7b new file mode 100644 index 0000000..23fcf9e Binary files /dev/null and b/.parcel-cache/aefcecc43958bc7b differ diff --git a/.parcel-cache/data.mdb b/.parcel-cache/data.mdb new file mode 100644 index 0000000..00efe1d Binary files /dev/null and b/.parcel-cache/data.mdb differ diff --git a/.parcel-cache/f490249e08b63226 b/.parcel-cache/f490249e08b63226 new file mode 100644 index 0000000..da2d8b3 Binary files /dev/null and b/.parcel-cache/f490249e08b63226 differ diff --git a/.parcel-cache/lock.mdb b/.parcel-cache/lock.mdb new file mode 100644 index 0000000..0eb4afa Binary files /dev/null and b/.parcel-cache/lock.mdb differ diff --git a/about.html b/about.html new file mode 100644 index 0000000..f494f07 --- /dev/null +++ b/about.html @@ -0,0 +1,502 @@ + + + + + + Document + + + + + +
+
+
+ + +
+
+
+ +
+
+

About CodeCanvas 🌍✨

+

CodeCanvas was born from a simple idea: creating a vibrant space where front-end developers at all levels could share their work, find inspiration, and grow together. We noticed that while there are many platforms for code sharing, there wasn't a dedicated community focused on celebrating the artistry and creativity in front-end development.

+ +
+

Why choose us

+

Unlike generic coding platforms, CodeCanvas is specifically tailored for front-end developers who:

+
    +
  • Value both functionality and aesthetics
  • +
  • Want to showcase their projects in a design-friendly format
  • +
  • Seek inspiration that balances technical excellence with visual appeal
  • +
  • Appreciate constructive feedback from peers
  • +
+
+ +
+

Our Mission

+

At CodeCanvas, we're on a mission to:

+
    +
  • Democratize front-end inspiration by making amazing designs accessible to everyone
  • +
  • Foster meaningful connections between developers worldwide
  • +
  • Celebrate creativity in all its forms - from stunning animations to clever UI solutions
  • +
  • Lower the barriers for newcomers to learn from real-world examples
  • +
+
+
+

Our Values

+
    +
  • ✨ Creativity First - We celebrate innovative thinking
  • +
  • 🌱 Always Learning - Every project teaches us something new
  • +
  • πŸ€— Community Focused - Your success is our success
  • +
  • πŸ”“ Open By Design - We believe in transparent, accessible development
  • +
+
+
+

CodeCanvas is more than a platform - it's a community. Contribute your projects, share feedback, or help us improve the platform. Together, we're painting the digital world one beautiful component at a time.

+
+ + +
+
+ + + + \ No newline at end of file diff --git a/dist/CodeCanvas-dolikansal.3464ddca.js b/dist/CodeCanvas-dolikansal.3464ddca.js new file mode 100644 index 0000000..2560e9f --- /dev/null +++ b/dist/CodeCanvas-dolikansal.3464ddca.js @@ -0,0 +1,673 @@ +// modules are defined as an array +// [ module function, map of requires ] +// +// map of requires is short require name -> numeric require +// +// anything defined in a previous bundle is accessed via the +// orig method which is the require for previous bundles + +(function ( + modules, + entry, + mainEntry, + parcelRequireName, + externals, + distDir, + publicUrl, + devServer +) { + /* eslint-disable no-undef */ + var globalObject = + typeof globalThis !== 'undefined' + ? globalThis + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : {}; + /* eslint-enable no-undef */ + + // Save the require from previous bundle to this closure if any + var previousRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + + var importMap = previousRequire.i || {}; + var cache = previousRequire.cache || {}; + // Do not use `require` to prevent Webpack from trying to bundle this call + var nodeRequire = + typeof module !== 'undefined' && + typeof module.require === 'function' && + module.require.bind(module); + + function newRequire(name, jumped) { + if (!cache[name]) { + if (!modules[name]) { + if (externals[name]) { + return externals[name]; + } + // if we cannot find the module within our internal map or + // cache jump to the current global require ie. the last bundle + // that was added to the page. + var currentRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + if (!jumped && currentRequire) { + return currentRequire(name, true); + } + + // If there are other bundles on this page the require from the + // previous one is saved to 'previousRequire'. Repeat this as + // many times as there are bundles until the module is found or + // we exhaust the require chain. + if (previousRequire) { + return previousRequire(name, true); + } + + // Try the node require function if it exists. + if (nodeRequire && typeof name === 'string') { + return nodeRequire(name); + } + + var err = new Error("Cannot find module '" + name + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + } + + localRequire.resolve = resolve; + localRequire.cache = {}; + + var module = (cache[name] = new newRequire.Module(name)); + + modules[name][0].call( + module.exports, + localRequire, + module, + module.exports, + globalObject + ); + } + + return cache[name].exports; + + function localRequire(x) { + var res = localRequire.resolve(x); + return res === false ? {} : newRequire(res); + } + + function resolve(x) { + var id = modules[name][1][x]; + return id != null ? id : x; + } + } + + function Module(moduleName) { + this.id = moduleName; + this.bundle = newRequire; + this.require = nodeRequire; + this.exports = {}; + } + + newRequire.isParcelRequire = true; + newRequire.Module = Module; + newRequire.modules = modules; + newRequire.cache = cache; + newRequire.parent = previousRequire; + newRequire.distDir = distDir; + newRequire.publicUrl = publicUrl; + newRequire.devServer = devServer; + newRequire.i = importMap; + newRequire.register = function (id, exports) { + modules[id] = [ + function (require, module) { + module.exports = exports; + }, + {}, + ]; + }; + + // Only insert newRequire.load when it is actually used. + // The code in this file is linted against ES5, so dynamic import is not allowed. + // INSERT_LOAD_HERE + + Object.defineProperty(newRequire, 'root', { + get: function () { + return globalObject[parcelRequireName]; + }, + }); + + globalObject[parcelRequireName] = newRequire; + + for (var i = 0; i < entry.length; i++) { + newRequire(entry[i]); + } + + if (mainEntry) { + // Expose entry point to Node, AMD or browser globals + // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js + var mainExports = newRequire(mainEntry); + + // CommonJS + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = mainExports; + + // RequireJS + } else if (typeof define === 'function' && define.amd) { + define(function () { + return mainExports; + }); + } + } +})({"hjOj8":[function(require,module,exports,__globalThis) { +var global = arguments[3]; +var HMR_HOST = null; +var HMR_PORT = null; +var HMR_SERVER_PORT = 1234; +var HMR_SECURE = false; +var HMR_ENV_HASH = "d6ea1d42532a7575"; +var HMR_USE_SSE = false; +module.bundle.HMR_BUNDLE_ID = "0907ca6d3464ddca"; +"use strict"; +/* global HMR_HOST, HMR_PORT, HMR_SERVER_PORT, HMR_ENV_HASH, HMR_SECURE, HMR_USE_SSE, chrome, browser, __parcel__import__, __parcel__importScripts__, ServiceWorkerGlobalScope */ /*:: +import type { + HMRAsset, + HMRMessage, +} from '@parcel/reporter-dev-server/src/HMRServer.js'; +interface ParcelRequire { + (string): mixed; + cache: {|[string]: ParcelModule|}; + hotData: {|[string]: mixed|}; + Module: any; + parent: ?ParcelRequire; + isParcelRequire: true; + modules: {|[string]: [Function, {|[string]: string|}]|}; + HMR_BUNDLE_ID: string; + root: ParcelRequire; +} +interface ParcelModule { + hot: {| + data: mixed, + accept(cb: (Function) => void): void, + dispose(cb: (mixed) => void): void, + // accept(deps: Array | string, cb: (Function) => void): void, + // decline(): void, + _acceptCallbacks: Array<(Function) => void>, + _disposeCallbacks: Array<(mixed) => void>, + |}; +} +interface ExtensionContext { + runtime: {| + reload(): void, + getURL(url: string): string; + getManifest(): {manifest_version: number, ...}; + |}; +} +declare var module: {bundle: ParcelRequire, ...}; +declare var HMR_HOST: string; +declare var HMR_PORT: string; +declare var HMR_SERVER_PORT: string; +declare var HMR_ENV_HASH: string; +declare var HMR_SECURE: boolean; +declare var HMR_USE_SSE: boolean; +declare var chrome: ExtensionContext; +declare var browser: ExtensionContext; +declare var __parcel__import__: (string) => Promise; +declare var __parcel__importScripts__: (string) => Promise; +declare var globalThis: typeof self; +declare var ServiceWorkerGlobalScope: Object; +*/ var OVERLAY_ID = '__parcel__error__overlay__'; +var OldModule = module.bundle.Module; +function Module(moduleName) { + OldModule.call(this, moduleName); + this.hot = { + data: module.bundle.hotData[moduleName], + _acceptCallbacks: [], + _disposeCallbacks: [], + accept: function(fn) { + this._acceptCallbacks.push(fn || function() {}); + }, + dispose: function(fn) { + this._disposeCallbacks.push(fn); + } + }; + module.bundle.hotData[moduleName] = undefined; +} +module.bundle.Module = Module; +module.bundle.hotData = {}; +var checkedAssets /*: {|[string]: boolean|} */ , disposedAssets /*: {|[string]: boolean|} */ , assetsToDispose /*: Array<[ParcelRequire, string]> */ , assetsToAccept /*: Array<[ParcelRequire, string]> */ , bundleNotFound = false; +function getHostname() { + return HMR_HOST || (typeof location !== 'undefined' && location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost'); +} +function getPort() { + return HMR_PORT || (typeof location !== 'undefined' ? location.port : HMR_SERVER_PORT); +} +// eslint-disable-next-line no-redeclare +let WebSocket = globalThis.WebSocket; +if (!WebSocket && typeof module.bundle.root === 'function') try { + // eslint-disable-next-line no-global-assign + WebSocket = module.bundle.root('ws'); +} catch { +// ignore. +} +var hostname = getHostname(); +var port = getPort(); +var protocol = HMR_SECURE || typeof location !== 'undefined' && location.protocol === 'https:' && ![ + 'localhost', + '127.0.0.1', + '0.0.0.0' +].includes(hostname) ? 'wss' : 'ws'; +// eslint-disable-next-line no-redeclare +var parent = module.bundle.parent; +if (!parent || !parent.isParcelRequire) { + // Web extension context + var extCtx = typeof browser === 'undefined' ? typeof chrome === 'undefined' ? null : chrome : browser; + // Safari doesn't support sourceURL in error stacks. + // eval may also be disabled via CSP, so do a quick check. + var supportsSourceURL = false; + try { + (0, eval)('throw new Error("test"); //# sourceURL=test.js'); + } catch (err) { + supportsSourceURL = err.stack.includes('test.js'); + } + var ws; + if (HMR_USE_SSE) ws = new EventSource('/__parcel_hmr'); + else try { + // If we're running in the dev server's node runner, listen for messages on the parent port. + let { workerData, parentPort } = module.bundle.root('node:worker_threads') /*: any*/ ; + if (workerData !== null && workerData !== void 0 && workerData.__parcel) { + parentPort.on('message', async (message)=>{ + try { + await handleMessage(message); + parentPort.postMessage('updated'); + } catch { + parentPort.postMessage('restart'); + } + }); + // After the bundle has finished running, notify the dev server that the HMR update is complete. + queueMicrotask(()=>parentPort.postMessage('ready')); + } + } catch { + if (typeof WebSocket !== 'undefined') try { + ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/'); + } catch (err) { + // Ignore cloudflare workers error. + if (err.message && !err.message.includes('Disallowed operation called within global scope')) console.error(err.message); + } + } + if (ws) { + // $FlowFixMe + ws.onmessage = async function(event /*: {data: string, ...} */ ) { + var data /*: HMRMessage */ = JSON.parse(event.data); + await handleMessage(data); + }; + if (ws instanceof WebSocket) { + ws.onerror = function(e) { + if (e.message) console.error(e.message); + }; + ws.onclose = function() { + console.warn("[parcel] \uD83D\uDEA8 Connection to the HMR server was lost"); + }; + } + } +} +async function handleMessage(data /*: HMRMessage */ ) { + checkedAssets = {} /*: {|[string]: boolean|} */ ; + disposedAssets = {} /*: {|[string]: boolean|} */ ; + assetsToAccept = []; + assetsToDispose = []; + bundleNotFound = false; + if (data.type === 'reload') fullReload(); + else if (data.type === 'update') { + // Remove error overlay if there is one + if (typeof document !== 'undefined') removeErrorOverlay(); + let assets = data.assets; + // Handle HMR Update + let handled = assets.every((asset)=>{ + return asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle); + }); + // Dispatch a custom event in case a bundle was not found. This might mean + // an asset on the server changed and we should reload the page. This event + // gives the client an opportunity to refresh without losing state + // (e.g. via React Server Components). If e.preventDefault() is not called, + // we will trigger a full page reload. + if (handled && bundleNotFound && assets.some((a)=>a.envHash !== HMR_ENV_HASH) && typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') handled = !window.dispatchEvent(new CustomEvent('parcelhmrreload', { + cancelable: true + })); + if (handled) { + console.clear(); + // Dispatch custom event so other runtimes (e.g React Refresh) are aware. + if (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') window.dispatchEvent(new CustomEvent('parcelhmraccept')); + await hmrApplyUpdates(assets); + hmrDisposeQueue(); + // Run accept callbacks. This will also re-execute other disposed assets in topological order. + let processedAssets = {}; + for(let i = 0; i < assetsToAccept.length; i++){ + let id = assetsToAccept[i][1]; + if (!processedAssets[id]) { + hmrAccept(assetsToAccept[i][0], id); + processedAssets[id] = true; + } + } + } else fullReload(); + } + if (data.type === 'error') { + // Log parcel errors to console + for (let ansiDiagnostic of data.diagnostics.ansi){ + let stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack; + console.error("\uD83D\uDEA8 [parcel]: " + ansiDiagnostic.message + '\n' + stack + '\n\n' + ansiDiagnostic.hints.join('\n')); + } + if (typeof document !== 'undefined') { + // Render the fancy html overlay + removeErrorOverlay(); + var overlay = createErrorOverlay(data.diagnostics.html); + // $FlowFixMe + document.body.appendChild(overlay); + } + } +} +function removeErrorOverlay() { + var overlay = document.getElementById(OVERLAY_ID); + if (overlay) { + overlay.remove(); + console.log("[parcel] \u2728 Error resolved"); + } +} +function createErrorOverlay(diagnostics) { + var overlay = document.createElement('div'); + overlay.id = OVERLAY_ID; + let errorHTML = '
'; + for (let diagnostic of diagnostics){ + let stack = diagnostic.frames.length ? diagnostic.frames.reduce((p, frame)=>{ + return `${p} +${frame.location} +${frame.code}`; + }, '') : diagnostic.stack; + errorHTML += ` +
+
+ \u{1F6A8} ${diagnostic.message} +
+
${stack}
+
+ ${diagnostic.hints.map((hint)=>"
\uD83D\uDCA1 " + hint + '
').join('')} +
+ ${diagnostic.documentation ? `
\u{1F4DD} Learn more
` : ''} +
+ `; + } + errorHTML += '
'; + overlay.innerHTML = errorHTML; + return overlay; +} +function fullReload() { + if (typeof location !== 'undefined' && 'reload' in location) location.reload(); + else if (typeof extCtx !== 'undefined' && extCtx && extCtx.runtime && extCtx.runtime.reload) extCtx.runtime.reload(); + else try { + let { workerData, parentPort } = module.bundle.root('node:worker_threads') /*: any*/ ; + if (workerData !== null && workerData !== void 0 && workerData.__parcel) parentPort.postMessage('restart'); + } catch (err) { + console.error("[parcel] \u26A0\uFE0F An HMR update was not accepted. Please restart the process."); + } +} +function getParents(bundle, id) /*: Array<[ParcelRequire, string]> */ { + var modules = bundle.modules; + if (!modules) return []; + var parents = []; + var k, d, dep; + for(k in modules)for(d in modules[k][1]){ + dep = modules[k][1][d]; + if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) parents.push([ + bundle, + k + ]); + } + if (bundle.parent) parents = parents.concat(getParents(bundle.parent, id)); + return parents; +} +function updateLink(link) { + var href = link.getAttribute('href'); + if (!href) return; + var newLink = link.cloneNode(); + newLink.onload = function() { + if (link.parentNode !== null) // $FlowFixMe + link.parentNode.removeChild(link); + }; + newLink.setAttribute('href', // $FlowFixMe + href.split('?')[0] + '?' + Date.now()); + // $FlowFixMe + link.parentNode.insertBefore(newLink, link.nextSibling); +} +var cssTimeout = null; +function reloadCSS() { + if (cssTimeout || typeof document === 'undefined') return; + cssTimeout = setTimeout(function() { + var links = document.querySelectorAll('link[rel="stylesheet"]'); + for(var i = 0; i < links.length; i++){ + // $FlowFixMe[incompatible-type] + var href /*: string */ = links[i].getAttribute('href'); + var hostname = getHostname(); + var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\/\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort()); + var absolute = /^https?:\/\//i.test(href) && href.indexOf(location.origin) !== 0 && !servedFromHMRServer; + if (!absolute) updateLink(links[i]); + } + cssTimeout = null; + }, 50); +} +function hmrDownload(asset) { + if (asset.type === 'js') { + if (typeof document !== 'undefined') { + let script = document.createElement('script'); + script.src = asset.url + '?t=' + Date.now(); + if (asset.outputFormat === 'esmodule') script.type = 'module'; + return new Promise((resolve, reject)=>{ + var _document$head; + script.onload = ()=>resolve(script); + script.onerror = reject; + (_document$head = document.head) === null || _document$head === void 0 || _document$head.appendChild(script); + }); + } else if (typeof importScripts === 'function') { + // Worker scripts + if (asset.outputFormat === 'esmodule') return import(asset.url + '?t=' + Date.now()); + else return new Promise((resolve, reject)=>{ + try { + importScripts(asset.url + '?t=' + Date.now()); + resolve(); + } catch (err) { + reject(err); + } + }); + } + } +} +async function hmrApplyUpdates(assets) { + global.parcelHotUpdate = Object.create(null); + let scriptsToRemove; + try { + // If sourceURL comments aren't supported in eval, we need to load + // the update from the dev server over HTTP so that stack traces + // are correct in errors/logs. This is much slower than eval, so + // we only do it if needed (currently just Safari). + // https://bugs.webkit.org/show_bug.cgi?id=137297 + // This path is also taken if a CSP disallows eval. + if (!supportsSourceURL) { + let promises = assets.map((asset)=>{ + var _hmrDownload; + return (_hmrDownload = hmrDownload(asset)) === null || _hmrDownload === void 0 ? void 0 : _hmrDownload.catch((err)=>{ + // Web extension fix + if (extCtx && extCtx.runtime && extCtx.runtime.getManifest().manifest_version == 3 && typeof ServiceWorkerGlobalScope != 'undefined' && global instanceof ServiceWorkerGlobalScope) { + extCtx.runtime.reload(); + return; + } + throw err; + }); + }); + scriptsToRemove = await Promise.all(promises); + } + assets.forEach(function(asset) { + hmrApply(module.bundle.root, asset); + }); + } finally{ + delete global.parcelHotUpdate; + if (scriptsToRemove) scriptsToRemove.forEach((script)=>{ + if (script) { + var _document$head2; + (_document$head2 = document.head) === null || _document$head2 === void 0 || _document$head2.removeChild(script); + } + }); + } +} +function hmrApply(bundle /*: ParcelRequire */ , asset /*: HMRAsset */ ) { + var modules = bundle.modules; + if (!modules) return; + if (asset.type === 'css') reloadCSS(); + else if (asset.type === 'js') { + let deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID]; + if (deps) { + if (modules[asset.id]) { + // Remove dependencies that are removed and will become orphaned. + // This is necessary so that if the asset is added back again, the cache is gone, and we prevent a full page reload. + let oldDeps = modules[asset.id][1]; + for(let dep in oldDeps)if (!deps[dep] || deps[dep] !== oldDeps[dep]) { + let id = oldDeps[dep]; + let parents = getParents(module.bundle.root, id); + if (parents.length === 1) hmrDelete(module.bundle.root, id); + } + } + if (supportsSourceURL) // Global eval. We would use `new Function` here but browser + // support for source maps is better with eval. + (0, eval)(asset.output); + // $FlowFixMe + let fn = global.parcelHotUpdate[asset.id]; + modules[asset.id] = [ + fn, + deps + ]; + } + // Always traverse to the parent bundle, even if we already replaced the asset in this bundle. + // This is required in case modules are duplicated. We need to ensure all instances have the updated code. + if (bundle.parent) hmrApply(bundle.parent, asset); + } +} +function hmrDelete(bundle, id) { + let modules = bundle.modules; + if (!modules) return; + if (modules[id]) { + // Collect dependencies that will become orphaned when this module is deleted. + let deps = modules[id][1]; + let orphans = []; + for(let dep in deps){ + let parents = getParents(module.bundle.root, deps[dep]); + if (parents.length === 1) orphans.push(deps[dep]); + } + // Delete the module. This must be done before deleting dependencies in case of circular dependencies. + delete modules[id]; + delete bundle.cache[id]; + // Now delete the orphans. + orphans.forEach((id)=>{ + hmrDelete(module.bundle.root, id); + }); + } else if (bundle.parent) hmrDelete(bundle.parent, id); +} +function hmrAcceptCheck(bundle /*: ParcelRequire */ , id /*: string */ , depsByBundle /*: ?{ [string]: { [string]: string } }*/ ) { + checkedAssets = {}; + if (hmrAcceptCheckOne(bundle, id, depsByBundle)) return true; + // Traverse parents breadth first. All possible ancestries must accept the HMR update, or we'll reload. + let parents = getParents(module.bundle.root, id); + let accepted = false; + while(parents.length > 0){ + let v = parents.shift(); + let a = hmrAcceptCheckOne(v[0], v[1], null); + if (a) // If this parent accepts, stop traversing upward, but still consider siblings. + accepted = true; + else if (a !== null) { + // Otherwise, queue the parents in the next level upward. + let p = getParents(module.bundle.root, v[1]); + if (p.length === 0) { + // If there are no parents, then we've reached an entry without accepting. Reload. + accepted = false; + break; + } + parents.push(...p); + } + } + return accepted; +} +function hmrAcceptCheckOne(bundle /*: ParcelRequire */ , id /*: string */ , depsByBundle /*: ?{ [string]: { [string]: string } }*/ ) { + var modules = bundle.modules; + if (!modules) return; + if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) { + // If we reached the root bundle without finding where the asset should go, + // there's nothing to do. Mark as "accepted" so we don't reload the page. + if (!bundle.parent) { + bundleNotFound = true; + return true; + } + return hmrAcceptCheckOne(bundle.parent, id, depsByBundle); + } + if (checkedAssets[id]) return null; + checkedAssets[id] = true; + var cached = bundle.cache[id]; + if (!cached) return true; + assetsToDispose.push([ + bundle, + id + ]); + if (cached && cached.hot && cached.hot._acceptCallbacks.length) { + assetsToAccept.push([ + bundle, + id + ]); + return true; + } + return false; +} +function hmrDisposeQueue() { + // Dispose all old assets. + for(let i = 0; i < assetsToDispose.length; i++){ + let id = assetsToDispose[i][1]; + if (!disposedAssets[id]) { + hmrDispose(assetsToDispose[i][0], id); + disposedAssets[id] = true; + } + } + assetsToDispose = []; +} +function hmrDispose(bundle /*: ParcelRequire */ , id /*: string */ ) { + var cached = bundle.cache[id]; + bundle.hotData[id] = {}; + if (cached && cached.hot) cached.hot.data = bundle.hotData[id]; + if (cached && cached.hot && cached.hot._disposeCallbacks.length) cached.hot._disposeCallbacks.forEach(function(cb) { + cb(bundle.hotData[id]); + }); + delete bundle.cache[id]; +} +function hmrAccept(bundle /*: ParcelRequire */ , id /*: string */ ) { + // Execute the module. + bundle(id); + // Run the accept callbacks in the new version of the module. + var cached = bundle.cache[id]; + if (cached && cached.hot && cached.hot._acceptCallbacks.length) { + let assetsToAlsoAccept = []; + cached.hot._acceptCallbacks.forEach(function(cb) { + let additionalAssets = cb(function() { + return getParents(module.bundle.root, id); + }); + if (Array.isArray(additionalAssets) && additionalAssets.length) assetsToAlsoAccept.push(...additionalAssets); + }); + if (assetsToAlsoAccept.length) { + let handled = assetsToAlsoAccept.every(function(a) { + return hmrAcceptCheck(a[0], a[1]); + }); + if (!handled) return fullReload(); + hmrDisposeQueue(); + } + } +} + +},{}],"j4kuM":[function(require,module,exports,__globalThis) { + +},{}]},["hjOj8","j4kuM"], "j4kuM", "parcelRequire94c2", {}) + +//# sourceMappingURL=CodeCanvas-dolikansal.3464ddca.js.map diff --git a/dist/CodeCanvas-dolikansal.3464ddca.js.map b/dist/CodeCanvas-dolikansal.3464ddca.js.map new file mode 100644 index 0000000..89504c4 --- /dev/null +++ b/dist/CodeCanvas-dolikansal.3464ddca.js.map @@ -0,0 +1 @@ +{"mappings":"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","sources":["../../../.npm/_npx/b4a9aa12c0cf34a6/node_modules/@parcel/runtime-browser-hmr/lib/runtime-a6057c12bc3471ef.js"],"sourcesContent":["var HMR_HOST = null;var HMR_PORT = null;var HMR_SERVER_PORT = 1234;var HMR_SECURE = false;var HMR_ENV_HASH = \"d6ea1d42532a7575\";var HMR_USE_SSE = false;module.bundle.HMR_BUNDLE_ID = \"0907ca6d3464ddca\";\"use strict\";\n\n/* global HMR_HOST, HMR_PORT, HMR_SERVER_PORT, HMR_ENV_HASH, HMR_SECURE, HMR_USE_SSE, chrome, browser, __parcel__import__, __parcel__importScripts__, ServiceWorkerGlobalScope */\n/*::\nimport type {\n HMRAsset,\n HMRMessage,\n} from '@parcel/reporter-dev-server/src/HMRServer.js';\ninterface ParcelRequire {\n (string): mixed;\n cache: {|[string]: ParcelModule|};\n hotData: {|[string]: mixed|};\n Module: any;\n parent: ?ParcelRequire;\n isParcelRequire: true;\n modules: {|[string]: [Function, {|[string]: string|}]|};\n HMR_BUNDLE_ID: string;\n root: ParcelRequire;\n}\ninterface ParcelModule {\n hot: {|\n data: mixed,\n accept(cb: (Function) => void): void,\n dispose(cb: (mixed) => void): void,\n // accept(deps: Array | string, cb: (Function) => void): void,\n // decline(): void,\n _acceptCallbacks: Array<(Function) => void>,\n _disposeCallbacks: Array<(mixed) => void>,\n |};\n}\ninterface ExtensionContext {\n runtime: {|\n reload(): void,\n getURL(url: string): string;\n getManifest(): {manifest_version: number, ...};\n |};\n}\ndeclare var module: {bundle: ParcelRequire, ...};\ndeclare var HMR_HOST: string;\ndeclare var HMR_PORT: string;\ndeclare var HMR_SERVER_PORT: string;\ndeclare var HMR_ENV_HASH: string;\ndeclare var HMR_SECURE: boolean;\ndeclare var HMR_USE_SSE: boolean;\ndeclare var chrome: ExtensionContext;\ndeclare var browser: ExtensionContext;\ndeclare var __parcel__import__: (string) => Promise;\ndeclare var __parcel__importScripts__: (string) => Promise;\ndeclare var globalThis: typeof self;\ndeclare var ServiceWorkerGlobalScope: Object;\n*/\nvar OVERLAY_ID = '__parcel__error__overlay__';\nvar OldModule = module.bundle.Module;\nfunction Module(moduleName) {\n OldModule.call(this, moduleName);\n this.hot = {\n data: module.bundle.hotData[moduleName],\n _acceptCallbacks: [],\n _disposeCallbacks: [],\n accept: function (fn) {\n this._acceptCallbacks.push(fn || function () {});\n },\n dispose: function (fn) {\n this._disposeCallbacks.push(fn);\n }\n };\n module.bundle.hotData[moduleName] = undefined;\n}\nmodule.bundle.Module = Module;\nmodule.bundle.hotData = {};\nvar checkedAssets /*: {|[string]: boolean|} */,\n disposedAssets /*: {|[string]: boolean|} */,\n assetsToDispose /*: Array<[ParcelRequire, string]> */,\n assetsToAccept /*: Array<[ParcelRequire, string]> */,\n bundleNotFound = false;\nfunction getHostname() {\n return HMR_HOST || (typeof location !== 'undefined' && location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost');\n}\nfunction getPort() {\n return HMR_PORT || (typeof location !== 'undefined' ? location.port : HMR_SERVER_PORT);\n}\n\n// eslint-disable-next-line no-redeclare\nlet WebSocket = globalThis.WebSocket;\nif (!WebSocket && typeof module.bundle.root === 'function') {\n try {\n // eslint-disable-next-line no-global-assign\n WebSocket = module.bundle.root('ws');\n } catch {\n // ignore.\n }\n}\nvar hostname = getHostname();\nvar port = getPort();\nvar protocol = HMR_SECURE || typeof location !== 'undefined' && location.protocol === 'https:' && !['localhost', '127.0.0.1', '0.0.0.0'].includes(hostname) ? 'wss' : 'ws';\n\n// eslint-disable-next-line no-redeclare\nvar parent = module.bundle.parent;\nif (!parent || !parent.isParcelRequire) {\n // Web extension context\n var extCtx = typeof browser === 'undefined' ? typeof chrome === 'undefined' ? null : chrome : browser;\n\n // Safari doesn't support sourceURL in error stacks.\n // eval may also be disabled via CSP, so do a quick check.\n var supportsSourceURL = false;\n try {\n (0, eval)('throw new Error(\"test\"); //# sourceURL=test.js');\n } catch (err) {\n supportsSourceURL = err.stack.includes('test.js');\n }\n var ws;\n if (HMR_USE_SSE) {\n ws = new EventSource('/__parcel_hmr');\n } else {\n try {\n // If we're running in the dev server's node runner, listen for messages on the parent port.\n let {\n workerData,\n parentPort\n } = module.bundle.root('node:worker_threads') /*: any*/;\n if (workerData !== null && workerData !== void 0 && workerData.__parcel) {\n parentPort.on('message', async message => {\n try {\n await handleMessage(message);\n parentPort.postMessage('updated');\n } catch {\n parentPort.postMessage('restart');\n }\n });\n\n // After the bundle has finished running, notify the dev server that the HMR update is complete.\n queueMicrotask(() => parentPort.postMessage('ready'));\n }\n } catch {\n if (typeof WebSocket !== 'undefined') {\n try {\n ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/');\n } catch (err) {\n // Ignore cloudflare workers error.\n if (err.message && !err.message.includes('Disallowed operation called within global scope')) {\n console.error(err.message);\n }\n }\n }\n }\n }\n if (ws) {\n // $FlowFixMe\n ws.onmessage = async function (event /*: {data: string, ...} */) {\n var data /*: HMRMessage */ = JSON.parse(event.data);\n await handleMessage(data);\n };\n if (ws instanceof WebSocket) {\n ws.onerror = function (e) {\n if (e.message) {\n console.error(e.message);\n }\n };\n ws.onclose = function () {\n console.warn('[parcel] 🚨 Connection to the HMR server was lost');\n };\n }\n }\n}\nasync function handleMessage(data /*: HMRMessage */) {\n checkedAssets = {} /*: {|[string]: boolean|} */;\n disposedAssets = {} /*: {|[string]: boolean|} */;\n assetsToAccept = [];\n assetsToDispose = [];\n bundleNotFound = false;\n if (data.type === 'reload') {\n fullReload();\n } else if (data.type === 'update') {\n // Remove error overlay if there is one\n if (typeof document !== 'undefined') {\n removeErrorOverlay();\n }\n let assets = data.assets;\n\n // Handle HMR Update\n let handled = assets.every(asset => {\n return asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle);\n });\n\n // Dispatch a custom event in case a bundle was not found. This might mean\n // an asset on the server changed and we should reload the page. This event\n // gives the client an opportunity to refresh without losing state\n // (e.g. via React Server Components). If e.preventDefault() is not called,\n // we will trigger a full page reload.\n if (handled && bundleNotFound && assets.some(a => a.envHash !== HMR_ENV_HASH) && typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n handled = !window.dispatchEvent(new CustomEvent('parcelhmrreload', {\n cancelable: true\n }));\n }\n if (handled) {\n console.clear();\n\n // Dispatch custom event so other runtimes (e.g React Refresh) are aware.\n if (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n window.dispatchEvent(new CustomEvent('parcelhmraccept'));\n }\n await hmrApplyUpdates(assets);\n hmrDisposeQueue();\n\n // Run accept callbacks. This will also re-execute other disposed assets in topological order.\n let processedAssets = {};\n for (let i = 0; i < assetsToAccept.length; i++) {\n let id = assetsToAccept[i][1];\n if (!processedAssets[id]) {\n hmrAccept(assetsToAccept[i][0], id);\n processedAssets[id] = true;\n }\n }\n } else fullReload();\n }\n if (data.type === 'error') {\n // Log parcel errors to console\n for (let ansiDiagnostic of data.diagnostics.ansi) {\n let stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack;\n console.error('🚨 [parcel]: ' + ansiDiagnostic.message + '\\n' + stack + '\\n\\n' + ansiDiagnostic.hints.join('\\n'));\n }\n if (typeof document !== 'undefined') {\n // Render the fancy html overlay\n removeErrorOverlay();\n var overlay = createErrorOverlay(data.diagnostics.html);\n // $FlowFixMe\n document.body.appendChild(overlay);\n }\n }\n}\nfunction removeErrorOverlay() {\n var overlay = document.getElementById(OVERLAY_ID);\n if (overlay) {\n overlay.remove();\n console.log('[parcel] ✨ Error resolved');\n }\n}\nfunction createErrorOverlay(diagnostics) {\n var overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n let errorHTML = '
';\n for (let diagnostic of diagnostics) {\n let stack = diagnostic.frames.length ? diagnostic.frames.reduce((p, frame) => {\n return `${p}\n${frame.location}\n${frame.code}`;\n }, '') : diagnostic.stack;\n errorHTML += `\n
\n
\n 🚨 ${diagnostic.message}\n
\n
${stack}
\n
\n ${diagnostic.hints.map(hint => '
πŸ’‘ ' + hint + '
').join('')}\n
\n ${diagnostic.documentation ? `
πŸ“ Learn more
` : ''}\n
\n `;\n }\n errorHTML += '
';\n overlay.innerHTML = errorHTML;\n return overlay;\n}\nfunction fullReload() {\n if (typeof location !== 'undefined' && 'reload' in location) {\n location.reload();\n } else if (typeof extCtx !== 'undefined' && extCtx && extCtx.runtime && extCtx.runtime.reload) {\n extCtx.runtime.reload();\n } else {\n try {\n let {\n workerData,\n parentPort\n } = module.bundle.root('node:worker_threads') /*: any*/;\n if (workerData !== null && workerData !== void 0 && workerData.__parcel) {\n parentPort.postMessage('restart');\n }\n } catch (err) {\n console.error('[parcel] ⚠️ An HMR update was not accepted. Please restart the process.');\n }\n }\n}\nfunction getParents(bundle, id) /*: Array<[ParcelRequire, string]> */{\n var modules = bundle.modules;\n if (!modules) {\n return [];\n }\n var parents = [];\n var k, d, dep;\n for (k in modules) {\n for (d in modules[k][1]) {\n dep = modules[k][1][d];\n if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) {\n parents.push([bundle, k]);\n }\n }\n }\n if (bundle.parent) {\n parents = parents.concat(getParents(bundle.parent, id));\n }\n return parents;\n}\nfunction updateLink(link) {\n var href = link.getAttribute('href');\n if (!href) {\n return;\n }\n var newLink = link.cloneNode();\n newLink.onload = function () {\n if (link.parentNode !== null) {\n // $FlowFixMe\n link.parentNode.removeChild(link);\n }\n };\n newLink.setAttribute('href',\n // $FlowFixMe\n href.split('?')[0] + '?' + Date.now());\n // $FlowFixMe\n link.parentNode.insertBefore(newLink, link.nextSibling);\n}\nvar cssTimeout = null;\nfunction reloadCSS() {\n if (cssTimeout || typeof document === 'undefined') {\n return;\n }\n cssTimeout = setTimeout(function () {\n var links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (var i = 0; i < links.length; i++) {\n // $FlowFixMe[incompatible-type]\n var href /*: string */ = links[i].getAttribute('href');\n var hostname = getHostname();\n var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\\\/\\\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort());\n var absolute = /^https?:\\/\\//i.test(href) && href.indexOf(location.origin) !== 0 && !servedFromHMRServer;\n if (!absolute) {\n updateLink(links[i]);\n }\n }\n cssTimeout = null;\n }, 50);\n}\nfunction hmrDownload(asset) {\n if (asset.type === 'js') {\n if (typeof document !== 'undefined') {\n let script = document.createElement('script');\n script.src = asset.url + '?t=' + Date.now();\n if (asset.outputFormat === 'esmodule') {\n script.type = 'module';\n }\n return new Promise((resolve, reject) => {\n var _document$head;\n script.onload = () => resolve(script);\n script.onerror = reject;\n (_document$head = document.head) === null || _document$head === void 0 || _document$head.appendChild(script);\n });\n } else if (typeof importScripts === 'function') {\n // Worker scripts\n if (asset.outputFormat === 'esmodule') {\n return __parcel__import__(asset.url + '?t=' + Date.now());\n } else {\n return new Promise((resolve, reject) => {\n try {\n __parcel__importScripts__(asset.url + '?t=' + Date.now());\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n }\n }\n }\n}\nasync function hmrApplyUpdates(assets) {\n global.parcelHotUpdate = Object.create(null);\n let scriptsToRemove;\n try {\n // If sourceURL comments aren't supported in eval, we need to load\n // the update from the dev server over HTTP so that stack traces\n // are correct in errors/logs. This is much slower than eval, so\n // we only do it if needed (currently just Safari).\n // https://bugs.webkit.org/show_bug.cgi?id=137297\n // This path is also taken if a CSP disallows eval.\n if (!supportsSourceURL) {\n let promises = assets.map(asset => {\n var _hmrDownload;\n return (_hmrDownload = hmrDownload(asset)) === null || _hmrDownload === void 0 ? void 0 : _hmrDownload.catch(err => {\n // Web extension fix\n if (extCtx && extCtx.runtime && extCtx.runtime.getManifest().manifest_version == 3 && typeof ServiceWorkerGlobalScope != 'undefined' && global instanceof ServiceWorkerGlobalScope) {\n extCtx.runtime.reload();\n return;\n }\n throw err;\n });\n });\n scriptsToRemove = await Promise.all(promises);\n }\n assets.forEach(function (asset) {\n hmrApply(module.bundle.root, asset);\n });\n } finally {\n delete global.parcelHotUpdate;\n if (scriptsToRemove) {\n scriptsToRemove.forEach(script => {\n if (script) {\n var _document$head2;\n (_document$head2 = document.head) === null || _document$head2 === void 0 || _document$head2.removeChild(script);\n }\n });\n }\n }\n}\nfunction hmrApply(bundle /*: ParcelRequire */, asset /*: HMRAsset */) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n if (asset.type === 'css') {\n reloadCSS();\n } else if (asset.type === 'js') {\n let deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID];\n if (deps) {\n if (modules[asset.id]) {\n // Remove dependencies that are removed and will become orphaned.\n // This is necessary so that if the asset is added back again, the cache is gone, and we prevent a full page reload.\n let oldDeps = modules[asset.id][1];\n for (let dep in oldDeps) {\n if (!deps[dep] || deps[dep] !== oldDeps[dep]) {\n let id = oldDeps[dep];\n let parents = getParents(module.bundle.root, id);\n if (parents.length === 1) {\n hmrDelete(module.bundle.root, id);\n }\n }\n }\n }\n if (supportsSourceURL) {\n // Global eval. We would use `new Function` here but browser\n // support for source maps is better with eval.\n (0, eval)(asset.output);\n }\n\n // $FlowFixMe\n let fn = global.parcelHotUpdate[asset.id];\n modules[asset.id] = [fn, deps];\n }\n\n // Always traverse to the parent bundle, even if we already replaced the asset in this bundle.\n // This is required in case modules are duplicated. We need to ensure all instances have the updated code.\n if (bundle.parent) {\n hmrApply(bundle.parent, asset);\n }\n }\n}\nfunction hmrDelete(bundle, id) {\n let modules = bundle.modules;\n if (!modules) {\n return;\n }\n if (modules[id]) {\n // Collect dependencies that will become orphaned when this module is deleted.\n let deps = modules[id][1];\n let orphans = [];\n for (let dep in deps) {\n let parents = getParents(module.bundle.root, deps[dep]);\n if (parents.length === 1) {\n orphans.push(deps[dep]);\n }\n }\n\n // Delete the module. This must be done before deleting dependencies in case of circular dependencies.\n delete modules[id];\n delete bundle.cache[id];\n\n // Now delete the orphans.\n orphans.forEach(id => {\n hmrDelete(module.bundle.root, id);\n });\n } else if (bundle.parent) {\n hmrDelete(bundle.parent, id);\n }\n}\nfunction hmrAcceptCheck(bundle /*: ParcelRequire */, id /*: string */, depsByBundle /*: ?{ [string]: { [string]: string } }*/) {\n checkedAssets = {};\n if (hmrAcceptCheckOne(bundle, id, depsByBundle)) {\n return true;\n }\n\n // Traverse parents breadth first. All possible ancestries must accept the HMR update, or we'll reload.\n let parents = getParents(module.bundle.root, id);\n let accepted = false;\n while (parents.length > 0) {\n let v = parents.shift();\n let a = hmrAcceptCheckOne(v[0], v[1], null);\n if (a) {\n // If this parent accepts, stop traversing upward, but still consider siblings.\n accepted = true;\n } else if (a !== null) {\n // Otherwise, queue the parents in the next level upward.\n let p = getParents(module.bundle.root, v[1]);\n if (p.length === 0) {\n // If there are no parents, then we've reached an entry without accepting. Reload.\n accepted = false;\n break;\n }\n parents.push(...p);\n }\n }\n return accepted;\n}\nfunction hmrAcceptCheckOne(bundle /*: ParcelRequire */, id /*: string */, depsByBundle /*: ?{ [string]: { [string]: string } }*/) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) {\n // If we reached the root bundle without finding where the asset should go,\n // there's nothing to do. Mark as \"accepted\" so we don't reload the page.\n if (!bundle.parent) {\n bundleNotFound = true;\n return true;\n }\n return hmrAcceptCheckOne(bundle.parent, id, depsByBundle);\n }\n if (checkedAssets[id]) {\n return null;\n }\n checkedAssets[id] = true;\n var cached = bundle.cache[id];\n if (!cached) {\n return true;\n }\n assetsToDispose.push([bundle, id]);\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n assetsToAccept.push([bundle, id]);\n return true;\n }\n return false;\n}\nfunction hmrDisposeQueue() {\n // Dispose all old assets.\n for (let i = 0; i < assetsToDispose.length; i++) {\n let id = assetsToDispose[i][1];\n if (!disposedAssets[id]) {\n hmrDispose(assetsToDispose[i][0], id);\n disposedAssets[id] = true;\n }\n }\n assetsToDispose = [];\n}\nfunction hmrDispose(bundle /*: ParcelRequire */, id /*: string */) {\n var cached = bundle.cache[id];\n bundle.hotData[id] = {};\n if (cached && cached.hot) {\n cached.hot.data = bundle.hotData[id];\n }\n if (cached && cached.hot && cached.hot._disposeCallbacks.length) {\n cached.hot._disposeCallbacks.forEach(function (cb) {\n cb(bundle.hotData[id]);\n });\n }\n delete bundle.cache[id];\n}\nfunction hmrAccept(bundle /*: ParcelRequire */, id /*: string */) {\n // Execute the module.\n bundle(id);\n\n // Run the accept callbacks in the new version of the module.\n var cached = bundle.cache[id];\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n let assetsToAlsoAccept = [];\n cached.hot._acceptCallbacks.forEach(function (cb) {\n let additionalAssets = cb(function () {\n return getParents(module.bundle.root, id);\n });\n if (Array.isArray(additionalAssets) && additionalAssets.length) {\n assetsToAlsoAccept.push(...additionalAssets);\n }\n });\n if (assetsToAlsoAccept.length) {\n let handled = assetsToAlsoAccept.every(function (a) {\n return hmrAcceptCheck(a[0], a[1]);\n });\n if (!handled) {\n return fullReload();\n }\n hmrDisposeQueue();\n }\n }\n}"],"names":[],"version":3,"file":"CodeCanvas-dolikansal.3464ddca.js.map","sourceRoot":"/__parcel_source_root/"} \ No newline at end of file diff --git a/dist/CodeCanvas-dolikansal.3a01df49.css b/dist/CodeCanvas-dolikansal.3a01df49.css new file mode 100644 index 0000000..e04ea5a --- /dev/null +++ b/dist/CodeCanvas-dolikansal.3a01df49.css @@ -0,0 +1,1463 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +.theme-toggle { + border: 2px solid var(--toggle-border); + cursor: pointer; + width: 40px; + height: 40px; + color: var(--toggle-icon); + background: none; + border-radius: 50%; + justify-content: center; + align-items: center; + font-size: 1.2rem; + transition: background .3s, transform .3s; + display: flex; + box-shadow: 0 2px 8px #0000001a; +} + +.theme-toggle:hover { + background: var(--toggle-hover); + transform: scale(1.1); +} + +.theme-toggle span { + transition: transform .3s, opacity .3s; +} + +:root { + --toggle-border: #ddd; + --toggle-icon: #333; + --toggle-hover: #f0f0f0; + --bg-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + --text-color: #333; + --bg-card: #fffffff2; + --text-card: #333; + --box-shadow: 0 8px 32px #1f26875e; + --bg-header: #fffffff2; + --header-border: #ffffff2e; + --card-bg: #fffffff2; + --card-border: #ffffff2e; + --card-shadow: 0 8px 32px #1f26875e; + --card-hover-shadow: 0 20px 40px #1f268780; + --nav-link-color: #333; + --nav-link-hover-bg: #667eea1a; + --project-title-color: #333; + --placeholder-bg: linear-gradient(135deg, #f5f7fa, #c3cfe2); + --placeholder-text: #666; +} + +.dark-theme { + --toggle-border: #888; + --toggle-icon: #f9f9f9; + --toggle-hover: #333; + --bg-gradient: linear-gradient(135deg, #1a1445 0%, #2c1d5c 100%); + --text-color: #e4e4f0; + --bg-card: #1e193ce6; + --text-card: #eee; + --box-shadow: 0 8px 32px #0006; + --bg-header: #1e193ce6; + --header-border: #ffffff0d; + --card-bg: #1e193ce6; + --card-border: #ffffff0d; + --card-shadow: 0 8px 24px #0006; + --card-hover-shadow: 0 20px 40px #0009; + --nav-link-color: #f1f1f1; + --nav-link-hover-bg: #ffffff1a; + --project-title-color: #fff; + --placeholder-bg: linear-gradient(135deg, #2a2d3e, #3b3f59); + --placeholder-text: #ddd; +} + +body { + background: var(--bg-gradient); + color: var(--text-color); + min-height: 100vh; + font-family: Inter, sans-serif; + transition: background .3s, color .3s; +} + +.container, .filter-container, .projects-container { + max-width: 1200px; + margin: 0 auto; + padding: 0 20px; +} + +@keyframes Fadeinup { + from { + opacity: 0; + transform: translateY(20px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.fade-in { + opacity: 0; + transform: translateY(20px); +} + +.fade-in.animate { + animation: .6s ease-out forwards Fadeinup; +} + +.header { + background: var(--bg-header); + backdrop-filter: blur(10px); + box-shadow: var(--box-shadow); + border-bottom: 1px solid var(--header-border); + z-index: 100; + padding: 1rem 0; + transition: background .3s, border-bottom .3s, box-shadow .3s; + position: sticky; + top: 0; +} + +.header-content { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 1rem; + display: flex; +} + +.logo { + -webkit-text-fill-color: transparent; + background: linear-gradient(135deg, #667eea, #764ba2) text; + font-size: 2rem; + font-weight: 700; +} + +.nav { + flex-wrap: wrap; + align-items: center; + gap: 2rem; + display: flex; +} + +.nav-link { + color: var(--nav-link-color); + border-radius: 8px; + padding: .5rem 1rem; + font-weight: 500; + text-decoration: none; + transition: all .3s; + position: relative; +} + +.nav-link:hover { + background: var(--nav-link-hover-bg); + transform: translateY(-2px); +} + +.btn-primary { + color: #fff; + cursor: pointer; + background: linear-gradient(135deg, #667eea, #764ba2); + border: none; + border-radius: 12px; + padding: .75rem 1.5rem; + font-weight: 600; + text-decoration: none; + transition: all .3s; + display: inline-block; +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 10px 25px #667eea4d; +} + +.hero { + text-align: center; + color: #fff; + padding: 4rem 0; +} + +.hero h1 { + text-shadow: 0 4px 8px #0000004d; + margin-bottom: 1rem; + font-size: 3.5rem; + font-weight: 700; +} + +.hero p { + opacity: .9; + max-width: 600px; + margin-bottom: 2rem; + margin-left: auto; + margin-right: auto; + font-size: 1.2rem; +} + +.filters { + background: inherit; + backdrop-filter: blur(14px); + border: 2px solid #ffffffb3; + border-radius: 16px; + margin-top: 60px; + padding: 25px; + box-shadow: 0 0 14px #fff9; +} + +.dark-theme .filters { + background: inherit; + backdrop-filter: blur(14px); + border: 2px solid #fffc; + border-radius: 16px; + margin-top: 60px; + padding: 25px; + box-shadow: 0 0 18px #ffffffbf; +} + +.filters h2 { + color: var(--text-color); + align-items: center; + gap: 10px; + margin-bottom: 20px; + font-size: 1.5rem; + font-weight: 700; + display: flex; +} + +.filter-controls { + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + align-items: center; + gap: 20px; + display: grid; +} + +.full-width { + grid-column: 1 / -1; +} + +.search-container input { + width: 100%; + color: var(--text-color); + background: #ffffff12; + border: 1.5px solid #ffffff40; + border-radius: 10px; + padding: 12px 42px 12px 38px; + font-size: 1rem; + transition: all .3s; +} + +.search-container input:focus { + border-color: var(--primary-color); + outline: none; + box-shadow: 0 0 6px #1e90ff80; +} + +.search-container .search-icon { + color: #aaa; + font-size: 1rem; + position: absolute; + left: 12px; +} + +.search-container .clear-search { + color: #aaa; + cursor: pointer; + background: none; + border: none; + font-size: 1rem; + transition: color .2s; + position: absolute; + right: 10px; +} + +.search-container .clear-search:hover { + color: var(--primary-color); +} + +.filter-group select { + width: 100%; + color: var(--text-color); + cursor: pointer; + background: #ffffff12; + border: 1.5px solid #ffffff40; + border-radius: 10px; + padding: 10px 14px; + font-size: 1rem; + transition: all .3s; +} + +.filter-group select:hover, .filter-group select:focus { + border-color: var(--primary-color); + outline: none; + box-shadow: 0 0 5px #1e90ff66; +} + +.checkbox-group { + align-items: center; + gap: 10px; + display: flex; +} + +.switch { + width: 46px; + height: 24px; + display: inline-block; + position: relative; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + cursor: pointer; + background: #fff; + border: 1.5px solid #0003; + border-radius: 34px; + transition: all .3s; + position: absolute; + inset: 0; +} + +.slider:before { + content: ""; + background: #fff; + border: 1px solid #0000004d; + border-radius: 50%; + width: 16px; + height: 16px; + transition: all .3s; + position: absolute; + bottom: 3px; + left: 3px; + box-shadow: 0 1px 2px #0003; +} + +.switch input:checked + .slider { + background: var(--primary-color); + border-color: var(--primary-color); + box-shadow: 0 0 6px var(--primary-color); +} + +.switch input:checked + .slider:before { + background: #fff; + border-color: #fff; + transform: translateX(20px); +} + +.switch:hover .slider { + border-color: #000; +} + +.switch-label { + color: var(--text-color); + font-size: .95rem; + font-weight: 500; +} + +.filter-buttons { + gap: 12px; + display: flex; +} + +.filter-buttons button { + cursor: pointer; + color: var(--text-color); + background: none; + border: 1.5px solid #fff9; + border-radius: 8px; + padding: 10px 18px; + font-size: .95rem; + font-weight: 600; + transition: all .3s; +} + +.filter-buttons button:hover { + background: #0000000d; + border-color: #000; + transform: translateY(-1px); +} + +.tag-filters { + flex-wrap: wrap; + gap: 10px; + margin-top: 5px; + display: flex; +} + +.tag-filters .tag { + color: var(--text-color); + cursor: pointer; + background: #ffffff1a; + border-radius: 8px; + padding: 6px 12px; + font-size: .9rem; + font-weight: 500; + transition: all .3s; +} + +.tag-filters .tag:hover { + background: var(--primary-color); + color: #fff; + transform: scale(1.05); +} + +.search-group { + flex: 1; + min-width: 300px; +} + +.search-container { + align-items: center; + display: flex; + position: relative; +} + +.search-icon { + color: #666; + z-index: 1; + position: absolute; + left: 12px; +} + +.search-container input[type="text"] { + background: var(--card-bg); + width: 100%; + color: var(--text-card); + border: 2px solid #ddd; + border-radius: 8px; + padding: 12px 40px; + font-size: 1rem; + transition: border-color .3s, box-shadow .3s; +} + +.search-container input[type="text"]:focus { + border-color: #667eea; + outline: none; + box-shadow: 0 0 0 3px #667eea1a; +} + +.clear-search { + color: #666; + cursor: pointer; + background: none; + border: none; + border-radius: 50%; + justify-content: center; + align-items: center; + padding: 4px; + transition: background-color .3s, color .3s; + display: flex; + position: absolute; + right: 8px; +} + +.clear-search:hover { + color: #333; + background-color: #f0f0f0; +} + +.dark-theme .search-container input[type="text"] { + background: var(--card-bg); + color: var(--text-card); + border-color: #444; +} + +.dark-theme .search-container input[type="text"]:focus { + border-color: #667eea; +} + +.dark-theme .clear-search:hover { + color: #fff; + background-color: #444; +} + +.btn-secondary { + color: #667eea; + cursor: pointer; + background: #fff; + border: 2px solid #667eea; + border-radius: 12px; + padding: .75rem 1.5rem; + font-weight: 600; + transition: all .3s; +} + +.btn-secondary:hover { + color: #fff; + background: #667eea; + transform: translateY(-2px); +} + +.tag-filters { + flex-wrap: wrap; + gap: 8px; + margin: 10px 0; + display: flex; +} + +.tag-filter-btn { + cursor: pointer; + background: #f0f0f0; + border: 1px solid #ccc; + border-radius: 20px; + padding: 6px 12px; + transition: background .3s; +} + +.tag-filter-btn.active { + color: #fff; + background: #007bff; + border-color: #007bff; +} + +.projects-section { + padding: 2rem 0; +} + +.section-title { + color: #fff; + text-align: center; + text-shadow: 0 2px 4px #0000004d; + margin-bottom: 2rem; + font-size: 2rem; + font-weight: 700; +} + +.projects-grid { + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: 2rem; + margin-bottom: 3rem; + display: grid; +} + +.project-card { + background: var(--card-bg); + backdrop-filter: blur(10px); + box-shadow: var(--card-shadow); + border: 1px solid var(--card-border); + border-radius: 16px; + flex-direction: column; + padding: 1.5rem; + transition: all .3s; + display: flex; + position: relative; +} + +.project-card:hover { + box-shadow: var(--card-hover-shadow); + transform: translateY(-5px); +} + +.project-card.top-ranked { + border: 2px solid gold; + box-shadow: 0 8px 32px #ffd70033; +} + +.rank-badge { + color: #333; + z-index: 10; + background: linear-gradient(135deg, gold, #ffed4e); + border: 2px solid #fff; + border-radius: 50%; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + font-size: .9rem; + font-weight: bold; + display: flex; + position: absolute; + top: -10px; + right: -10px; + box-shadow: 0 4px 12px #ffd7004d; +} + +.project-image { + object-fit: cover; + border-radius: 12px; + width: 100%; + height: 200px; + margin-bottom: 1rem; +} + +.project-placeholder { + background: var(--placeholder-bg); + width: 100%; + height: 200px; + color: var(--placeholder-text); + border-radius: 12px; + justify-content: center; + align-items: center; + margin-bottom: 1rem; + font-weight: 500; + display: flex; +} + +.project-header { + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + display: flex; +} + +.project-title { + color: var(--project-title-color); + font-size: 1.25rem; + font-weight: 700; +} + +.repo-link { + color: #667eea; + font-size: 1.5rem; + transition: all .3s; +} + +.repo-link:hover { + color: #764ba2; + transform: scale(1.1); +} + +.difficulty-badge { + border-radius: 20px; + margin-bottom: 1rem; + padding: .25rem .75rem; + font-size: .875rem; + font-weight: 600; + display: inline-block; +} + +.difficulty-beginner { + color: #22c55e; + background: #22c55e1a; +} + +.difficulty-intermediate { + color: #fbbf24; + background: #fbbf241a; +} + +.difficulty-advanced { + color: #ef4444; + background: #ef44441a; +} + +.project-description { + color: #666; + flex-grow: 1; + margin-bottom: 1rem; + line-height: 1.6; +} + +.project-meta { + color: #888; + align-items: center; + gap: .5rem; + margin-bottom: 1rem; + font-size: .875rem; + display: flex; +} + +.meta-icon { + color: #667eea; +} + +.project-tags { + flex-wrap: wrap; + gap: 6px; + margin-top: .5rem; + margin-bottom: 5px; + display: flex; +} + +.tag-badge { + color: #333; + white-space: nowrap; + background-color: #e0e0e0; + border-radius: 12px; + padding: 4px 8px; + font-size: 12px; + display: inline-block; +} + +body.dark-theme .tag-badge { + color: #fff; + background-color: #667eea33; + border: 1px solid #667eea66; +} + +.upvote-section { + border-top: 1px solid #eee; + justify-content: space-between; + align-items: center; + margin-top: auto; + padding-top: 1rem; + display: flex; +} + +.upvote-btn { + color: #fff; + cursor: pointer; + background: linear-gradient(135deg, #667eea, #764ba2); + border: none; + border-radius: 8px; + align-items: center; + gap: .5rem; + padding: .5rem 1rem; + font-weight: 600; + transition: all .3s; + display: flex; + position: relative; +} + +.upvote-btn:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px #667eea4d; +} + +.upvote-btn.voted { + cursor: default; + background: linear-gradient(135deg, #28a745, #20c997); +} + +.upvote-btn.voted:hover { + transform: none; + box-shadow: 0 2px 8px #28a7454d; +} + +.upvote-btn:disabled { + opacity: .7; + cursor: not-allowed; +} + +.upvote-btn:disabled:hover { + box-shadow: none; + transform: none; +} + +.vote-notification { + color: #333; + z-index: 1000; + opacity: 0; + background: #fff; + border-left: 4px solid #007bff; + border-radius: 8px; + align-items: center; + gap: .5rem; + padding: 1rem 1.5rem; + font-weight: 500; + transition: all .3s; + display: flex; + position: fixed; + top: 20px; + right: 20px; + transform: translateX(400px); + box-shadow: 0 4px 12px #00000026; +} + +.vote-notification.success { + color: #155724; + border-left-color: #28a745; +} + +.vote-notification.success i { + color: #28a745; +} + +.vote-notification.error { + color: #721c24; + border-left-color: #dc3545; +} + +.vote-notification.error i { + color: #dc3545; +} + +.vote-notification.show { + opacity: 1; + transform: translateX(0); +} + +.dark-theme .vote-notification { + background: var(--card-bg); + color: var(--text-color); + box-shadow: 0 4px 12px #0000004d; +} + +.reviews-section { + cursor: pointer; + padding: 60px 0; +} + +.review-section-title { + color: #fff; + text-align: center; + text-shadow: 0 2px 4px #0000004d; + margin: 5rem; + font-size: 2rem; + font-weight: 700; +} + +.swiper { + cursor: auto; + width: 100%; + padding: 2rem 0; + position: relative; +} + +.swiper-wrapper { + cursor: auto; + align-items: center; +} + +.swiper-slide { + cursor: auto; + justify-content: center; + align-items: center; + display: flex; +} + +.testimonial { + background-color: var(--card-bg, #fff); + border: 2px solid #000; + border-radius: 16px; + align-items: center; + gap: 1.2rem; + width: 100%; + max-width: 600px; + min-height: 160px; + margin: 0 auto; + padding: 2.3rem 3rem; + transition: transform .3s, box-shadow .3s; + display: flex; + box-shadow: 0 4px 12px #00000014; +} + +.avatar { + object-fit: cover; + border: 3px solid var(--accent-color, #6c63ff); + border-radius: 50%; + flex-shrink: 0; + width: 150px; + height: 150px; +} + +.testimonial-content { + flex-direction: column; + flex: 1; + justify-content: center; + display: flex; +} + +.review-name { + color: var(--text-primary, #111); + margin-bottom: .25rem; + font-size: 1.45rem; + font-weight: 900; +} + +.review-role { + color: var(--text-muted, #777); + margin-bottom: .4rem; + font-size: 1.15rem; + font-style: italic; +} + +.testimonial-text { + color: var(--text-secondary, #333); + font-size: 1rem; + line-height: 1.5; +} + +.swiper-button-prev span, .swiper-button-next span { + color: #000; + z-index: 10; + cursor: pointer; + background-color: #fff; + border: 2px solid #000; + border-radius: 9px; + justify-content: center; + align-items: center; + width: 30px; + height: 10px; + padding: 20px; + font-size: 1.4rem; + font-weight: 900; + transition: all .3s; + display: flex; + top: 50%; + transform: translateY(-50%); +} + +.swiper-button-prev:after, .swiper-button-next:after { + content: ""; + display: none; +} + +.swiper-button-prev span { + margin-left: 25rem; + left: 20px; +} + +.swiper-button-next span { + margin-right: 25rem; + right: 20px; +} + +.dark-theme .reviews-section .testimonial { + background-color: #1e193ce6; + border: 2px solid #fff; + box-shadow: 0 8px 24px #0006; +} + +.dark-theme .reviews-section .testimonial:hover { + box-shadow: 0 20px 40px #0009; +} + +.dark-theme .reviews-section .review-name, .dark-theme .reviews-section .testimonial-text { + color: var(--text-card, #eee); +} + +.dark-theme .reviews-section .review-role { + color: var(--text-muted, #aaa); +} + +.dark-theme .swiper-button-prev, .dark-theme .swiper-button-next { + color: #fff; + border-color: #fff; +} + +@media (width <= 1024px) { + .review-section-title { + margin: 4rem 1rem; + font-size: 1.8rem; + } + + .testimonial { + flex-direction: row; + gap: 1rem; + max-width: 90%; + padding: 1.5rem; + } + + .avatar { + width: 120px; + height: 120px; + } + + .review-name { + font-size: 1.2rem; + } + + .review-role, .testimonial-text { + font-size: .95rem; + } + + .swiper-button-prev span, .swiper-button-next span { + width: 45px; + height: 45px; + padding: 15px; + } +} + +@media (width <= 768px) { + .review-section-title { + margin: 3rem 1rem 2rem; + font-size: 1.6rem; + } + + .testimonial { + text-align: center; + flex-direction: column; + align-items: center; + gap: 1rem; + max-width: 95%; + padding: 1.2rem; + } + + .avatar { + width: 100px; + height: 100px; + } + + .review-name { + font-size: 1.1rem; + } + + .review-role, .testimonial-text { + font-size: .9rem; + } + + .swiper-button-prev span, .swiper-button-next span { + width: 40px; + height: 40px; + margin: 0; + padding: 12px; + font-size: 1.2rem; + } + + .swiper-button-prev span { + left: 10px; + } + + .swiper-button-next span { + right: 10px; + } +} + +@media (width <= 480px) { + .review-section-title { + margin: 2rem 0 1.5rem; + font-size: 1.4rem; + } + + .testimonial { + border-radius: 12px; + padding: 1rem; + } + + .avatar { + width: 80px; + height: 80px; + } + + .review-name { + font-size: 1rem; + } + + .review-role, .testimonial-text { + font-size: .85rem; + } + + .swiper-button-prev span, .swiper-button-next span { + width: 36px; + height: 36px; + padding: 10px; + font-size: 1rem; + } + + .swiper-button-prev span { + margin-left: .5rem; + } + + .swiper-button-next span { + margin-right: .5rem; + } +} + +.footer { + color: #fff; + text-align: center; + background: #000c; + margin-top: 3rem; + padding: 2rem 0; +} + +@media (width <= 768px) { + .hero h1 { + font-size: 2.5rem; + } + + .nav { + gap: 1rem; + } + + .filter-controls { + flex-direction: column; + align-items: stretch; + } + + .search-group { + min-width: 100%; + } + + .projects-grid { + grid-template-columns: 1fr; + } + + .header-content { + text-align: center; + flex-direction: column; + } +} + +.loading { + color: #fff; + justify-content: center; + align-items: center; + height: 200px; + display: flex; +} + +.spinner { + border: 4px solid #ffffff4d; + border-top-color: #fff; + border-radius: 50%; + width: 40px; + height: 40px; + animation: 1s linear infinite spin; +} + +@keyframes spin { + 0% { + transform: rotate(0); + } + + 100% { + transform: rotate(360deg); + } +} + +.empty-state { + text-align: center; + color: #fff; + padding: 3rem 0; +} + +.empty-state i { + opacity: .5; + margin-bottom: 1rem; + font-size: 4rem; +} + +.empty-state h3 { + margin-bottom: .5rem; + font-size: 1.5rem; +} + +.empty-state p { + opacity: .8; +} + +@keyframes bounce { + 0%, 100% { + transform: translateY(0); + } + + 50% { + transform: translateY(-5px); + } +} + +#contact-container { + backdrop-filter: blur(2px); + background-color: #ffffff27; + border: 1px solid #ffffff4a; + border-radius: 30px; + padding: 30px; +} + +#email { + box-sizing: border-box; + appearance: none; + border: none; + border-radius: 15px; + width: 100%; + padding: 18px 18px 18px 50px; + font-size: 1.2rem; + line-height: 1.2; + width: 100% !important; +} + +#email, #message, #name, #lastname { + box-shadow: 10px 10px 40px #ffffff41, inset -10px -10px 40px #00000026; +} + +#email:focus, #message:focus, #name:focus, #lastname:focus { + outline: none; +} + +textarea { + resize: vertical; +} + +#submit { + border-radius: 30px; + align-self: center; + width: 50%; + transition: all .3s; + box-shadow: 5px 5px 30px #ffffff41, inset -5px -5px 30px #00000026; +} + +.flex-contact { + gap: 1vw; + width: 100%; + display: flex; +} + +.fullname { + width: 50%; + position: relative; +} + +#message-overlay { + background: var(--bg-gradient); + z-index: 9999; + color: #fff; + text-align: center; + opacity: 0; + pointer-events: none; + justify-content: center; + align-items: center; + width: 100vw; + height: 100vh; + font-size: 2rem; + font-weight: bold; + transition: opacity .4s; + display: flex; + position: fixed; + top: 0; + left: 0; +} + +#message-overlay .overlay-content { + flex-direction: column; + align-items: center; + animation: .5s ease-out popIn; + display: flex; +} + +#message-overlay .overlay-content i { + color: #fff; + margin-bottom: 20px; + font-size: 4rem; +} + +@keyframes popIn { + from { + opacity: 0; + transform: scale(.8); + } + + to { + opacity: 1; + transform: scale(1); + } +} + +@keyframes softPulse { + 0% { + opacity: .5; + transform: scale(1); + } + + 50% { + opacity: 1; + transform: scale(1.05); + } + + 100% { + opacity: .5; + transform: scale(1); + } +} + +.fas-animation { + animation: 3s ease-in-out infinite softPulse; +} + +.fill-btn { + color: #fff; + cursor: pointer; + z-index: 1; + background-color: indigo; + border: 2px solid #fff; + padding: 14px 28px; + font-size: 1.2rem; + font-weight: bold; + display: inline-block; + position: relative; + overflow: hidden; +} + +.fill-btn:before { + content: ""; + transform-origin: 0; + z-index: -1; + background-color: #fff; + width: 100%; + height: 100%; + transition: transform .4s ease-out; + position: absolute; + top: 0; + left: 0; + transform: scaleX(0); +} + +.fill-btn:hover:before { + transform: scaleX(1); +} + +.fill-btn:hover { + color: indigo; +} + +body.dark-theme .fill-btn { + color: #fff; + cursor: pointer; + z-index: 1; + background-color: #1a1445; + border: 2px solid #fff; + padding: 14px 28px; + font-size: 1.2rem; + font-weight: bold; + display: inline-block; + position: relative; + overflow: hidden; +} + +body.dark-theme .fill-btn:before { + content: ""; + transform-origin: 0; + z-index: -1; + background-color: #fff; + width: 100%; + height: 100%; + transition: transform .4s ease-out; + position: absolute; + top: 0; + left: 0; + transform: scaleX(0); +} + +body.dark-theme .fill-btn:hover:before { + transform: scaleX(1); +} + +body.dark-theme .fill-btn:hover { + color: #000; +} + +@media only screen and (width <= 1020px) { + #contact-container { + width: 95%; + } + + .flex-contact { + flex-direction: column; + gap: 3vh; + width: 100%; + } + + .fullname { + width: 100%; + } + + #contact-container { + padding: 3vw; + } + + #submit { + width: 100%; + } +} + +.dark-theme .filters, .dark-theme .project-card { + -webkit-backdrop-filter: blur(12px); + color: #f0f4ff; + background: #12193cbf; + border: 1px solid #ffffff1a; + border-radius: 16px; + transition: all .3s; + box-shadow: 0 0 8px #2c42ff66, 0 0 16px #2c42ff4d; +} + +body.dark-theme h1, body.dark-theme .filter-container h2, body.dark-theme h3, body.dark-theme h4, body.dark-theme h5, body.dark-theme h6, body.dark-theme p, body.dark-theme span, body.dark-theme a, body.dark-theme li, body.dark-theme label, body.dark-theme input, body.dark-theme textarea, body.dark-theme button, body.dark-theme .projects-container, body.dark-theme .filter-container { + border-color: #fff; +} + +body.dark-theme input, body.dark-theme textarea { + background-color: #1f1f1f; +} + +body.dark-theme button { + background-color: #667eea4d; + border: 1px solid #667eea4d; + color: #fff !important; +} + +body.dark-theme button:hover { + cursor: pointer; + background-color: #667eea80; +} + +#scrollToTopBtn { + z-index: 999; + color: #fff; + cursor: pointer; + background-color: #667eea; + border: none; + border-radius: 50%; + outline: none; + padding: .75rem 1rem; + font-size: 1.25rem; + transition: background .3s, transform .3s; + display: none; + position: fixed; + bottom: 2rem; + right: 2rem; + box-shadow: 0 4px 10px #0000004d; +} + +#scrollToTopBtn:hover { + background-color: #5a67d8; + transform: scale(1.1); +} + +.footer-flex-container { + justify-content: space-evenly; + align-items: flex-start; + padding: 30px; + display: flex; +} + +.socials { + flex-direction: row; + justify-content: center; + align-items: center; + display: flex; +} + +.socials li, .quick-links li { + list-style-type: none; +} + +.socials li a { + color: #fff; + padding: 10px; + font-size: larger; +} + +.footer-logo { + background: #fff text; + margin: 10px; + font-size: 2rem; + font-weight: 700; +} + +.quick-links li a { + color: #fff; + text-decoration: none; +} + +.quick-links li a:hover, .socials li a:hover { + color: #764ba2; +} + +.quick-links li { + padding: 3px; +} + +.quick-links ul { + flex-wrap: wrap; + align-items: center; + gap: 50px; + font-size: 14px; + display: flex; +} +/*# sourceMappingURL=CodeCanvas-dolikansal.3a01df49.css.map */ diff --git a/dist/CodeCanvas-dolikansal.3a01df49.css.map b/dist/CodeCanvas-dolikansal.3a01df49.css.map new file mode 100644 index 0000000..b3c44f9 --- /dev/null +++ b/dist/CodeCanvas-dolikansal.3a01df49.css.map @@ -0,0 +1 @@ +{"mappings":"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","sources":["style.css"],"sourcesContent":["\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n /*dark mode toggle*/\n .theme-toggle {\n background: transparent;\n border: 2px solid var(--toggle-border);\n border-radius: 50%;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: background 0.3s ease, transform 0.3s ease;\n font-size: 1.2rem;\n color: var(--toggle-icon);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .theme-toggle:hover {\n background: var(--toggle-hover);\n transform: scale(1.1);\n }\n\n .theme-toggle span {\n transition: transform 0.3s ease, opacity 0.3s ease;\n }\n\n :root {\n --toggle-border: #ddd;\n --toggle-icon: #333;\n --toggle-hover: #f0f0f0;\n --bg-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n --text-color: #333;\n --bg-card: rgba(255, 255, 255, 0.95);\n --text-card: #333;\n --box-shadow: 0 8px 32px rgba(31, 38, 135, 0.37);\n --bg-header: rgba(255, 255, 255, 0.95);\n --header-border: rgba(255, 255, 255, 0.18);\n --card-bg: rgba(255, 255, 255, 0.95);\n --card-border: rgba(255, 255, 255, 0.18);\n --card-shadow: 0 8px 32px rgba(31, 38, 135, 0.37);\n --card-hover-shadow: 0 20px 40px rgba(31, 38, 135, 0.5);\n --nav-link-color: #333; \n --nav-link-hover-bg: rgba(102, 126, 234, 0.1);\n --project-title-color: #333;\n --placeholder-bg: linear-gradient(135deg, #f5f7fa, #c3cfe2);\n --placeholder-text: #666;\n }\n\n .dark-theme {\n --toggle-border: #888;\n --toggle-icon: #f9f9f9;\n --toggle-hover: #333;\n --bg-gradient: linear-gradient(135deg, #1a1445 0%, #2c1d5c 100%);\n --text-color: #e4e4f0;\n --bg-card: rgba(30, 25, 60, 0.9); \n --text-card: #eee;\n --box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);\n --bg-header: rgba(30, 25, 60, 0.9); \n --header-border: rgba(255, 255, 255, 0.05);\n --card-bg: rgba(30, 25, 60, 0.9);\n --card-border: rgba(255, 255, 255, 0.05);\n --card-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n --card-hover-shadow: 0 20px 40px rgba(0, 0, 0, 0.6);\n --nav-link-color: #f1f1f1;\n --nav-link-hover-bg: rgba(255, 255, 255, 0.1);\n --project-title-color: #ffffff;\n --placeholder-bg: linear-gradient(135deg, #2a2d3e, #3b3f59); /* deep bluish-purple tone */\n --placeholder-text: #ddd;\n }\n\n body {\n font-family: 'Inter', sans-serif;\n background: var(--bg-gradient);\n color: var(--text-color);\n min-height: 100vh;\n transition: background 0.3s ease, color 0.3s ease;\n }\n\n\n.container,\n.filter-container,\n.projects-container {\n\n max-width: 1200px;\n margin: 0 auto;\n padding: 0 20px;\n}\n@keyframes Fadeinup {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n.fade-in {\n opacity: 0; /* βœ… start hidden */\n transform: translateY(20px);\n}\n\n.fade-in.animate {\n animation: Fadeinup 0.6s ease-out forwards;\n}\n\n /* Header styles */\n .header {\n background: var(--bg-header);\n backdrop-filter: blur(10px);\n box-shadow: var(--box-shadow);\n border-bottom: 1px solid var(--header-border);\n padding: 1rem 0;\n position: sticky;\n top: 0;\n z-index: 100;\n transition: background 0.3s, border-bottom 0.3s, box-shadow 0.3s;\n }\n\n\n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 1rem;\n }\n\n .logo {\n font-size: 2rem;\n font-weight: 700;\n background: linear-gradient(135deg, #667eea, #764ba2);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n\n .nav {\n display: flex;\n gap: 2rem;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .nav-link {\n color: var(--nav-link-color);\n text-decoration: none;\n font-weight: 500;\n padding: 0.5rem 1rem;\n border-radius: 8px;\n transition: all 0.3s ease;\n position: relative;\n }\n\n .nav-link:hover {\n background: var(--nav-link-hover-bg);\n transform: translateY(-2px);\n }\n\n\n .btn-primary {\n background: linear-gradient(135deg, #667eea, #764ba2);\n color: white;\n padding: 0.75rem 1.5rem;\n border: none;\n border-radius: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s ease;\n text-decoration: none;\n display: inline-block;\n }\n\n .btn-primary:hover {\n transform: translateY(-2px);\n box-shadow: 0 10px 25px rgba(102, 126, 234, 0.3);\n }\n\n /* Hero section */\n .hero {\n text-align: center;\n padding: 4rem 0;\n color: white;\n }\n\n .hero h1 {\n font-size: 3.5rem;\n font-weight: 700;\n margin-bottom: 1rem;\n text-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n\n .hero p {\n font-size: 1.2rem;\n margin-bottom: 2rem;\n opacity: 0.9;\n max-width: 600px;\n margin-left: auto;\n margin-right: auto;\n }\n/* Light mode filters section */\n.filters {\n background: inherit; /* same as page background */\n backdrop-filter: blur(14px);\n border-radius: 16px;\n padding: 25px;\n margin-top: 60px;\n border: 2px solid rgba(255, 255, 255, 0.7); /* glowing white border */\n box-shadow: 0 0 14px rgba(255, 255, 255, 0.6); /* white glow */\n}\n\n/* Dark mode filters section */\n.dark-theme .filters {\n background: inherit;\n backdrop-filter: blur(14px);\n border-radius: 16px;\n padding: 25px;\n margin-top: 60px;\n border: 2px solid rgba(255, 255, 255, 0.8);\n box-shadow: 0 0 18px rgba(255, 255, 255, 0.75); /* stronger white glow */\n}\n\n\n\n.filters h2 {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 20px;\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--text-color);\n}\n\n/* Controls grid */\n.filter-controls {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 20px;\n align-items: center;\n}\n\n.full-width {\n grid-column: 1 / -1;\n}\n\n/* Search */\n.search-container {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-container input {\n width: 100%;\n padding: 12px 42px 12px 38px;\n border: 1.5px solid rgba(255, 255, 255, 0.25);\n border-radius: 10px;\n background: rgba(255, 255, 255, 0.07);\n color: var(--text-color);\n font-size: 1rem;\n transition: all 0.3s ease;\n}\n\n.search-container input:focus {\n border-color: var(--primary-color);\n box-shadow: 0 0 6px rgba(30, 144, 255, 0.5);\n outline: none;\n}\n\n.search-container .search-icon {\n position: absolute;\n left: 12px;\n color: #aaa;\n font-size: 1rem;\n}\n\n.search-container .clear-search {\n position: absolute;\n right: 10px;\n background: transparent;\n border: none;\n font-size: 1rem;\n color: #aaa;\n cursor: pointer;\n transition: color 0.2s ease;\n}\n\n.search-container .clear-search:hover {\n color: var(--primary-color);\n}\n\n/* Dropdowns */\n.filter-group select {\n width: 100%;\n padding: 10px 14px;\n border-radius: 10px;\n border: 1.5px solid rgba(255, 255, 255, 0.25);\n background: rgba(255, 255, 255, 0.07);\n color: var(--text-color);\n font-size: 1rem;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.filter-group select:hover,\n.filter-group select:focus {\n border-color: var(--primary-color);\n box-shadow: 0 0 5px rgba(30, 144, 255, 0.4);\n outline: none;\n}\n\n/* Checkbox */\n/* Toggle Switch for \"Has Open Issues\" */\n.checkbox-group {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.switch {\n position: relative;\n display: inline-block;\n width: 46px;\n height: 24px;\n}\n\n.switch input {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n/* Slider (track) */\n.slider {\n position: absolute;\n cursor: pointer;\n top: 0; left: 0;\n right: 0; bottom: 0;\n background: #fff; /* White when OFF */\n border: 1.5px solid rgba(0, 0, 0, 0.2); \n border-radius: 34px;\n transition: all 0.3s ease;\n}\n\n/* The knob */\n.slider::before {\n position: absolute;\n content: \"\";\n height: 16px; width: 16px;\n left: 3px; bottom: 3px;\n background: #fff;\n border-radius: 50%;\n transition: 0.3s ease;\n border: 1px solid rgba(0, 0, 0, 0.3);\n box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Checked state (ON) */\n.switch input:checked + .slider {\n background: var(--primary-color);\n border-color: var(--primary-color);\n box-shadow: 0 0 6px var(--primary-color); /* glowing border */\n}\n\n.switch input:checked + .slider::before {\n transform: translateX(20px);\n background: #fff;\n border-color: white;\n}\n\n/* Hover effect */\n.switch:hover .slider {\n border-color: #000;\n}\n\n.switch-label {\n font-size: 0.95rem;\n color: var(--text-color);\n font-weight: 500;\n}\n\n\n/* Buttons */\n.filter-buttons {\n display: flex;\n gap: 12px;\n}\n\n.filter-buttons button {\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 0.95rem;\n font-weight: 600;\n cursor: pointer;\n background: transparent;\n color: var(--text-color);\n border: 1.5px solid rgba(255, 255, 255, 0.6);\n transition: all 0.3s ease;\n}\n\n.filter-buttons button:hover {\n border-color: #000;\n background: rgba(0, 0, 0, 0.05);\n transform: translateY(-1px);\n}\n\n/* Tag Filters */\n.tag-filters {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n margin-top: 5px;\n}\n\n.tag-filters .tag {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 8px;\n padding: 6px 12px;\n font-size: 0.9rem;\n font-weight: 500;\n color: var(--text-color);\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.tag-filters .tag:hover {\n background: var(--primary-color);\n color: #fff;\n transform: scale(1.05);\n}\n\n\n /* Search styles */\n .search-group {\n flex: 1;\n min-width: 300px;\n }\n\n .search-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .search-icon {\n position: absolute;\n left: 12px;\n color: #666;\n z-index: 1;\n }\n\n .search-container input[type=\"text\"] {\n width: 100%;\n padding: 12px 40px 12px 40px;\n border: 2px solid #ddd;\n border-radius: 8px;\n font-size: 1rem;\n background: var(--card-bg);\n color: var(--text-card);\n transition: border-color 0.3s ease, box-shadow 0.3s ease;\n }\n\n .search-container input[type=\"text\"]:focus {\n outline: none;\n border-color: #667eea;\n box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: #666;\n cursor: pointer;\n padding: 4px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.3s ease, color 0.3s ease;\n }\n\n .clear-search:hover {\n background-color: #f0f0f0;\n color: #333;\n }\n\n .dark-theme .search-container input[type=\"text\"] {\n border-color: #444;\n background: var(--card-bg);\n color: var(--text-card);\n }\n\n .dark-theme .search-container input[type=\"text\"]:focus {\n border-color: #667eea;\n }\n\n .dark-theme .clear-search:hover {\n background-color: #444;\n color: #fff;\n }\n\n .btn-secondary {\n background: white;\n color: #667eea;\n border: 2px solid #667eea;\n padding: 0.75rem 1.5rem;\n border-radius: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s ease;\n }\n\n .btn-secondary:hover {\n background: #667eea;\n color: white;\n transform: translateY(-2px);\n }\n\n .tag-filters {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin: 10px 0;\n }\n\n .tag-filter-btn {\n padding: 6px 12px;\n background: #f0f0f0;\n border: 1px solid #ccc;\n border-radius: 20px;\n cursor: pointer;\n transition: background 0.3s;\n }\n\n .tag-filter-btn.active {\n background: #007bff;\n color: #fff;\n border-color: #007bff;\n }\n\n /* Projects section */\n .projects-section {\n padding: 2rem 0;\n }\n\n .section-title {\n font-size: 2rem;\n font-weight: 700;\n color: white;\n margin-bottom: 2rem;\n text-align: center;\n text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n }\n\n .projects-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 2rem;\n margin-bottom: 3rem;\n }\n\n .project-card {\n background: var(--card-bg);\n backdrop-filter: blur(10px);\n border-radius: 16px;\n padding: 1.5rem;\n box-shadow: var(--card-shadow);\n border: 1px solid var(--card-border);\n transition: all 0.3s ease;\n display: flex;\n flex-direction: column;\n position: relative;\n }\n\n .project-card:hover {\n transform: translateY(-5px);\n box-shadow: var(--card-hover-shadow);\n }\n\n .project-card.top-ranked {\n border: 2px solid #ffd700;\n box-shadow: 0 8px 32px rgba(255, 215, 0, 0.2);\n }\n\n .rank-badge {\n position: absolute;\n top: -10px;\n right: -10px;\n background: linear-gradient(135deg, #ffd700, #ffed4e);\n color: #333;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: bold;\n font-size: 0.9rem;\n z-index: 10;\n box-shadow: 0 4px 12px rgba(255, 215, 0, 0.3);\n border: 2px solid white;\n }\n\n\n .project-image {\n width: 100%;\n height: 200px;\n object-fit: cover;\n border-radius: 12px;\n margin-bottom: 1rem;\n }\n\n .project-placeholder {\n width: 100%;\n height: 200px;\n background: var(--placeholder-bg);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 1rem;\n color: var(--placeholder-text);\n font-weight: 500;\n }\n\n\n .project-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1rem;\n }\n\n .project-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--project-title-color);\n }\n\n\n .repo-link {\n color: #667eea;\n font-size: 1.5rem;\n transition: all 0.3s ease;\n }\n\n .repo-link:hover {\n color: #764ba2;\n transform: scale(1.1);\n }\n\n .difficulty-badge {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 20px;\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 1rem;\n }\n\n .difficulty-beginner {\n background: rgba(34, 197, 94, 0.1);\n color: #22c55e;\n }\n\n .difficulty-intermediate {\n background: rgba(251, 191, 36, 0.1);\n color: #fbbf24;\n }\n\n .difficulty-advanced {\n background: rgba(239, 68, 68, 0.1);\n color: #ef4444;\n }\n\n .project-description {\n color: #666;\n margin-bottom: 1rem;\n line-height: 1.6;\n flex-grow: 1;\n }\n\n .project-meta {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n color: #888;\n margin-bottom: 1rem;\n }\n\n .meta-icon {\n color: #667eea;\n }\n\n .project-tags {\n margin-top: 0.5rem;\n margin-bottom: 5px;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .tag-badge {\n background-color: #e0e0e0;\n color: #333;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n display: inline-block;\n white-space: nowrap;\n }\n/* Dark mode fix for tags */\nbody.dark-theme .tag-badge {\n background-color: rgba(102, 126, 234, 0.2); /* subtle purple tint */\n color: #ffffff; /* bright white text */\n border: 1px solid rgba(102, 126, 234, 0.4); /* soft border */\n}\n\n\n .upvote-section {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: auto;\n padding-top: 1rem;\n border-top: 1px solid #eee;\n }\n\n .upvote-btn {\n background: linear-gradient(135deg, #667eea, #764ba2);\n color: white;\n border: none;\n padding: 0.5rem 1rem;\n border-radius: 8px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n transition: all 0.3s ease;\n position: relative;\n }\n\n .upvote-btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);\n }\n\n .upvote-btn.voted {\n background: linear-gradient(135deg, #28a745, #20c997);\n cursor: default;\n }\n\n .upvote-btn.voted:hover {\n transform: none;\n box-shadow: 0 2px 8px rgba(40, 167, 69, 0.3);\n }\n\n .upvote-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n .upvote-btn:disabled:hover {\n transform: none;\n box-shadow: none;\n }\n\n /* Notification styles */\n .vote-notification {\n position: fixed;\n top: 20px;\n right: 20px;\n background: white;\n color: #333;\n padding: 1rem 1.5rem;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n z-index: 1000;\n transform: translateX(400px);\n opacity: 0;\n transition: all 0.3s ease;\n font-weight: 500;\n border-left: 4px solid #007bff;\n }\n\n .vote-notification.success {\n border-left-color: #28a745;\n color: #155724;\n }\n\n .vote-notification.success i {\n color: #28a745;\n }\n\n .vote-notification.error {\n border-left-color: #dc3545;\n color: #721c24;\n }\n\n .vote-notification.error i {\n color: #dc3545;\n }\n\n .vote-notification.show {\n transform: translateX(0);\n opacity: 1;\n }\n\n /* Dark theme notification styles */\n .dark-theme .vote-notification {\n background: var(--card-bg);\n color: var(--text-color);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n\n\n \n /* REVIEW SECTION */\n .reviews-section {\n padding: 60px 0;\n cursor: pointer;\n }\n \n .review-section-title {\n font-size: 2rem;\n font-weight: 700;\n color: white;\n margin: 5rem;\n text-align: center;\n text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n }\n \n \n .swiper {\n width: 100%;\n padding: 2rem 0;\n position: relative;\n cursor:auto;\n }\n \n .swiper-wrapper {\n align-items: center;\n cursor:auto;\n }\n \n \n .swiper-slide {\n display: flex;\n justify-content: center;\n align-items: center;\n cursor:auto;\n\n }\n \n \n .testimonial {\n display: flex;\n align-items: center;\n gap: 1.2rem;\n background-color: var(--card-bg, #fff);\n padding: 2.3rem 3rem;\n border-radius: 16px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n transition: transform 0.3s ease, box-shadow 0.3s ease;\n border: 2px solid black;\n width: 100%;\n max-width: 600px;\n margin: 0 auto;\n min-height: 160px;\n }\n \n .avatar {\n width: 150px;\n height: 150px;\n border-radius: 50%;\n object-fit: cover;\n border: 3px solid var(--accent-color, #6c63ff);\n flex-shrink: 0;\n }\n \n \n .testimonial-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n \n \n .review-name {\n font-size: 1.45rem;\n font-weight: 900;\n margin-bottom: 0.25rem;\n color: var(--text-primary, #111);\n }\n \n .review-role {\n font-size: 1.15rem;\n font-style: italic;\n color: var(--text-muted, #777);\n margin-bottom: 0.4rem;\n }\n \n .testimonial-text {\n font-size: 1rem;\n line-height: 1.5;\n color: var(--text-secondary, #333);\n }\n \n .swiper-button-prev span,\n .swiper-button-next span {\n width: 30px;\n height: 10px;\n background-color: white;\n color: black;\n border: 2px solid rgb(0, 0, 0);\n border-radius: 9px;\n font-size: 1.4rem;\n font-weight:900;\n display: flex;\n align-items: center;\n justify-content: center;\n top: 50%;\n transform: translateY(-50%);\n z-index: 10;\n cursor: pointer;\n transition: all 0.3s ease;\n padding: 20px;\n \n }\n \n .swiper-button-prev::after,\n .swiper-button-next::after {\n content: '';\n display: none;\n }\n \n .swiper-button-prev span {\n left: 20px;\n margin-left: 25rem;\n }\n \n .swiper-button-next span{\n right: 20px;\n margin-right: 25rem;\n }\n \n \n .dark-theme .reviews-section .testimonial {\n background-color: rgba(30, 25, 60, 0.9);\n border: 2px solid white;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n }\n \n .dark-theme .reviews-section .testimonial:hover {\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6);\n }\n \n .dark-theme .reviews-section .review-name,\n .dark-theme .reviews-section .testimonial-text {\n color: var(--text-card, #eee);\n }\n \n .dark-theme .reviews-section .review-role {\n color: var(--text-muted, #aaa);\n }\n \n \n .dark-theme .swiper-button-prev,\n .dark-theme .swiper-button-next {\n border-color: white;\n color: white;\n }\n \n @media (max-width: 1024px) {\n .review-section-title {\n font-size: 1.8rem;\n margin: 4rem 1rem;\n }\n \n .testimonial {\n flex-direction: row;\n gap: 1rem;\n padding: 1.5rem;\n max-width: 90%;\n }\n \n .avatar {\n width: 120px;\n height: 120px;\n }\n \n .review-name {\n font-size: 1.2rem;\n }\n \n .review-role,\n .testimonial-text {\n font-size: 0.95rem;\n }\n \n .swiper-button-prev span,\n .swiper-button-next span {\n width: 45px;\n height: 45px;\n padding: 15px;\n }\n }\n \n @media (max-width: 768px) {\n .review-section-title {\n font-size: 1.6rem;\n margin: 3rem 1rem 2rem;\n }\n \n .testimonial {\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 1rem;\n padding: 1.2rem;\n max-width: 95%;\n }\n \n .avatar {\n width: 100px;\n height: 100px;\n }\n \n .review-name {\n font-size: 1.1rem;\n }\n \n .review-role {\n font-size: 0.9rem;\n }\n \n .testimonial-text {\n font-size: 0.9rem;\n }\n \n .swiper-button-prev span,\n .swiper-button-next span {\n width: 40px;\n height: 40px;\n padding: 12px;\n font-size: 1.2rem;\n margin: 0;\n }\n \n .swiper-button-prev span {\n left: 10px;\n }\n \n .swiper-button-next span {\n right: 10px;\n }\n }\n \n @media (max-width: 480px) {\n .review-section-title {\n font-size: 1.4rem;\n margin: 2rem 0 1.5rem;\n }\n \n .testimonial {\n padding: 1rem;\n border-radius: 12px;\n }\n \n .avatar {\n width: 80px;\n height: 80px;\n }\n \n .review-name {\n font-size: 1rem;\n }\n \n .review-role,\n .testimonial-text {\n font-size: 0.85rem;\n }\n \n .swiper-button-prev span,\n .swiper-button-next span {\n width: 36px;\n height: 36px;\n padding: 10px;\n font-size: 1rem;\n }\n \n .swiper-button-prev span {\n margin-left: 0.5rem;\n }\n \n .swiper-button-next span {\n margin-right: 0.5rem;\n }\n }\n\n /* Footer */\n .footer {\n background: rgba(0, 0, 0, 0.8);\n color: white;\n text-align: center;\n padding: 2rem 0;\n margin-top: 3rem;\n }\n\n /* Responsive design */\n @media (max-width: 768px) {\n .hero h1 {\n font-size: 2.5rem;\n }\n \n .nav {\n gap: 1rem;\n }\n \n .filter-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .search-group {\n min-width: 100%;\n }\n \n .projects-grid {\n grid-template-columns: 1fr;\n }\n \n .header-content {\n flex-direction: column;\n text-align: center;\n }\n }\n\n /* Loading animation */\n .loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 200px;\n color: white;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid rgba(255, 255, 255, 0.3);\n border-top: 4px solid white;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n /* Empty state */\n .empty-state {\n text-align: center;\n color: white;\n padding: 3rem 0;\n }\n\n .empty-state i {\n font-size: 4rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n .empty-state h3 {\n font-size: 1.5rem;\n margin-bottom: 0.5rem;\n }\n\n .empty-state p {\n opacity: 0.8;\n }\n\n @keyframes bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-5px); }\n }\n\n /* Newly injected code */\n\n#contact-container {\n background-color: rgba(255, 255, 255, 0.151);\n backdrop-filter: blur(2px);\n border-radius: 30px;\n border: 1px solid rgba(255, 255, 255, 0.29);\n padding: 30px;\n}\n\n#email {\n width: 100% !important;\n font-size: 1.2rem;\n padding: 18px 18px 18px 50px;\n width: 100%;\n border: none;\n border-radius: 15px;\n line-height: 1.2;\n box-sizing: border-box;\n appearance: none;\n}\n\n#email,\n#message,\n#name,\n#lastname {\n box-shadow: 10px 10px 40px #ffffff41, inset -10px -10px 40px #00000026;\n}\n\n#email:focus,\n#message:focus,\n#name:focus,\n#lastname:focus {\n outline: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\n#submit {\n align-self: center;\n width: 50%;\n transition: 0.3s;\n border-radius: 30px;\n box-shadow: 5px 5px 30px #ffffff41, inset -5px -5px 30px #00000026;\n}\n\n.flex-contact {\n display: flex;\n gap: 1vw;\n width: 100%;\n}\n\n.fullname {\n width: 50%;\n position: relative;\n}\n\n#message-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: var(--bg-gradient);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 9999;\n color: white;\n font-size: 2rem;\n font-weight: bold;\n text-align: center;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.4s ease;\n}\n\n#message-overlay .overlay-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n animation: popIn 0.5s ease-out;\n}\n\n#message-overlay .overlay-content i {\n font-size: 4rem;\n color: white;\n margin-bottom: 20px;\n}\n\n@keyframes popIn {\n from {\n transform: scale(0.8);\n opacity: 0;\n }\n\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes softPulse {\n 0% {\n transform: scale(1);\n opacity: 0.5;\n }\n\n 50% {\n transform: scale(1.05);\n opacity: 1;\n }\n\n 100% {\n transform: scale(1);\n opacity: 0.5;\n }\n}\n\n.fas-animation {\n animation: softPulse 3s infinite ease-in-out;\n}\n\n/* Tweaking button */\n\n.fill-btn {\n position: relative;\n display: inline-block;\n padding: 14px 28px;\n font-size: 1.2rem;\n font-weight: bold;\n color: white;\n background-color: #4b0082;\n border: 2px solid white;\n overflow: hidden;\n cursor: pointer;\n z-index: 1;\n}\n\n.fill-btn::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: white;\n transform: scaleX(0);\n transform-origin: left;\n transition: transform 0.4s ease-out;\n z-index: -1;\n}\n\n.fill-btn:hover::before {\n transform: scaleX(1);\n}\n\n.fill-btn:hover {\n color: #4b0082;\n}\n\nbody.dark-theme .fill-btn {\n position: relative;\n display: inline-block;\n padding: 14px 28px;\n font-size: 1.2rem;\n font-weight: bold;\n color: white;\n background-color: #1a1445;\n border: 2px solid white;\n overflow: hidden;\n cursor: pointer;\n z-index: 1;\n}\n\nbody.dark-theme .fill-btn::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: white;\n transform: scaleX(0);\n transform-origin: left;\n transition: transform 0.4s ease-out;\n z-index: -1;\n}\n\nbody.dark-theme .fill-btn:hover::before {\n transform: scaleX(1);\n}\n\nbody.dark-theme .fill-btn:hover {\n color: black;\n}\n\n@media only screen and (max-width: 1020px) {\n #contact-container {\n width: 95%;\n }\n\n .flex-contact {\n flex-direction: column;\n width: 100%;\n gap: 3vh;\n }\n\n .fullname {\n width: 100%;\n }\n\n #contact-container {\n padding: 3vw;\n }\n\n #submit {\n width: 100%;\n }\n}\n\n/* ------------------------------------------- */\n.dark-theme .filters {\n\n background: rgba(18, 25, 60, 0.75);\n /* dark blue translucent */\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n\n border-radius: 16px;\n border: 1px solid rgba(255, 255, 255, 0.1);\n\n box-shadow:\n 0 0 8px rgba(44, 66, 255, 0.4),\n 0 0 16px rgba(44, 66, 255, 0.3);\n\n color: #f0f4ff;\n transition: all 0.3s ease;\n}\n\n.dark-theme .project-card {\n background: rgba(18, 25, 60, 0.75);\n /* dark blue translucent */\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n\n border-radius: 16px;\n border: 1px solid rgba(255, 255, 255, 0.1);\n\n box-shadow:\n 0 0 8px rgba(44, 66, 255, 0.4),\n 0 0 16px rgba(44, 66, 255, 0.3);\n\n color: #f0f4ff;\n transition: all 0.3s ease;\n}\n\n/* Dark theme styles for cards*/\nbody.dark-theme button:hover {\n background-color: rgba(102, 126, 234, 0.3);\n cursor: pointer;\n}\n\n\n/* Dark theme text and border colors */\nbody.dark-theme h1,\nbody.dark-theme .filter-container h2,\nbody.dark-theme h3,\nbody.dark-theme h4,\nbody.dark-theme h5,\nbody.dark-theme h6,\nbody.dark-theme p,\nbody.dark-theme span,\nbody.dark-theme a,\nbody.dark-theme li,\nbody.dark-theme label,\nbody.dark-theme input,\nbody.dark-theme textarea,\nbody.dark-theme button,\nbody.dark-theme .projects-container,\nbody.dark-theme .filter-container {\n \n border-color: #ffffff;\n}\n\n/* Inputs & Textareas in dark theme */\nbody.dark-theme input,\nbody.dark-theme textarea {\n background-color: #1f1f1f;\n}\n\n/* Dark mode buttons */\nbody.dark-theme button {\n background-color: rgba(102, 126, 234, 0.3);\n color: #ffffff !important;\n border: 1px solid rgba(102, 126, 234, 0.3);\n}\n\n/* Button hover effect */\nbody.dark-theme button:hover {\n background-color: rgba(102, 126, 234, 0.5);\n cursor: pointer;\n}\n\n\n#scrollToTopBtn {\n position: fixed;\n bottom: 2rem;\n right: 2rem;\n z-index: 999;\n background-color: #667eea;\n color: white;\n border: none;\n outline: none;\n padding: 0.75rem 1rem;\n border-radius: 50%;\n font-size: 1.25rem;\n cursor: pointer;\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);\n display: none;\n transition: background 0.3s ease, transform 0.3s ease;\n}\n\n#scrollToTopBtn:hover {\n background-color: #5a67d8;\n transform: scale(1.1);\n}\n\n.footer-flex-container {\n display: flex;\n justify-content: space-evenly;\n align-items:flex-start;\n padding: 30px;\n}\n\n.socials {\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: row;\n}\n\n.socials li, .quick-links li {\n list-style-type: none;\n}\n\n.socials li a{\n color: white;\n padding: 10px;\n font-size: larger;\n}\n\n.footer-logo {\n font-size: 2rem;\n font-weight: 700;\n background: white;\n background-clip: text;\n margin: 10px;\n}\n\n.quick-links li a{\n text-decoration: none;\n color: white;\n}\n\n.quick-links li a:hover, .socials li a:hover{\n color:#764ba2;\n}\n\n.quick-links li{\n padding: 3px;\n}\n\n.quick-links ul {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n font-size: 14px;\n gap: 50px;\n}"],"names":[],"version":3,"file":"CodeCanvas-dolikansal.3a01df49.css.map","sourceRoot":"/__parcel_source_root/"} \ No newline at end of file diff --git a/dist/CodeCanvas-dolikansal.672d4772.js b/dist/CodeCanvas-dolikansal.672d4772.js new file mode 100644 index 0000000..b838c84 --- /dev/null +++ b/dist/CodeCanvas-dolikansal.672d4772.js @@ -0,0 +1,608 @@ +const sampleProjects = [ + { + id: 1, + title: 'Analog Clock Web App', + description: 'A beautifully designed analog clock that updates in real-time using vanilla JavaScript, HTML, and CSS. Perfect for understanding basic DOM manipulation and CSS transformations.', + repoUrl: 'https://github.com/snehhhcodes/Analog-Clock-Web-App', + demoUrl: 'https://snehhhcodes.github.io/Analog-Clock-Web-App/', + difficulty: 'beginner', + upvotes: 15, + hasDemo: true, + hasReadme: true, + previewImage: 'assets/Preview.png', + tags: [ + 'JavaScript', + 'CSS', + 'HTML', + 'DOM' + ] + }, + { + id: 2, + title: 'Weather Dashboard', + description: 'A responsive weather application with beautiful animations and detailed forecasts. Features location-based weather data and interactive charts.', + repoUrl: 'https://github.com/Shivin1016/weatherApp', + demoUrl: 'https://shivin1016.github.io/weatherApp/', + difficulty: 'intermediate', + upvotes: 28, + hasDemo: true, + hasReadme: true, + previewImage: "assets/weatherPreview.png", + tags: [ + 'JavaScript', + 'HTML', + 'CSS', + "API" + ] + }, + { + id: 3, + title: 'Task Management App', + description: 'A full-featured task management application with drag-and-drop functionality, real-time updates, and team collaboration features.', + repoUrl: 'https://github.com/example/task-manager', + demoUrl: null, + difficulty: 'advanced', + upvotes: 42, + hasDemo: false, + hasReadme: true, + previewImage: null, + tags: [ + 'Vue.js', + 'Drag & Drop', + 'WebSocket', + 'PWA' + ] + }, + { + id: 4, + title: 'Portfolio Website', + description: 'A modern, responsive portfolio website with smooth animations, dark mode toggle, and optimized performance. Great starting point for personal branding.', + repoUrl: 'https://github.com/Nsanjayboruds/Template-hub', + demoUrl: 'https://templateshub.netlify.app/', + difficulty: 'intermediate', + upvotes: 31, + hasDemo: true, + hasReadme: true, + previewImage: 'assets/templates.png', + tags: [ + 'HTML', + 'CSS', + 'JavaScript', + 'Responsive' + ] + }, + { + id: 5, + title: 'Expense Tracker App', + description: 'A simple and intuitive expense tracker app to monitor daily spending, manage budgets, and gain financial insights.', + repoUrl: 'https://github.com/DineshPabboju/Expense-Tracker-App', + demoUrl: 'https://expense-tracker-app-04.netlify.app/', + difficulty: 'intermediate', + upvotes: 21, + hasDemo: true, + hasReadme: false, + previewImage: 'assets/Expense-Tracker-Preview.png', + tags: [ + 'HTML', + 'CSS', + 'JavaScript', + 'Responsive' + ] + }, + { + id: 6, + title: 'IMDb Clone', + description: 'A responsive IMDb clone showcasing popular movies with detailed info using TMDb API and modern frontend technologies.', + repoUrl: 'https://github.com/Jils31/IMDB-clone', + demoUrl: 'https://imdb-clone-seven-virid.vercel.app/', + difficulty: 'intermediate', + upvotes: 21, + hasDemo: true, + hasReadme: true, + previewImage: 'assets/image.png', + tags: [ + 'REACT', + 'Tailwind CSS', + 'Responsive', + 'React-Router DOM' + ] + }, + { + id: 7, + title: 'PassWord Generator', + description: 'Enable user to create password with specified length and character (uppercase, lowercase , special character and numbers) to meet diverse securing requirements.', + repoUrl: 'https://github.com/Sitaram8472/Generate-password', + demoUrl: 'https://password-generator021.netlify.app/', + difficulty: 'advanced', + upvotes: 42, + hasDemo: true, + hasReadme: true, + previewImage: 'assets/GeneratePassword.png', + tags: [ + 'HTML', + 'CSS', + 'JavaScript', + 'Responsive' + ] + }, + { + id: 8, + title: 'Unit Converter', + description: 'A simple and responsive unit converter that allows users to convert between length, weight, and temperature with real-time results.', + repoUrl: 'https://github.com/Bhavya0420/UnitConverter', + demoUrl: 'https://bhavya0420.github.io/UnitConverter/', + difficulty: 'intermediate', + upvotes: 20, + hasDemo: true, + hasReadme: true, + previewImage: 'assets/UnitConverter.png', + tags: [ + 'HTML', + 'CSS', + 'JavaScript', + 'Responsive' + ] + } +]; +// Store the current projects array +let currentProjects = [ + ...sampleProjects +]; +let selectedTag = null; +// Voting system +class VotingSystem { + constructor(){ + this.userFingerprint = this.generateUserFingerprint(); + this.votes = this.loadVotes(); + this.initializeProjectVotes(); + } + generateUserFingerprint() { + let fingerprint = localStorage.getItem('userFingerprint'); + if (!fingerprint) { + fingerprint = 'user_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); + localStorage.setItem('userFingerprint', fingerprint); + } + return fingerprint; + } + loadVotes() { + const savedVotes = localStorage.getItem('projectVotes'); + return savedVotes ? JSON.parse(savedVotes) : {}; + } + saveVotes() { + localStorage.setItem('projectVotes', JSON.stringify(this.votes)); + } + initializeProjectVotes() { + sampleProjects.forEach((project)=>{ + if (!this.votes[project.id]) this.votes[project.id] = { + count: project.upvotes || 0, + voters: [] + }; + }); + this.saveVotes(); + } + canUserVote(projectId) { + const projectVotes = this.votes[projectId]; + return projectVotes && !projectVotes.voters.includes(this.userFingerprint); + } + upvoteProject(projectId) { + if (!this.canUserVote(projectId)) return { + success: false, + message: 'You have already voted for this project!' + }; + this.votes[projectId].count++; + this.votes[projectId].voters.push(this.userFingerprint); + this.saveVotes(); + // Update the project in currentProjects array + const project = currentProjects.find((p)=>p.id === projectId); + if (project) project.upvotes = this.votes[projectId].count; + // Update the project in sampleProjects array + const sampleProject = sampleProjects.find((p)=>p.id === projectId); + if (sampleProject) sampleProject.upvotes = this.votes[projectId].count; + return { + success: true, + newCount: this.votes[projectId].count + }; + } + getProjectVotes(projectId) { + return this.votes[projectId] ? this.votes[projectId].count : 0; + } + hasUserVoted(projectId) { + const projectVotes = this.votes[projectId]; + return projectVotes && projectVotes.voters.includes(this.userFingerprint); + } +} +// Initialize voting system +const votingSystem = new VotingSystem(); +//Store all the unique tags +const allTagSet = new Set(); +sampleProjects.forEach((project)=>{ + project.tags.forEach((tag)=>allTagSet.add(tag)); +}); +const uniqueTags = Array.from(allTagSet); +// DOM elements +const projectsContainer = document.getElementById('projects-container'); +const loadingElement = document.getElementById('loading'); +const emptyStateElement = document.getElementById('empty-state'); +const sortByFilter = document.getElementById('sort-by'); +const difficultyFilter = document.getElementById('difficulty'); +const hasDemoFilter = document.getElementById('has-demo'); +const applyFiltersBtn = document.getElementById('apply-filters'); +const resetFiltersBtn = document.getElementById('reset-filters'); +const searchInput = document.getElementById('search-input'); +const clearSearchBtn = document.getElementById('clear-search'); +const tagFiltersContainer = document.querySelector('.tag-filters'); +uniqueTags.forEach((tag)=>{ + const button = document.createElement('button'); + button.textContent = tag; + button.classList.add('tag-filter-btn'); + button.dataset.tag = tag; + tagFiltersContainer.appendChild(button); +}); +// Initialize the app +function init() { + setTimeout(()=>{ + hideLoading(); + renderProjects(currentProjects); + setupEventListeners(); + initializeTagFilterListener(); + }, 1000); // Simulate loading time +} +// Hide loading spinner +function hideLoading() { + loadingElement.style.display = 'none'; + projectsContainer.style.display = 'grid'; +} +// Setup event listeners +function setupEventListeners() { + applyFiltersBtn.addEventListener('click', applyFilters); + resetFiltersBtn.addEventListener('click', resetFilters); + sortByFilter.addEventListener('change', applyFilters); + // Search functionality + searchInput.addEventListener('input', handleSearch); + clearSearchBtn.addEventListener('click', clearSearch); + // Smooth scroll for explore button + document.querySelector('a[href="#projects"]').addEventListener('click', (e)=>{ + e.preventDefault(); + document.getElementById('projects').scrollIntoView({ + behavior: 'smooth' + }); + }); +} +function initializeTagFilterListener() { + tagFiltersContainer.addEventListener('click', (e)=>{ + if (e.target.classList.contains('tag-filter-btn')) { + const clickedTag = e.target.dataset.tag; + // Toggle selection + if (selectedTag === clickedTag) { + selectedTag = null; + e.target.classList.remove('active'); + } else { + selectedTag = clickedTag; + // Remove active from all buttons + document.querySelectorAll('.tag-filter-btn').forEach((btn)=>btn.classList.remove('active')); + e.target.classList.add('active'); + } + applyFilters(); // Re-apply filters based on tag + } + }); +} +// Render projects +function renderProjects(projects) { + if (projects.length === 0) { + projectsContainer.style.display = 'none'; + emptyStateElement.style.display = 'block'; + return; + } + // Sort projects based on selected option + const sortBy = sortByFilter.value; + const sortedProjects = [ + ...projects + ].sort((a, b)=>{ + switch(sortBy){ + case 'popularity': + const aVotes = votingSystem.getProjectVotes(a.id); + const bVotes = votingSystem.getProjectVotes(b.id); + return bVotes - aVotes; + case 'newest': + // Since we don't have dates, sort by ID (assuming higher ID = newer) + return b.id - a.id; + case 'difficulty': + const difficultyOrder = { + 'beginner': 1, + 'intermediate': 2, + 'advanced': 3 + }; + return difficultyOrder[a.difficulty] - difficultyOrder[b.difficulty]; + case 'alphabetical': + return a.title.localeCompare(b.title); + default: + return 0; + } + }); + emptyStateElement.style.display = 'none'; + projectsContainer.style.display = 'grid'; + projectsContainer.innerHTML = sortedProjects.map((project, index)=>{ + const hasVoted = votingSystem.hasUserVoted(project.id); + const canVote = votingSystem.canUserVote(project.id); + const voteCount = votingSystem.getProjectVotes(project.id); + const isTopRanked = sortBy === 'popularity' && index < 3 && voteCount > 0; + return ` +
+ ${isTopRanked ? `
#${index + 1}
` : ''} + ${project.previewImage ? `${project.title}` : '
No Preview Available
'} + +
+

${project.title}

+ + + +
+ + + ${project.difficulty.charAt(0).toUpperCase() + project.difficulty.slice(1)} + + +

${project.description}

+ +
+ ${project.hasDemo ? ' Live Demo Available' : ' Code Only'} + ${project.hasReadme ? ' \u2022 README Included' : ' \u2022 No README'} +
+ +
+ ${project.tags.map((item, index)=>` + ${item} + `).join('')} +
+ +
+ ${project.hasDemo && project.demoUrl ? ` + View Demo + ` : ''} + +
+
+ `; + }).join(''); +} +// Handle upvote +function handleUpvote(projectId) { + const result = votingSystem.upvoteProject(projectId); + if (!result.success) { + // Show error message + showNotification(result.message, 'error'); + return; + } + // Show success message + showNotification('Vote added successfully!', 'success'); + // Re-render projects to update the upvote count and sorting + renderProjects(applyCurrentFilters()); + // Add visual feedback + const button = event.target.closest('.upvote-btn'); + if (button) { + button.style.transform = 'scale(1.2)'; + setTimeout(()=>{ + button.style.transform = 'scale(1)'; + }, 200); + } +} +// Show notification function +function showNotification(message, type = 'info') { + // Remove existing notifications + const existingNotification = document.querySelector('.vote-notification'); + if (existingNotification) existingNotification.remove(); + // Create notification element + const notification = document.createElement('div'); + notification.className = `vote-notification ${type}`; + notification.innerHTML = ` + + ${message} + `; + // Add to body + document.body.appendChild(notification); + // Show notification + setTimeout(()=>{ + notification.classList.add('show'); + }, 10); + // Hide notification after 3 seconds + setTimeout(()=>{ + notification.classList.remove('show'); + setTimeout(()=>{ + if (notification.parentNode) notification.remove(); + }, 300); + }, 3000); +} +// Apply filters +function applyFilters() { + const filteredProjects = applyCurrentFilters(); + renderProjects(filteredProjects); +} +// Apply current filter settings +function applyCurrentFilters() { + let filtered = [ + ...sampleProjects + ]; + const difficulty = difficultyFilter.value; + const needsDemo = hasDemoFilter.checked; + const searchTerm = searchInput.value.toLowerCase().trim(); + // Apply search filter + if (searchTerm) filtered = filtered.filter((project)=>{ + const titleMatch = project.title.toLowerCase().includes(searchTerm); + const descriptionMatch = project.description.toLowerCase().includes(searchTerm); + const tagsMatch = project.tags.some((tag)=>tag.toLowerCase().includes(searchTerm)); + return titleMatch || descriptionMatch || tagsMatch; + }); + if (difficulty !== 'all') filtered = filtered.filter((p)=>p.difficulty === difficulty); + if (needsDemo) filtered = filtered.filter((p)=>p.hasDemo); + if (selectedTag) filtered = filtered.filter((project)=>project.tags.includes(selectedTag)); + return filtered; +} +// Handle search input with debounce +let searchTimeout; +function handleSearch() { + const searchTerm = searchInput.value.trim(); + // Show/hide clear button + if (searchTerm) clearSearchBtn.style.display = 'flex'; + else clearSearchBtn.style.display = 'none'; + // Clear previous timeout + clearTimeout(searchTimeout); + // Debounce search to improve performance + searchTimeout = setTimeout(()=>{ + const filteredProjects = applyCurrentFilters(); + renderProjects(filteredProjects); + }, 300); +} +// Clear search +function clearSearch() { + searchInput.value = ''; + clearSearchBtn.style.display = 'none'; + const filteredProjects = applyCurrentFilters(); + renderProjects(filteredProjects); +} +// Reset filters +function resetFilters() { + sortByFilter.value = 'popularity'; + difficultyFilter.value = 'all'; + hasDemoFilter.checked = false; + searchInput.value = ''; + clearSearchBtn.style.display = 'none'; + selectedTag = null; + document.querySelectorAll('.tag-filter-btn').forEach((btn)=>btn.classList.remove('active')); + renderProjects(sampleProjects); +} +// Make handleUpvote globally available +window.handleUpvote = handleUpvote; +// Start the app +document.addEventListener("DOMContentLoaded", init); +// Adding m own version and also added a feature where the input field will get clear on clicking the send message button +function validateForm() { + const name = document.getElementById("name").value.trim(); + const lastname = document.getElementById("lastname").value.trim(); + const email = document.getElementById("email").value.trim(); + const message = document.getElementById("message").value.trim(); + if (!name || !lastname || !email || !message) { + alert("Please fill in all fields."); + return false; + } + if (name.length < 4) { + alert("First Name must be at least 4 letters."); + return false; + } + if (lastname.length < 4) { + alert("Last Name must be at least 4 letters."); + return false; + } + const emailPattern = /^[^ ]+@[^ ]+\.[a-z]{2,3}$/; + if (!email.match(emailPattern)) { + alert("Please enter a valid email."); + return false; + } + // Message must have at least 3 words + const wordCount = message.split(/\s+/).filter(Boolean).length; + if (wordCount < 3) { + alert("Message must be at least 3 words."); + return false; + } + // Show the overlay + const overlay = document.getElementById("message-overlay"); + overlay.style.opacity = "1"; + overlay.style.pointerEvents = "auto"; + // Hide the overlay after 3 seconds + setTimeout(()=>{ + overlay.style.opacity = "0"; + overlay.style.pointerEvents = "none"; + }, 3000); + // Clear form + document.getElementById("contact-form").reset(); + return false; // Prevent actual form submission +} +const toggle = document.getElementById('darkModeToggle'); +const body = document.body; +const icon = document.getElementById('themeIcon'); +// Load preference +const savedTheme = localStorage.getItem('theme'); +if (savedTheme === 'dark') { + body.classList.add('dark-theme'); + icon.textContent = "\u2600\uFE0F"; // Sun in dark mode +} else icon.textContent = "\uD83C\uDF19"; // Moon in light mode +toggle.addEventListener('click', ()=>{ + body.classList.toggle('dark-theme'); + const theme = body.classList.contains('dark-theme') ? 'dark' : 'light'; + localStorage.setItem('theme', theme); + // Update icon + icon.textContent = theme === 'dark' ? "\u2600\uFE0F" : "\uD83C\uDF19"; +}); +//Review Section JS +const swiper = new Swiper(".review-swiper", { + loop: true, + slidesPerView: 1, + spaceBetween: 20, + navigation: { + nextEl: ".swiper-button-next", + prevEl: ".swiper-button-prev" + }, + keyboard: { + enabled: true + }, + mousewheel: { + forceToAxis: true + }, + grabCursor: true, + speed: 600 +}); +//Scroll to top button functionality +const scrollToTopBtn = document.getElementById("scrollToTopBtn"); +// Show button when user scrolls down +window.addEventListener("scroll", ()=>{ + scrollToTopBtn.style.display = window.scrollY > 300 ? "block" : "none"; +}); +// Scroll to top smoothly +scrollToTopBtn.addEventListener("click", ()=>{ + window.scrollTo({ + top: 0, + behavior: "smooth" + }); +}); +document.addEventListener("DOMContentLoaded", ()=>{ + const faders = document.querySelectorAll('.fade-in'); + const observer1 = new IntersectionObserver((entries1, observer1)=>{ + entries1.forEach((entry)=>{ + if (entry.isIntersecting) { + entry.target.classList.add('animate'); + observer1.unobserve(entry.target); + } + }); + }, { + threshold: 0.1 + }); + faders.forEach((fade)=>observer1.observe(fade)); +}); +entries.forEach((entry, index)=>{ + if (entry.isIntersecting) { + setTimeout(()=>{ + entry.target.classList.add('animate'); + }, index * 100); // 100ms delay between cards + observer.unobserve(entry.target); + } +}); +const reviewSwiper = new Swiper(".review-swiper", { + loop: true, + autoplay: { + delay: 4000, + disableOnInteraction: false + }, + navigation: { + nextEl: ".swiper-button-next", + prevEl: ".swiper-button-prev" + }, + speed: 700 +}); + +//# sourceMappingURL=CodeCanvas-dolikansal.672d4772.js.map diff --git a/dist/CodeCanvas-dolikansal.672d4772.js.map b/dist/CodeCanvas-dolikansal.672d4772.js.map new file mode 100644 index 0000000..33be719 --- /dev/null +++ b/dist/CodeCanvas-dolikansal.672d4772.js.map @@ -0,0 +1 @@ +{"mappings":"AAEA,MAAM,iBAAiB;IACrB;QACE,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAc;YAAO;YAAQ;SAAM;IAC5C;IACA;QACE,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAa;YAAQ;YAAO;SAAM;IAC3C;IACA;QACE,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAU;YAAe;YAAa;SAAM;IACrD;IACA;QACE,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAQ;YAAO;YAAc;SAAa;IACnD;IACA;QACE,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAQ;YAAO;YAAc;SAAa;IACnD;IACA;QACE,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAS;YAAgB;YAAc;SAAmB;IACnE;IACA;QACE,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAQ;YAAO;YAAc;SAAa;IACnD;IACA;QACA,IAAI;QACJ,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,YAAY;QACZ,SAAS;QACT,SAAS;QACT,WAAW;QACX,cAAc;QACd,MAAM;YAAC;YAAQ;YAAO;YAAc;SAAa;IACnD;CAEC;AAGO,mCAAmC;AACnC,IAAI,kBAAkB;OAAI;CAAe;AACzC,IAAI,cAAc;AAElB,gBAAgB;AAChB,MAAM;IACF,aAAc;QACV,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,uBAAuB;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;QAC3B,IAAI,CAAC,sBAAsB;IAC/B;IAEA,0BAA0B;QACtB,IAAI,cAAc,aAAa,OAAO,CAAC;QACvC,IAAI,CAAC,aAAa;YACd,cAAc,UAAU,KAAK,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,MAAM,CAAC,GAAG;YAChF,aAAa,OAAO,CAAC,mBAAmB;QAC5C;QACA,OAAO;IACX;IAEA,YAAY;QACR,MAAM,aAAa,aAAa,OAAO,CAAC;QACxC,OAAO,aAAa,KAAK,KAAK,CAAC,cAAc,CAAC;IAClD;IAEA,YAAY;QACR,aAAa,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC,IAAI,CAAC,KAAK;IAClE;IAEA,yBAAyB;QACrB,eAAe,OAAO,CAAC,CAAA;YACnB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG;gBACrB,OAAO,QAAQ,OAAO,IAAI;gBAC1B,QAAQ,EAAE;YACd;QAER;QACA,IAAI,CAAC,SAAS;IAClB;IAEA,YAAY,SAAS,EAAE;QACnB,MAAM,eAAe,IAAI,CAAC,KAAK,CAAC,UAAU;QAC1C,OAAO,gBAAgB,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe;IAC7E;IAEA,cAAc,SAAS,EAAE;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAClB,OAAO;YAAE,SAAS;YAAO,SAAS;QAA2C;QAGjF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK;QAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe;QACtD,IAAI,CAAC,SAAS;QAEd,8CAA8C;QAC9C,MAAM,UAAU,gBAAgB,IAAI,CAAC,CAAA,IAAK,EAAE,EAAE,KAAK;QACnD,IAAI,SACA,QAAQ,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK;QAGjD,6CAA6C;QAC7C,MAAM,gBAAgB,eAAe,IAAI,CAAC,CAAA,IAAK,EAAE,EAAE,KAAK;QACxD,IAAI,eACA,cAAc,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK;QAGvD,OAAO;YAAE,SAAS;YAAM,UAAU,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK;QAAC;IAClE;IAEA,gBAAgB,SAAS,EAAE;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG;IACjE;IAEA,aAAa,SAAS,EAAE;QACpB,MAAM,eAAe,IAAI,CAAC,KAAK,CAAC,UAAU;QAC1C,OAAO,gBAAgB,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe;IAC5E;AACJ;AAEA,2BAA2B;AAC3B,MAAM,eAAe,IAAI;AAEzB,2BAA2B;AAC3B,MAAM,YAAY,IAAI;AACtB,eAAe,OAAO,CAAC,CAAA;IACnB,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAA,MAAO,UAAU,GAAG,CAAC;AAC9C;AAEA,MAAM,aAAa,MAAM,IAAI,CAAC;AAE9B,eAAe;AACf,MAAM,oBAAoB,SAAS,cAAc,CAAC;AAClD,MAAM,iBAAiB,SAAS,cAAc,CAAC;AAC/C,MAAM,oBAAoB,SAAS,cAAc,CAAC;AAClD,MAAM,eAAe,SAAS,cAAc,CAAC;AAC7C,MAAM,mBAAmB,SAAS,cAAc,CAAC;AACjD,MAAM,gBAAgB,SAAS,cAAc,CAAC;AAC9C,MAAM,kBAAkB,SAAS,cAAc,CAAC;AAChD,MAAM,kBAAkB,SAAS,cAAc,CAAC;AAChD,MAAM,cAAc,SAAS,cAAc,CAAC;AAC5C,MAAM,iBAAiB,SAAS,cAAc,CAAC;AAC/C,MAAM,sBAAsB,SAAS,aAAa,CAAC;AAEnD,WAAW,OAAO,CAAC,CAAA;IACf,MAAM,SAAS,SAAS,aAAa,CAAC;IACtC,OAAO,WAAW,GAAG;IACrB,OAAO,SAAS,CAAC,GAAG,CAAC;IACrB,OAAO,OAAO,CAAC,GAAG,GAAG;IACrB,oBAAoB,WAAW,CAAC;AACpC;AAEA,qBAAqB;AACrB,SAAS;IACL,WAAW;QACP;QACA,eAAe;QACf;QACA;IACJ,GAAG,OAAO,wBAAwB;AACtC;AAEA,uBAAuB;AACvB,SAAS;IACL,eAAe,KAAK,CAAC,OAAO,GAAG;IAC/B,kBAAkB,KAAK,CAAC,OAAO,GAAG;AACtC;AAEA,wBAAwB;AACxB,SAAS;IACL,gBAAgB,gBAAgB,CAAC,SAAS;IAC1C,gBAAgB,gBAAgB,CAAC,SAAS;IAC1C,aAAa,gBAAgB,CAAC,UAAU;IAExC,uBAAuB;IACvB,YAAY,gBAAgB,CAAC,SAAS;IACtC,eAAe,gBAAgB,CAAC,SAAS;IAEzC,mCAAmC;IACnC,SAAS,aAAa,CAAC,uBAAuB,gBAAgB,CAAC,SAAS,CAAC;QACrE,EAAE,cAAc;QAChB,SAAS,cAAc,CAAC,YAAY,cAAc,CAAC;YAC/C,UAAU;QACd;IACJ;AACJ;AAEA,SAAS;IACL,oBAAoB,gBAAgB,CAAC,SAAS,CAAC;QAC3C,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB;YAC/C,MAAM,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG;YAEvC,mBAAmB;YACnB,IAAI,gBAAgB,YAAY;gBAC5B,cAAc;gBACd,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YAC9B,OAAO;gBACH,cAAc;gBACd,iCAAiC;gBACjC,SAAS,gBAAgB,CAAC,mBAAmB,OAAO,CAAC,CAAA,MAAO,IAAI,SAAS,CAAC,MAAM,CAAC;gBACjF,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;YAC3B;YAEA,gBAAgB,gCAAgC;QACpD;IACJ;AACJ;AAGA,kBAAkB;AAClB,SAAS,eAAe,QAAQ;IAC5B,IAAI,SAAS,MAAM,KAAK,GAAG;QACvB,kBAAkB,KAAK,CAAC,OAAO,GAAG;QAClC,kBAAkB,KAAK,CAAC,OAAO,GAAG;QAClC;IACJ;IAEA,yCAAyC;IACzC,MAAM,SAAS,aAAa,KAAK;IACjC,MAAM,iBAAiB;WAAI;KAAS,CAAC,IAAI,CAAC,CAAC,GAAG;QAC1C,OAAQ;YACJ,KAAK;gBACD,MAAM,SAAS,aAAa,eAAe,CAAC,EAAE,EAAE;gBAChD,MAAM,SAAS,aAAa,eAAe,CAAC,EAAE,EAAE;gBAChD,OAAO,SAAS;YAEpB,KAAK;gBACD,qEAAqE;gBACrE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE;YAEtB,KAAK;gBACD,MAAM,kBAAkB;oBAAE,YAAY;oBAAG,gBAAgB;oBAAG,YAAY;gBAAE;gBAC1E,OAAO,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,EAAE,UAAU,CAAC;YAExE,KAAK;gBACD,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK;YAExC;gBACI,OAAO;QACf;IACJ;IAEA,kBAAkB,KAAK,CAAC,OAAO,GAAG;IAClC,kBAAkB,KAAK,CAAC,OAAO,GAAG;IAElC,kBAAkB,SAAS,GAAG,eAAe,GAAG,CAAC,CAAC,SAAS;QACvD,MAAM,WAAW,aAAa,YAAY,CAAC,QAAQ,EAAE;QACrD,MAAM,UAAU,aAAa,WAAW,CAAC,QAAQ,EAAE;QACnD,MAAM,YAAY,aAAa,eAAe,CAAC,QAAQ,EAAE;QACzD,MAAM,cAAc,WAAW,gBAAgB,QAAQ,KAAK,YAAY;QAExE,OAAO,CAAC;yCACiB,EAAE,cAAc,eAAe,GAAG;oBACvD,EAAE,cAAc,CAAC,yBAAyB,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,GAAG;oBACnE,EAAE,QAAQ,YAAY,GAChB,CAAC,UAAU,EAAE,QAAQ,YAAY,CAAC,OAAO,EAAE,QAAQ,KAAK,CAAC;wHACqC,CAAC,GAC/F,8DACL;;;kDAG6B,EAAE,QAAQ,KAAK,CAAC;iCACjC,EAAE,QAAQ,OAAO,CAAC;;;;;6DAKU,EAAE,QAAQ,UAAU,CAAC;wBAC1D,EAAE,QAAQ,UAAU,CAAC,MAAM,CAAC,GAAG,WAAW,KAAK,QAAQ,UAAU,CAAC,KAAK,CAAC,GAAG;;;mDAGhD,EAAE,QAAQ,WAAW,CAAC;;;wBAGjD,EAAE,QAAQ,OAAO,GACX,2EACA,kDACL;wBACD,EAAE,QAAQ,SAAS,GACb,sEACA,0EACL;;;;wBAID,EAAE,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,QAAQ,CAAC;oDACP,EAAE,KAAK;wBACnC,CAAC,EAAE,IAAI,CAAC,IAAI;;;;wBAIZ,EAAE,QAAQ,OAAO,IAAI,QAAQ,OAAO,GAC9B,CAAC,SAAS,EAAE,QAAQ,OAAO,CAAC;;mCAEvB,CAAC,GACN,gBACL;kDACyB,EAAE,WAAW,UAAU,GAAG;sDACtB,EAAE,QAAQ,EAAE,CAAC;gCACnC,EAAE,CAAC,UAAU,aAAa,GAAG;uCACtB,EAAE,WAAW,4CAA4C,+BAA+B;;kCAE7F,EAAE,UAAU;;;;YAIlC,CAAC;IACD,GAAG,IAAI,CAAC;AACZ;AAEA,gBAAgB;AAChB,SAAS,aAAa,SAAS;IAC3B,MAAM,SAAS,aAAa,aAAa,CAAC;IAE1C,IAAI,CAAC,OAAO,OAAO,EAAE;QACjB,qBAAqB;QACrB,iBAAiB,OAAO,OAAO,EAAE;QACjC;IACJ;IAEA,uBAAuB;IACvB,iBAAiB,4BAA4B;IAE7C,4DAA4D;IAC5D,eAAe;IAEf,sBAAsB;IACtB,MAAM,SAAS,MAAM,MAAM,CAAC,OAAO,CAAC;IACpC,IAAI,QAAQ;QACR,OAAO,KAAK,CAAC,SAAS,GAAG;QACzB,WAAW;YACP,OAAO,KAAK,CAAC,SAAS,GAAG;QAC7B,GAAG;IACP;AACJ;AAEA,6BAA6B;AAC7B,SAAS,iBAAiB,OAAO,EAAE,OAAO,MAAM;IAC5C,gCAAgC;IAChC,MAAM,uBAAuB,SAAS,aAAa,CAAC;IACpD,IAAI,sBACA,qBAAqB,MAAM;IAG/B,8BAA8B;IAC9B,MAAM,eAAe,SAAS,aAAa,CAAC;IAC5C,aAAa,SAAS,GAAG,CAAC,kBAAkB,EAAE,MAAM;IACpD,aAAa,SAAS,GAAG,CAAC;8BACR,EAAE,SAAS,YAAY,oBAAoB,wBAAwB;sBAC3E,EAAE,QAAQ;YACpB,CAAC;IAED,cAAc;IACd,SAAS,IAAI,CAAC,WAAW,CAAC;IAE1B,oBAAoB;IACpB,WAAW;QACP,aAAa,SAAS,CAAC,GAAG,CAAC;IAC/B,GAAG;IAEH,oCAAoC;IACpC,WAAW;QACP,aAAa,SAAS,CAAC,MAAM,CAAC;QAC9B,WAAW;YACP,IAAI,aAAa,UAAU,EACvB,aAAa,MAAM;QAE3B,GAAG;IACP,GAAG;AACP;AAEA,gBAAgB;AAChB,SAAS;IACL,MAAM,mBAAmB;IACzB,eAAe;AACnB;AAEA,gCAAgC;AAChC,SAAS;IACL,IAAI,WAAW;WAAI;KAAe;IAElC,MAAM,aAAa,iBAAiB,KAAK;IACzC,MAAM,YAAY,cAAc,OAAO;IACvC,MAAM,aAAa,YAAY,KAAK,CAAC,WAAW,GAAG,IAAI;IAEvD,sBAAsB;IACtB,IAAI,YACA,WAAW,SAAS,MAAM,CAAC,CAAA;QACvB,MAAM,aAAa,QAAQ,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;QACxD,MAAM,mBAAmB,QAAQ,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC;QACpE,MAAM,YAAY,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAA,MAAO,IAAI,WAAW,GAAG,QAAQ,CAAC;QACtE,OAAO,cAAc,oBAAoB;IAC7C;IAGJ,IAAI,eAAe,OACf,WAAW,SAAS,MAAM,CAAC,CAAA,IAAK,EAAE,UAAU,KAAK;IAGrD,IAAI,WACA,WAAW,SAAS,MAAM,CAAC,CAAA,IAAK,EAAE,OAAO;IAG7C,IAAG,aACC,WAAW,SAAS,MAAM,CAAC,CAAA,UAAW,QAAQ,IAAI,CAAC,QAAQ,CAAC;IAGhE,OAAO;AACX;AAEA,oCAAoC;AACpC,IAAI;AACJ,SAAS;IACL,MAAM,aAAa,YAAY,KAAK,CAAC,IAAI;IAEzC,yBAAyB;IACzB,IAAI,YACA,eAAe,KAAK,CAAC,OAAO,GAAG;SAE/B,eAAe,KAAK,CAAC,OAAO,GAAG;IAGnC,yBAAyB;IACzB,aAAa;IAEb,yCAAyC;IACzC,gBAAgB,WAAW;QACvB,MAAM,mBAAmB;QACzB,eAAe;IACnB,GAAG;AACP;AAEA,eAAe;AACf,SAAS;IACL,YAAY,KAAK,GAAG;IACpB,eAAe,KAAK,CAAC,OAAO,GAAG;IAC/B,MAAM,mBAAmB;IACzB,eAAe;AACnB;AAEA,gBAAgB;AAChB,SAAS;IACL,aAAa,KAAK,GAAG;IACrB,iBAAiB,KAAK,GAAG;IACzB,cAAc,OAAO,GAAG;IACxB,YAAY,KAAK,GAAG;IACpB,eAAe,KAAK,CAAC,OAAO,GAAG;IAC/B,cAAc;IACd,SAAS,gBAAgB,CAAC,mBAAmB,OAAO,CAAC,CAAA,MAAO,IAAI,SAAS,CAAC,MAAM,CAAC;IACjF,eAAe;AACnB;AAEA,uCAAuC;AACvC,OAAO,YAAY,GAAG;AAEtB,gBAAgB;AAChB,SAAS,gBAAgB,CAAC,oBAAoB;AAC9C,yHAAyH;AACzH,SAAS;IACL,MAAM,OAAO,SAAS,cAAc,CAAC,QAAQ,KAAK,CAAC,IAAI;IACvD,MAAM,WAAW,SAAS,cAAc,CAAC,YAAY,KAAK,CAAC,IAAI;IAC/D,MAAM,QAAQ,SAAS,cAAc,CAAC,SAAS,KAAK,CAAC,IAAI;IACzD,MAAM,UAAU,SAAS,cAAc,CAAC,WAAW,KAAK,CAAC,IAAI;IAC7D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS;QAC1C,MAAM;QACN,OAAO;IACX;IACA,IAAI,KAAK,MAAM,GAAG,GAAG;QACjB,MAAM;QACN,OAAO;IACX;IACA,IAAI,SAAS,MAAM,GAAG,GAAG;QACrB,MAAM;QACN,OAAO;IACX;IACA,MAAM,eAAe;IACrB,IAAI,CAAC,MAAM,KAAK,CAAC,eAAe;QAC5B,MAAM;QACN,OAAO;IACX;IACA,qCAAqC;IACrC,MAAM,YAAY,QAAQ,KAAK,CAAC,OAAO,MAAM,CAAC,SAAS,MAAM;IAC7D,IAAI,YAAY,GAAG;QACf,MAAM;QACN,OAAO;IACX;IAEA,mBAAmB;IACnB,MAAM,UAAU,SAAS,cAAc,CAAC;IACxC,QAAQ,KAAK,CAAC,OAAO,GAAG;IACxB,QAAQ,KAAK,CAAC,aAAa,GAAG;IAE9B,mCAAmC;IACnC,WAAW;QACP,QAAQ,KAAK,CAAC,OAAO,GAAG;QACxB,QAAQ,KAAK,CAAC,aAAa,GAAG;IAClC,GAAG;IAEH,aAAa;IACb,SAAS,cAAc,CAAC,gBAAgB,KAAK;IAE7C,OAAO,OAAO,iCAAiC;AACnD;AAEI,MAAM,SAAS,SAAS,cAAc,CAAC;AACvC,MAAM,OAAO,SAAS,IAAI;AAC1B,MAAM,OAAO,SAAS,cAAc,CAAC;AAErC,kBAAkB;AAClB,MAAM,aAAa,aAAa,OAAO,CAAC;AACpC,IAAI,eAAe,QAAQ;IACvB,KAAK,SAAS,CAAC,GAAG,CAAC;IACnB,KAAK,WAAW,GAAG,gBAAM,mBAAmB;AAChD,OACI,KAAK,WAAW,GAAG,gBAAM,qBAAqB;AAGtD,OAAO,gBAAgB,CAAC,SAAS;IAC7B,KAAK,SAAS,CAAC,MAAM,CAAC;IACtB,MAAM,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAC,gBAAgB,SAAS;IAC/D,aAAa,OAAO,CAAC,SAAS;IAE9B,cAAc;IACd,KAAK,WAAW,GAAG,UAAU,SAAS,iBAAO;AACjD;AAEA,mBAAmB;AACnB,MAAM,SAAS,IAAI,OAAO,kBAAkB;IACxC,MAAM;IACN,eAAe;IACf,cAAc;IACd,YAAY;QACZ,QAAQ;QACR,QAAQ;IACR;IACA,UAAU;QACV,SAAS;IACT;IACA,YAAY;QACZ,aAAa;IACb;IACA,YAAY;IACZ,OAAO;AACf;AACJ,oCAAoC;AACpC,MAAM,iBAAiB,SAAS,cAAc,CAAC;AAEnD,qCAAqC;AACrC,OAAO,gBAAgB,CAAC,UAAU;IAC9B,eAAe,KAAK,CAAC,OAAO,GAAG,OAAO,OAAO,GAAG,MAAM,UAAU;AACpE;AAEA,yBAAyB;AACzB,eAAe,gBAAgB,CAAC,SAAS;IACrC,OAAO,QAAQ,CAAC;QACZ,KAAK;QACL,UAAU;IACd;AACJ;AACA,SAAS,gBAAgB,CAAC,oBAAoB;IAC5C,MAAM,SAAS,SAAS,gBAAgB,CAAC;IAEzC,MAAM,YAAW,IAAI,qBAAqB,CAAC,UAAS;QAClD,SAAQ,OAAO,CAAC,CAAA;YACd,IAAI,MAAM,cAAc,EAAE;gBACxB,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;gBAC3B,UAAS,SAAS,CAAC,MAAM,MAAM;YACjC;QACF;IACF,GAAG;QAAE,WAAW;IAAI;IAEpB,OAAO,OAAO,CAAC,CAAA,OAAQ,UAAS,OAAO,CAAC;AAC1C;AACA,QAAQ,OAAO,CAAC,CAAC,OAAO;IACtB,IAAI,MAAM,cAAc,EAAE;QACxB,WAAW;YACT,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;QAC7B,GAAG,QAAQ,MAAM,4BAA4B;QAC7C,SAAS,SAAS,CAAC,MAAM,MAAM;IACjC;AACF;AAGE,MAAM,eAAe,IAAI,OAAO,kBAAkB;IAChD,MAAM;IACN,UAAU;QACR,OAAO;QACP,sBAAsB;IACxB;IACA,YAAY;QACV,QAAQ;QACR,QAAQ;IACV;IACA,OAAO;AACT","sources":["script.js"],"sourcesContent":["\n\nconst sampleProjects = [\n {\n id: 1,\n title: 'Analog Clock Web App',\n description: 'A beautifully designed analog clock that updates in real-time using vanilla JavaScript, HTML, and CSS. Perfect for understanding basic DOM manipulation and CSS transformations.',\n repoUrl: 'https://github.com/snehhhcodes/Analog-Clock-Web-App',\n demoUrl: 'https://snehhhcodes.github.io/Analog-Clock-Web-App/',\n difficulty: 'beginner',\n upvotes: 15,\n hasDemo: true,\n hasReadme: true,\n previewImage: 'assets/Preview.png',\n tags: ['JavaScript', 'CSS', 'HTML', 'DOM']\n },\n {\n id: 2,\n title: 'Weather Dashboard',\n description: 'A responsive weather application with beautiful animations and detailed forecasts. Features location-based weather data and interactive charts.',\n repoUrl: 'https://github.com/Shivin1016/weatherApp',\n demoUrl: 'https://shivin1016.github.io/weatherApp/',\n difficulty: 'intermediate',\n upvotes: 28,\n hasDemo: true,\n hasReadme: true,\n previewImage: \"assets/weatherPreview.png\",\n tags: ['JavaScript','HTML', 'CSS', \"API\"]\n },\n {\n id: 3,\n title: 'Task Management App',\n description: 'A full-featured task management application with drag-and-drop functionality, real-time updates, and team collaboration features.',\n repoUrl: 'https://github.com/example/task-manager',\n demoUrl: null,\n difficulty: 'advanced',\n upvotes: 42,\n hasDemo: false,\n hasReadme: true,\n previewImage: null,\n tags: ['Vue.js', 'Drag & Drop', 'WebSocket', 'PWA']\n },\n {\n id: 4,\n title: 'Portfolio Website',\n description: 'A modern, responsive portfolio website with smooth animations, dark mode toggle, and optimized performance. Great starting point for personal branding.',\n repoUrl: 'https://github.com/Nsanjayboruds/Template-hub',\n demoUrl: 'https://templateshub.netlify.app/',\n difficulty: 'intermediate',\n upvotes: 31,\n hasDemo: true,\n hasReadme: true,\n previewImage: 'assets/templates.png',\n tags: ['HTML', 'CSS', 'JavaScript', 'Responsive']\n },\n {\n id: 5,\n title: 'Expense Tracker App',\n description: 'A simple and intuitive expense tracker app to monitor daily spending, manage budgets, and gain financial insights.',\n repoUrl: 'https://github.com/DineshPabboju/Expense-Tracker-App',\n demoUrl: 'https://expense-tracker-app-04.netlify.app/',\n difficulty: 'intermediate',\n upvotes: 21,\n hasDemo: true,\n hasReadme: false,\n previewImage: 'assets/Expense-Tracker-Preview.png',\n tags: ['HTML', 'CSS', 'JavaScript', 'Responsive']\n },\n {\n id: 6,\n title: 'IMDb Clone',\n description: 'A responsive IMDb clone showcasing popular movies with detailed info using TMDb API and modern frontend technologies.',\n repoUrl: 'https://github.com/Jils31/IMDB-clone',\n demoUrl: 'https://imdb-clone-seven-virid.vercel.app/',\n difficulty: 'intermediate',\n upvotes: 21,\n hasDemo: true,\n hasReadme: true,\n previewImage: 'assets/image.png',\n tags: ['REACT', 'Tailwind CSS', 'Responsive', 'React-Router DOM']\n },\n {\n id: 7,\n title: 'PassWord Generator',\n description: 'Enable user to create password with specified length and character (uppercase, lowercase , special character and numbers) to meet diverse securing requirements.',\n repoUrl: 'https://github.com/Sitaram8472/Generate-password',\n demoUrl: 'https://password-generator021.netlify.app/',\n difficulty: 'advanced',\n upvotes: 42,\n hasDemo: true,\n hasReadme: true,\n previewImage: 'assets/GeneratePassword.png',\n tags: ['HTML', 'CSS', 'JavaScript', 'Responsive']\n },\n {\n id: 8,\n title: 'Unit Converter',\n description: 'A simple and responsive unit converter that allows users to convert between length, weight, and temperature with real-time results.',\n repoUrl: 'https://github.com/Bhavya0420/UnitConverter',\n demoUrl: 'https://bhavya0420.github.io/UnitConverter/',\n difficulty: 'intermediate',\n upvotes: 20,\n hasDemo: true,\n hasReadme: true,\n previewImage: 'assets/UnitConverter.png',\n tags: ['HTML', 'CSS', 'JavaScript', 'Responsive']\n}\n\n];\n\n\n // Store the current projects array\n let currentProjects = [...sampleProjects];\n let selectedTag = null;\n\n // Voting system\n class VotingSystem {\n constructor() {\n this.userFingerprint = this.generateUserFingerprint();\n this.votes = this.loadVotes();\n this.initializeProjectVotes();\n }\n\n generateUserFingerprint() {\n let fingerprint = localStorage.getItem('userFingerprint');\n if (!fingerprint) {\n fingerprint = 'user_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n localStorage.setItem('userFingerprint', fingerprint);\n }\n return fingerprint;\n }\n\n loadVotes() {\n const savedVotes = localStorage.getItem('projectVotes');\n return savedVotes ? JSON.parse(savedVotes) : {};\n }\n\n saveVotes() {\n localStorage.setItem('projectVotes', JSON.stringify(this.votes));\n }\n\n initializeProjectVotes() {\n sampleProjects.forEach(project => {\n if (!this.votes[project.id]) {\n this.votes[project.id] = {\n count: project.upvotes || 0,\n voters: []\n };\n }\n });\n this.saveVotes();\n }\n\n canUserVote(projectId) {\n const projectVotes = this.votes[projectId];\n return projectVotes && !projectVotes.voters.includes(this.userFingerprint);\n }\n\n upvoteProject(projectId) {\n if (!this.canUserVote(projectId)) {\n return { success: false, message: 'You have already voted for this project!' };\n }\n\n this.votes[projectId].count++;\n this.votes[projectId].voters.push(this.userFingerprint);\n this.saveVotes();\n\n // Update the project in currentProjects array\n const project = currentProjects.find(p => p.id === projectId);\n if (project) {\n project.upvotes = this.votes[projectId].count;\n }\n\n // Update the project in sampleProjects array\n const sampleProject = sampleProjects.find(p => p.id === projectId);\n if (sampleProject) {\n sampleProject.upvotes = this.votes[projectId].count;\n }\n\n return { success: true, newCount: this.votes[projectId].count };\n }\n\n getProjectVotes(projectId) {\n return this.votes[projectId] ? this.votes[projectId].count : 0;\n }\n\n hasUserVoted(projectId) {\n const projectVotes = this.votes[projectId];\n return projectVotes && projectVotes.voters.includes(this.userFingerprint);\n }\n }\n\n // Initialize voting system\n const votingSystem = new VotingSystem();\n\n //Store all the unique tags\n const allTagSet = new Set();\n sampleProjects.forEach(project => {\n project.tags.forEach(tag => allTagSet.add(tag));\n })\n\n const uniqueTags = Array.from(allTagSet);\n\n // DOM elements\n const projectsContainer = document.getElementById('projects-container');\n const loadingElement = document.getElementById('loading');\n const emptyStateElement = document.getElementById('empty-state');\n const sortByFilter = document.getElementById('sort-by');\n const difficultyFilter = document.getElementById('difficulty');\n const hasDemoFilter = document.getElementById('has-demo');\n const applyFiltersBtn = document.getElementById('apply-filters');\n const resetFiltersBtn = document.getElementById('reset-filters');\n const searchInput = document.getElementById('search-input');\n const clearSearchBtn = document.getElementById('clear-search');\n const tagFiltersContainer = document.querySelector('.tag-filters');\n\n uniqueTags.forEach(tag => {\n const button = document.createElement('button');\n button.textContent = tag;\n button.classList.add('tag-filter-btn')\n button.dataset.tag = tag\n tagFiltersContainer.appendChild(button)\n })\n\n // Initialize the app\n function init() {\n setTimeout(() => {\n hideLoading();\n renderProjects(currentProjects);\n setupEventListeners();\n initializeTagFilterListener();\n }, 1000); // Simulate loading time\n }\n\n // Hide loading spinner\n function hideLoading() {\n loadingElement.style.display = 'none';\n projectsContainer.style.display = 'grid';\n }\n\n // Setup event listeners\n function setupEventListeners() {\n applyFiltersBtn.addEventListener('click', applyFilters);\n resetFiltersBtn.addEventListener('click', resetFilters);\n sortByFilter.addEventListener('change', applyFilters);\n \n // Search functionality\n searchInput.addEventListener('input', handleSearch);\n clearSearchBtn.addEventListener('click', clearSearch);\n \n // Smooth scroll for explore button\n document.querySelector('a[href=\"#projects\"]').addEventListener('click', (e) => {\n e.preventDefault();\n document.getElementById('projects').scrollIntoView({\n behavior: 'smooth'\n });\n });\n }\n\n function initializeTagFilterListener() {\n tagFiltersContainer.addEventListener('click', (e) => {\n if (e.target.classList.contains('tag-filter-btn')) {\n const clickedTag = e.target.dataset.tag;\n\n // Toggle selection\n if (selectedTag === clickedTag) {\n selectedTag = null;\n e.target.classList.remove('active');\n } else {\n selectedTag = clickedTag;\n // Remove active from all buttons\n document.querySelectorAll('.tag-filter-btn').forEach(btn => btn.classList.remove('active'));\n e.target.classList.add('active');\n }\n\n applyFilters(); // Re-apply filters based on tag\n }\n });\n }\n\n\n // Render projects\n function renderProjects(projects) {\n if (projects.length === 0) {\n projectsContainer.style.display = 'none';\n emptyStateElement.style.display = 'block';\n return;\n }\n\n // Sort projects based on selected option\n const sortBy = sortByFilter.value;\n const sortedProjects = [...projects].sort((a, b) => {\n switch (sortBy) {\n case 'popularity':\n const aVotes = votingSystem.getProjectVotes(a.id);\n const bVotes = votingSystem.getProjectVotes(b.id);\n return bVotes - aVotes;\n \n case 'newest':\n // Since we don't have dates, sort by ID (assuming higher ID = newer)\n return b.id - a.id;\n \n case 'difficulty':\n const difficultyOrder = { 'beginner': 1, 'intermediate': 2, 'advanced': 3 };\n return difficultyOrder[a.difficulty] - difficultyOrder[b.difficulty];\n \n case 'alphabetical':\n return a.title.localeCompare(b.title);\n \n default:\n return 0;\n }\n });\n\n emptyStateElement.style.display = 'none';\n projectsContainer.style.display = 'grid';\n \n projectsContainer.innerHTML = sortedProjects.map((project, index) => {\n const hasVoted = votingSystem.hasUserVoted(project.id);\n const canVote = votingSystem.canUserVote(project.id);\n const voteCount = votingSystem.getProjectVotes(project.id);\n const isTopRanked = sortBy === 'popularity' && index < 3 && voteCount > 0;\n \n return `\n
\n ${isTopRanked ? `
#${index + 1}
` : ''}\n ${project.previewImage \n ? `\"${project.title}\"No Preview Available
'\">` \n : '
No Preview Available
'\n }\n \n
\n

${project.title}

\n \n \n \n
\n \n \n ${project.difficulty.charAt(0).toUpperCase() + project.difficulty.slice(1)}\n \n \n

${project.description}

\n \n
\n ${project.hasDemo \n ? ' Live Demo Available'\n : ' Code Only'\n }\n ${project.hasReadme \n ? ' β€’ README Included'\n : ' β€’ No README'\n }\n
\n\n
\n ${project.tags.map((item, index)=>`\n ${item}\n `).join('')}\n
\n \n
\n ${project.hasDemo && project.demoUrl \n ? `\n View Demo\n `\n : ''\n }\n \n
\n \n `;\n }).join('');\n }\n\n // Handle upvote\n function handleUpvote(projectId) {\n const result = votingSystem.upvoteProject(projectId);\n \n if (!result.success) {\n // Show error message\n showNotification(result.message, 'error');\n return;\n }\n\n // Show success message\n showNotification('Vote added successfully!', 'success');\n \n // Re-render projects to update the upvote count and sorting\n renderProjects(applyCurrentFilters());\n \n // Add visual feedback\n const button = event.target.closest('.upvote-btn');\n if (button) {\n button.style.transform = 'scale(1.2)';\n setTimeout(() => {\n button.style.transform = 'scale(1)';\n }, 200);\n }\n }\n\n // Show notification function\n function showNotification(message, type = 'info') {\n // Remove existing notifications\n const existingNotification = document.querySelector('.vote-notification');\n if (existingNotification) {\n existingNotification.remove();\n }\n\n // Create notification element\n const notification = document.createElement('div');\n notification.className = `vote-notification ${type}`;\n notification.innerHTML = `\n \n ${message}\n `;\n \n // Add to body\n document.body.appendChild(notification);\n \n // Show notification\n setTimeout(() => {\n notification.classList.add('show');\n }, 10);\n \n // Hide notification after 3 seconds\n setTimeout(() => {\n notification.classList.remove('show');\n setTimeout(() => {\n if (notification.parentNode) {\n notification.remove();\n }\n }, 300);\n }, 3000);\n }\n\n // Apply filters\n function applyFilters() {\n const filteredProjects = applyCurrentFilters();\n renderProjects(filteredProjects);\n }\n\n // Apply current filter settings\n function applyCurrentFilters() {\n let filtered = [...sampleProjects];\n\n const difficulty = difficultyFilter.value;\n const needsDemo = hasDemoFilter.checked;\n const searchTerm = searchInput.value.toLowerCase().trim();\n\n // Apply search filter\n if (searchTerm) {\n filtered = filtered.filter(project => {\n const titleMatch = project.title.toLowerCase().includes(searchTerm);\n const descriptionMatch = project.description.toLowerCase().includes(searchTerm);\n const tagsMatch = project.tags.some(tag => tag.toLowerCase().includes(searchTerm));\n return titleMatch || descriptionMatch || tagsMatch;\n });\n }\n\n if (difficulty !== 'all') {\n filtered = filtered.filter(p => p.difficulty === difficulty);\n }\n\n if (needsDemo) {\n filtered = filtered.filter(p => p.hasDemo);\n }\n\n if(selectedTag){\n filtered = filtered.filter(project => project.tags.includes(selectedTag));\n }\n\n return filtered;\n }\n\n // Handle search input with debounce\n let searchTimeout;\n function handleSearch() {\n const searchTerm = searchInput.value.trim();\n \n // Show/hide clear button\n if (searchTerm) {\n clearSearchBtn.style.display = 'flex';\n } else {\n clearSearchBtn.style.display = 'none';\n }\n \n // Clear previous timeout\n clearTimeout(searchTimeout);\n \n // Debounce search to improve performance\n searchTimeout = setTimeout(() => {\n const filteredProjects = applyCurrentFilters();\n renderProjects(filteredProjects);\n }, 300);\n }\n\n // Clear search\n function clearSearch() {\n searchInput.value = '';\n clearSearchBtn.style.display = 'none';\n const filteredProjects = applyCurrentFilters();\n renderProjects(filteredProjects);\n }\n\n // Reset filters\n function resetFilters() {\n sortByFilter.value = 'popularity';\n difficultyFilter.value = 'all';\n hasDemoFilter.checked = false;\n searchInput.value = '';\n clearSearchBtn.style.display = 'none';\n selectedTag = null;\n document.querySelectorAll('.tag-filter-btn').forEach(btn => btn.classList.remove('active'));\n renderProjects(sampleProjects);\n }\n\n // Make handleUpvote globally available\n window.handleUpvote = handleUpvote;\n\n // Start the app\n document.addEventListener(\"DOMContentLoaded\", init);\n // Adding m own version and also added a feature where the input field will get clear on clicking the send message button\n function validateForm() {\n const name = document.getElementById(\"name\").value.trim();\n const lastname = document.getElementById(\"lastname\").value.trim();\n const email = document.getElementById(\"email\").value.trim();\n const message = document.getElementById(\"message\").value.trim();\n if (!name || !lastname || !email || !message) {\n alert(\"Please fill in all fields.\");\n return false;\n }\n if (name.length < 4) {\n alert(\"First Name must be at least 4 letters.\");\n return false;\n }\n if (lastname.length < 4) {\n alert(\"Last Name must be at least 4 letters.\");\n return false;\n }\n const emailPattern = /^[^ ]+@[^ ]+\\.[a-z]{2,3}$/;\n if (!email.match(emailPattern)) {\n alert(\"Please enter a valid email.\");\n return false;\n }\n // Message must have at least 3 words\n const wordCount = message.split(/\\s+/).filter(Boolean).length;\n if (wordCount < 3) {\n alert(\"Message must be at least 3 words.\");\n return false;\n }\n\n // Show the overlay\n const overlay = document.getElementById(\"message-overlay\");\n overlay.style.opacity = \"1\";\n overlay.style.pointerEvents = \"auto\";\n\n // Hide the overlay after 3 seconds\n setTimeout(() => {\n overlay.style.opacity = \"0\";\n overlay.style.pointerEvents = \"none\";\n }, 3000);\n\n // Clear form\n document.getElementById(\"contact-form\").reset();\n\n return false; // Prevent actual form submission\n }\n\n const toggle = document.getElementById('darkModeToggle');\n const body = document.body;\n const icon = document.getElementById('themeIcon');\n\n // Load preference\n const savedTheme = localStorage.getItem('theme');\n if (savedTheme === 'dark') {\n body.classList.add('dark-theme');\n icon.textContent = 'β˜€οΈ'; // Sun in dark mode\n } else {\n icon.textContent = 'πŸŒ™'; // Moon in light mode\n }\n\n toggle.addEventListener('click', () => {\n body.classList.toggle('dark-theme');\n const theme = body.classList.contains('dark-theme') ? 'dark' : 'light';\n localStorage.setItem('theme', theme);\n\n // Update icon\n icon.textContent = theme === 'dark' ? 'β˜€οΈ' : 'πŸŒ™';\n });\n\n //Review Section JS\n const swiper = new Swiper(\".review-swiper\", {\n loop: true, \n slidesPerView: 1, \n spaceBetween: 20, \n navigation: {\n nextEl: \".swiper-button-next\",\n prevEl: \".swiper-button-prev\",\n },\n keyboard: {\n enabled: true,\n },\n mousewheel: {\n forceToAxis: true,\n },\n grabCursor: true,\n speed: 600,\n });\n //Scroll to top button functionality\n const scrollToTopBtn = document.getElementById(\"scrollToTopBtn\");\n\n// Show button when user scrolls down\nwindow.addEventListener(\"scroll\", () => {\n scrollToTopBtn.style.display = window.scrollY > 300 ? \"block\" : \"none\";\n});\n\n// Scroll to top smoothly\nscrollToTopBtn.addEventListener(\"click\", () => {\n window.scrollTo({\n top: 0,\n behavior: \"smooth\"\n });\n});\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const faders = document.querySelectorAll('.fade-in');\n\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n entry.target.classList.add('animate');\n observer.unobserve(entry.target);\n }\n });\n }, { threshold: 0.1 });\n\n faders.forEach(fade => observer.observe(fade));\n});\nentries.forEach((entry, index) => {\n if (entry.isIntersecting) {\n setTimeout(() => {\n entry.target.classList.add('animate');\n }, index * 100); // 100ms delay between cards\n observer.unobserve(entry.target);\n }\n});\n\n\n const reviewSwiper = new Swiper(\".review-swiper\", {\n loop: true,\n autoplay: {\n delay: 4000, // 4 seconds per slide\n disableOnInteraction: false, // keeps autoplay after manual swipe\n },\n navigation: {\n nextEl: \".swiper-button-next\",\n prevEl: \".swiper-button-prev\",\n },\n speed: 700, // smooth transition\n });\n"],"names":[],"version":3,"file":"CodeCanvas-dolikansal.672d4772.js.map","sourceRoot":"/__parcel_source_root/"} \ No newline at end of file diff --git a/dist/about.cad4fa1f.js b/dist/about.cad4fa1f.js new file mode 100644 index 0000000..dd03b2c --- /dev/null +++ b/dist/about.cad4fa1f.js @@ -0,0 +1,673 @@ +// modules are defined as an array +// [ module function, map of requires ] +// +// map of requires is short require name -> numeric require +// +// anything defined in a previous bundle is accessed via the +// orig method which is the require for previous bundles + +(function ( + modules, + entry, + mainEntry, + parcelRequireName, + externals, + distDir, + publicUrl, + devServer +) { + /* eslint-disable no-undef */ + var globalObject = + typeof globalThis !== 'undefined' + ? globalThis + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : {}; + /* eslint-enable no-undef */ + + // Save the require from previous bundle to this closure if any + var previousRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + + var importMap = previousRequire.i || {}; + var cache = previousRequire.cache || {}; + // Do not use `require` to prevent Webpack from trying to bundle this call + var nodeRequire = + typeof module !== 'undefined' && + typeof module.require === 'function' && + module.require.bind(module); + + function newRequire(name, jumped) { + if (!cache[name]) { + if (!modules[name]) { + if (externals[name]) { + return externals[name]; + } + // if we cannot find the module within our internal map or + // cache jump to the current global require ie. the last bundle + // that was added to the page. + var currentRequire = + typeof globalObject[parcelRequireName] === 'function' && + globalObject[parcelRequireName]; + if (!jumped && currentRequire) { + return currentRequire(name, true); + } + + // If there are other bundles on this page the require from the + // previous one is saved to 'previousRequire'. Repeat this as + // many times as there are bundles until the module is found or + // we exhaust the require chain. + if (previousRequire) { + return previousRequire(name, true); + } + + // Try the node require function if it exists. + if (nodeRequire && typeof name === 'string') { + return nodeRequire(name); + } + + var err = new Error("Cannot find module '" + name + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + } + + localRequire.resolve = resolve; + localRequire.cache = {}; + + var module = (cache[name] = new newRequire.Module(name)); + + modules[name][0].call( + module.exports, + localRequire, + module, + module.exports, + globalObject + ); + } + + return cache[name].exports; + + function localRequire(x) { + var res = localRequire.resolve(x); + return res === false ? {} : newRequire(res); + } + + function resolve(x) { + var id = modules[name][1][x]; + return id != null ? id : x; + } + } + + function Module(moduleName) { + this.id = moduleName; + this.bundle = newRequire; + this.require = nodeRequire; + this.exports = {}; + } + + newRequire.isParcelRequire = true; + newRequire.Module = Module; + newRequire.modules = modules; + newRequire.cache = cache; + newRequire.parent = previousRequire; + newRequire.distDir = distDir; + newRequire.publicUrl = publicUrl; + newRequire.devServer = devServer; + newRequire.i = importMap; + newRequire.register = function (id, exports) { + modules[id] = [ + function (require, module) { + module.exports = exports; + }, + {}, + ]; + }; + + // Only insert newRequire.load when it is actually used. + // The code in this file is linted against ES5, so dynamic import is not allowed. + // INSERT_LOAD_HERE + + Object.defineProperty(newRequire, 'root', { + get: function () { + return globalObject[parcelRequireName]; + }, + }); + + globalObject[parcelRequireName] = newRequire; + + for (var i = 0; i < entry.length; i++) { + newRequire(entry[i]); + } + + if (mainEntry) { + // Expose entry point to Node, AMD or browser globals + // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js + var mainExports = newRequire(mainEntry); + + // CommonJS + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = mainExports; + + // RequireJS + } else if (typeof define === 'function' && define.amd) { + define(function () { + return mainExports; + }); + } + } +})({"iQsZE":[function(require,module,exports,__globalThis) { +var global = arguments[3]; +var HMR_HOST = null; +var HMR_PORT = null; +var HMR_SERVER_PORT = 1234; +var HMR_SECURE = false; +var HMR_ENV_HASH = "d6ea1d42532a7575"; +var HMR_USE_SSE = false; +module.bundle.HMR_BUNDLE_ID = "35dcef6fcad4fa1f"; +"use strict"; +/* global HMR_HOST, HMR_PORT, HMR_SERVER_PORT, HMR_ENV_HASH, HMR_SECURE, HMR_USE_SSE, chrome, browser, __parcel__import__, __parcel__importScripts__, ServiceWorkerGlobalScope */ /*:: +import type { + HMRAsset, + HMRMessage, +} from '@parcel/reporter-dev-server/src/HMRServer.js'; +interface ParcelRequire { + (string): mixed; + cache: {|[string]: ParcelModule|}; + hotData: {|[string]: mixed|}; + Module: any; + parent: ?ParcelRequire; + isParcelRequire: true; + modules: {|[string]: [Function, {|[string]: string|}]|}; + HMR_BUNDLE_ID: string; + root: ParcelRequire; +} +interface ParcelModule { + hot: {| + data: mixed, + accept(cb: (Function) => void): void, + dispose(cb: (mixed) => void): void, + // accept(deps: Array | string, cb: (Function) => void): void, + // decline(): void, + _acceptCallbacks: Array<(Function) => void>, + _disposeCallbacks: Array<(mixed) => void>, + |}; +} +interface ExtensionContext { + runtime: {| + reload(): void, + getURL(url: string): string; + getManifest(): {manifest_version: number, ...}; + |}; +} +declare var module: {bundle: ParcelRequire, ...}; +declare var HMR_HOST: string; +declare var HMR_PORT: string; +declare var HMR_SERVER_PORT: string; +declare var HMR_ENV_HASH: string; +declare var HMR_SECURE: boolean; +declare var HMR_USE_SSE: boolean; +declare var chrome: ExtensionContext; +declare var browser: ExtensionContext; +declare var __parcel__import__: (string) => Promise; +declare var __parcel__importScripts__: (string) => Promise; +declare var globalThis: typeof self; +declare var ServiceWorkerGlobalScope: Object; +*/ var OVERLAY_ID = '__parcel__error__overlay__'; +var OldModule = module.bundle.Module; +function Module(moduleName) { + OldModule.call(this, moduleName); + this.hot = { + data: module.bundle.hotData[moduleName], + _acceptCallbacks: [], + _disposeCallbacks: [], + accept: function(fn) { + this._acceptCallbacks.push(fn || function() {}); + }, + dispose: function(fn) { + this._disposeCallbacks.push(fn); + } + }; + module.bundle.hotData[moduleName] = undefined; +} +module.bundle.Module = Module; +module.bundle.hotData = {}; +var checkedAssets /*: {|[string]: boolean|} */ , disposedAssets /*: {|[string]: boolean|} */ , assetsToDispose /*: Array<[ParcelRequire, string]> */ , assetsToAccept /*: Array<[ParcelRequire, string]> */ , bundleNotFound = false; +function getHostname() { + return HMR_HOST || (typeof location !== 'undefined' && location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost'); +} +function getPort() { + return HMR_PORT || (typeof location !== 'undefined' ? location.port : HMR_SERVER_PORT); +} +// eslint-disable-next-line no-redeclare +let WebSocket = globalThis.WebSocket; +if (!WebSocket && typeof module.bundle.root === 'function') try { + // eslint-disable-next-line no-global-assign + WebSocket = module.bundle.root('ws'); +} catch { +// ignore. +} +var hostname = getHostname(); +var port = getPort(); +var protocol = HMR_SECURE || typeof location !== 'undefined' && location.protocol === 'https:' && ![ + 'localhost', + '127.0.0.1', + '0.0.0.0' +].includes(hostname) ? 'wss' : 'ws'; +// eslint-disable-next-line no-redeclare +var parent = module.bundle.parent; +if (!parent || !parent.isParcelRequire) { + // Web extension context + var extCtx = typeof browser === 'undefined' ? typeof chrome === 'undefined' ? null : chrome : browser; + // Safari doesn't support sourceURL in error stacks. + // eval may also be disabled via CSP, so do a quick check. + var supportsSourceURL = false; + try { + (0, eval)('throw new Error("test"); //# sourceURL=test.js'); + } catch (err) { + supportsSourceURL = err.stack.includes('test.js'); + } + var ws; + if (HMR_USE_SSE) ws = new EventSource('/__parcel_hmr'); + else try { + // If we're running in the dev server's node runner, listen for messages on the parent port. + let { workerData, parentPort } = module.bundle.root('node:worker_threads') /*: any*/ ; + if (workerData !== null && workerData !== void 0 && workerData.__parcel) { + parentPort.on('message', async (message)=>{ + try { + await handleMessage(message); + parentPort.postMessage('updated'); + } catch { + parentPort.postMessage('restart'); + } + }); + // After the bundle has finished running, notify the dev server that the HMR update is complete. + queueMicrotask(()=>parentPort.postMessage('ready')); + } + } catch { + if (typeof WebSocket !== 'undefined') try { + ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/'); + } catch (err) { + // Ignore cloudflare workers error. + if (err.message && !err.message.includes('Disallowed operation called within global scope')) console.error(err.message); + } + } + if (ws) { + // $FlowFixMe + ws.onmessage = async function(event /*: {data: string, ...} */ ) { + var data /*: HMRMessage */ = JSON.parse(event.data); + await handleMessage(data); + }; + if (ws instanceof WebSocket) { + ws.onerror = function(e) { + if (e.message) console.error(e.message); + }; + ws.onclose = function() { + console.warn("[parcel] \uD83D\uDEA8 Connection to the HMR server was lost"); + }; + } + } +} +async function handleMessage(data /*: HMRMessage */ ) { + checkedAssets = {} /*: {|[string]: boolean|} */ ; + disposedAssets = {} /*: {|[string]: boolean|} */ ; + assetsToAccept = []; + assetsToDispose = []; + bundleNotFound = false; + if (data.type === 'reload') fullReload(); + else if (data.type === 'update') { + // Remove error overlay if there is one + if (typeof document !== 'undefined') removeErrorOverlay(); + let assets = data.assets; + // Handle HMR Update + let handled = assets.every((asset)=>{ + return asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle); + }); + // Dispatch a custom event in case a bundle was not found. This might mean + // an asset on the server changed and we should reload the page. This event + // gives the client an opportunity to refresh without losing state + // (e.g. via React Server Components). If e.preventDefault() is not called, + // we will trigger a full page reload. + if (handled && bundleNotFound && assets.some((a)=>a.envHash !== HMR_ENV_HASH) && typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') handled = !window.dispatchEvent(new CustomEvent('parcelhmrreload', { + cancelable: true + })); + if (handled) { + console.clear(); + // Dispatch custom event so other runtimes (e.g React Refresh) are aware. + if (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') window.dispatchEvent(new CustomEvent('parcelhmraccept')); + await hmrApplyUpdates(assets); + hmrDisposeQueue(); + // Run accept callbacks. This will also re-execute other disposed assets in topological order. + let processedAssets = {}; + for(let i = 0; i < assetsToAccept.length; i++){ + let id = assetsToAccept[i][1]; + if (!processedAssets[id]) { + hmrAccept(assetsToAccept[i][0], id); + processedAssets[id] = true; + } + } + } else fullReload(); + } + if (data.type === 'error') { + // Log parcel errors to console + for (let ansiDiagnostic of data.diagnostics.ansi){ + let stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack; + console.error("\uD83D\uDEA8 [parcel]: " + ansiDiagnostic.message + '\n' + stack + '\n\n' + ansiDiagnostic.hints.join('\n')); + } + if (typeof document !== 'undefined') { + // Render the fancy html overlay + removeErrorOverlay(); + var overlay = createErrorOverlay(data.diagnostics.html); + // $FlowFixMe + document.body.appendChild(overlay); + } + } +} +function removeErrorOverlay() { + var overlay = document.getElementById(OVERLAY_ID); + if (overlay) { + overlay.remove(); + console.log("[parcel] \u2728 Error resolved"); + } +} +function createErrorOverlay(diagnostics) { + var overlay = document.createElement('div'); + overlay.id = OVERLAY_ID; + let errorHTML = '
'; + for (let diagnostic of diagnostics){ + let stack = diagnostic.frames.length ? diagnostic.frames.reduce((p, frame)=>{ + return `${p} +${frame.location} +${frame.code}`; + }, '') : diagnostic.stack; + errorHTML += ` +
+
+ \u{1F6A8} ${diagnostic.message} +
+
${stack}
+
+ ${diagnostic.hints.map((hint)=>"
\uD83D\uDCA1 " + hint + '
').join('')} +
+ ${diagnostic.documentation ? `
\u{1F4DD} Learn more
` : ''} +
+ `; + } + errorHTML += '
'; + overlay.innerHTML = errorHTML; + return overlay; +} +function fullReload() { + if (typeof location !== 'undefined' && 'reload' in location) location.reload(); + else if (typeof extCtx !== 'undefined' && extCtx && extCtx.runtime && extCtx.runtime.reload) extCtx.runtime.reload(); + else try { + let { workerData, parentPort } = module.bundle.root('node:worker_threads') /*: any*/ ; + if (workerData !== null && workerData !== void 0 && workerData.__parcel) parentPort.postMessage('restart'); + } catch (err) { + console.error("[parcel] \u26A0\uFE0F An HMR update was not accepted. Please restart the process."); + } +} +function getParents(bundle, id) /*: Array<[ParcelRequire, string]> */ { + var modules = bundle.modules; + if (!modules) return []; + var parents = []; + var k, d, dep; + for(k in modules)for(d in modules[k][1]){ + dep = modules[k][1][d]; + if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) parents.push([ + bundle, + k + ]); + } + if (bundle.parent) parents = parents.concat(getParents(bundle.parent, id)); + return parents; +} +function updateLink(link) { + var href = link.getAttribute('href'); + if (!href) return; + var newLink = link.cloneNode(); + newLink.onload = function() { + if (link.parentNode !== null) // $FlowFixMe + link.parentNode.removeChild(link); + }; + newLink.setAttribute('href', // $FlowFixMe + href.split('?')[0] + '?' + Date.now()); + // $FlowFixMe + link.parentNode.insertBefore(newLink, link.nextSibling); +} +var cssTimeout = null; +function reloadCSS() { + if (cssTimeout || typeof document === 'undefined') return; + cssTimeout = setTimeout(function() { + var links = document.querySelectorAll('link[rel="stylesheet"]'); + for(var i = 0; i < links.length; i++){ + // $FlowFixMe[incompatible-type] + var href /*: string */ = links[i].getAttribute('href'); + var hostname = getHostname(); + var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\/\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort()); + var absolute = /^https?:\/\//i.test(href) && href.indexOf(location.origin) !== 0 && !servedFromHMRServer; + if (!absolute) updateLink(links[i]); + } + cssTimeout = null; + }, 50); +} +function hmrDownload(asset) { + if (asset.type === 'js') { + if (typeof document !== 'undefined') { + let script = document.createElement('script'); + script.src = asset.url + '?t=' + Date.now(); + if (asset.outputFormat === 'esmodule') script.type = 'module'; + return new Promise((resolve, reject)=>{ + var _document$head; + script.onload = ()=>resolve(script); + script.onerror = reject; + (_document$head = document.head) === null || _document$head === void 0 || _document$head.appendChild(script); + }); + } else if (typeof importScripts === 'function') { + // Worker scripts + if (asset.outputFormat === 'esmodule') return import(asset.url + '?t=' + Date.now()); + else return new Promise((resolve, reject)=>{ + try { + importScripts(asset.url + '?t=' + Date.now()); + resolve(); + } catch (err) { + reject(err); + } + }); + } + } +} +async function hmrApplyUpdates(assets) { + global.parcelHotUpdate = Object.create(null); + let scriptsToRemove; + try { + // If sourceURL comments aren't supported in eval, we need to load + // the update from the dev server over HTTP so that stack traces + // are correct in errors/logs. This is much slower than eval, so + // we only do it if needed (currently just Safari). + // https://bugs.webkit.org/show_bug.cgi?id=137297 + // This path is also taken if a CSP disallows eval. + if (!supportsSourceURL) { + let promises = assets.map((asset)=>{ + var _hmrDownload; + return (_hmrDownload = hmrDownload(asset)) === null || _hmrDownload === void 0 ? void 0 : _hmrDownload.catch((err)=>{ + // Web extension fix + if (extCtx && extCtx.runtime && extCtx.runtime.getManifest().manifest_version == 3 && typeof ServiceWorkerGlobalScope != 'undefined' && global instanceof ServiceWorkerGlobalScope) { + extCtx.runtime.reload(); + return; + } + throw err; + }); + }); + scriptsToRemove = await Promise.all(promises); + } + assets.forEach(function(asset) { + hmrApply(module.bundle.root, asset); + }); + } finally{ + delete global.parcelHotUpdate; + if (scriptsToRemove) scriptsToRemove.forEach((script)=>{ + if (script) { + var _document$head2; + (_document$head2 = document.head) === null || _document$head2 === void 0 || _document$head2.removeChild(script); + } + }); + } +} +function hmrApply(bundle /*: ParcelRequire */ , asset /*: HMRAsset */ ) { + var modules = bundle.modules; + if (!modules) return; + if (asset.type === 'css') reloadCSS(); + else if (asset.type === 'js') { + let deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID]; + if (deps) { + if (modules[asset.id]) { + // Remove dependencies that are removed and will become orphaned. + // This is necessary so that if the asset is added back again, the cache is gone, and we prevent a full page reload. + let oldDeps = modules[asset.id][1]; + for(let dep in oldDeps)if (!deps[dep] || deps[dep] !== oldDeps[dep]) { + let id = oldDeps[dep]; + let parents = getParents(module.bundle.root, id); + if (parents.length === 1) hmrDelete(module.bundle.root, id); + } + } + if (supportsSourceURL) // Global eval. We would use `new Function` here but browser + // support for source maps is better with eval. + (0, eval)(asset.output); + // $FlowFixMe + let fn = global.parcelHotUpdate[asset.id]; + modules[asset.id] = [ + fn, + deps + ]; + } + // Always traverse to the parent bundle, even if we already replaced the asset in this bundle. + // This is required in case modules are duplicated. We need to ensure all instances have the updated code. + if (bundle.parent) hmrApply(bundle.parent, asset); + } +} +function hmrDelete(bundle, id) { + let modules = bundle.modules; + if (!modules) return; + if (modules[id]) { + // Collect dependencies that will become orphaned when this module is deleted. + let deps = modules[id][1]; + let orphans = []; + for(let dep in deps){ + let parents = getParents(module.bundle.root, deps[dep]); + if (parents.length === 1) orphans.push(deps[dep]); + } + // Delete the module. This must be done before deleting dependencies in case of circular dependencies. + delete modules[id]; + delete bundle.cache[id]; + // Now delete the orphans. + orphans.forEach((id)=>{ + hmrDelete(module.bundle.root, id); + }); + } else if (bundle.parent) hmrDelete(bundle.parent, id); +} +function hmrAcceptCheck(bundle /*: ParcelRequire */ , id /*: string */ , depsByBundle /*: ?{ [string]: { [string]: string } }*/ ) { + checkedAssets = {}; + if (hmrAcceptCheckOne(bundle, id, depsByBundle)) return true; + // Traverse parents breadth first. All possible ancestries must accept the HMR update, or we'll reload. + let parents = getParents(module.bundle.root, id); + let accepted = false; + while(parents.length > 0){ + let v = parents.shift(); + let a = hmrAcceptCheckOne(v[0], v[1], null); + if (a) // If this parent accepts, stop traversing upward, but still consider siblings. + accepted = true; + else if (a !== null) { + // Otherwise, queue the parents in the next level upward. + let p = getParents(module.bundle.root, v[1]); + if (p.length === 0) { + // If there are no parents, then we've reached an entry without accepting. Reload. + accepted = false; + break; + } + parents.push(...p); + } + } + return accepted; +} +function hmrAcceptCheckOne(bundle /*: ParcelRequire */ , id /*: string */ , depsByBundle /*: ?{ [string]: { [string]: string } }*/ ) { + var modules = bundle.modules; + if (!modules) return; + if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) { + // If we reached the root bundle without finding where the asset should go, + // there's nothing to do. Mark as "accepted" so we don't reload the page. + if (!bundle.parent) { + bundleNotFound = true; + return true; + } + return hmrAcceptCheckOne(bundle.parent, id, depsByBundle); + } + if (checkedAssets[id]) return null; + checkedAssets[id] = true; + var cached = bundle.cache[id]; + if (!cached) return true; + assetsToDispose.push([ + bundle, + id + ]); + if (cached && cached.hot && cached.hot._acceptCallbacks.length) { + assetsToAccept.push([ + bundle, + id + ]); + return true; + } + return false; +} +function hmrDisposeQueue() { + // Dispose all old assets. + for(let i = 0; i < assetsToDispose.length; i++){ + let id = assetsToDispose[i][1]; + if (!disposedAssets[id]) { + hmrDispose(assetsToDispose[i][0], id); + disposedAssets[id] = true; + } + } + assetsToDispose = []; +} +function hmrDispose(bundle /*: ParcelRequire */ , id /*: string */ ) { + var cached = bundle.cache[id]; + bundle.hotData[id] = {}; + if (cached && cached.hot) cached.hot.data = bundle.hotData[id]; + if (cached && cached.hot && cached.hot._disposeCallbacks.length) cached.hot._disposeCallbacks.forEach(function(cb) { + cb(bundle.hotData[id]); + }); + delete bundle.cache[id]; +} +function hmrAccept(bundle /*: ParcelRequire */ , id /*: string */ ) { + // Execute the module. + bundle(id); + // Run the accept callbacks in the new version of the module. + var cached = bundle.cache[id]; + if (cached && cached.hot && cached.hot._acceptCallbacks.length) { + let assetsToAlsoAccept = []; + cached.hot._acceptCallbacks.forEach(function(cb) { + let additionalAssets = cb(function() { + return getParents(module.bundle.root, id); + }); + if (Array.isArray(additionalAssets) && additionalAssets.length) assetsToAlsoAccept.push(...additionalAssets); + }); + if (assetsToAlsoAccept.length) { + let handled = assetsToAlsoAccept.every(function(a) { + return hmrAcceptCheck(a[0], a[1]); + }); + if (!handled) return fullReload(); + hmrDisposeQueue(); + } + } +} + +},{}],"ad02G":[function(require,module,exports,__globalThis) { + +},{}]},["iQsZE","ad02G"], "ad02G", "parcelRequire94c2", {}) + +//# sourceMappingURL=about.cad4fa1f.js.map diff --git a/dist/about.cad4fa1f.js.map b/dist/about.cad4fa1f.js.map new file mode 100644 index 0000000..83f3975 --- /dev/null +++ b/dist/about.cad4fa1f.js.map @@ -0,0 +1 @@ +{"mappings":"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","sources":["../../../.npm/_npx/b4a9aa12c0cf34a6/node_modules/@parcel/runtime-browser-hmr/lib/runtime-b7f1083d5420e4e2.js"],"sourcesContent":["var HMR_HOST = null;var HMR_PORT = null;var HMR_SERVER_PORT = 1234;var HMR_SECURE = false;var HMR_ENV_HASH = \"d6ea1d42532a7575\";var HMR_USE_SSE = false;module.bundle.HMR_BUNDLE_ID = \"35dcef6fcad4fa1f\";\"use strict\";\n\n/* global HMR_HOST, HMR_PORT, HMR_SERVER_PORT, HMR_ENV_HASH, HMR_SECURE, HMR_USE_SSE, chrome, browser, __parcel__import__, __parcel__importScripts__, ServiceWorkerGlobalScope */\n/*::\nimport type {\n HMRAsset,\n HMRMessage,\n} from '@parcel/reporter-dev-server/src/HMRServer.js';\ninterface ParcelRequire {\n (string): mixed;\n cache: {|[string]: ParcelModule|};\n hotData: {|[string]: mixed|};\n Module: any;\n parent: ?ParcelRequire;\n isParcelRequire: true;\n modules: {|[string]: [Function, {|[string]: string|}]|};\n HMR_BUNDLE_ID: string;\n root: ParcelRequire;\n}\ninterface ParcelModule {\n hot: {|\n data: mixed,\n accept(cb: (Function) => void): void,\n dispose(cb: (mixed) => void): void,\n // accept(deps: Array | string, cb: (Function) => void): void,\n // decline(): void,\n _acceptCallbacks: Array<(Function) => void>,\n _disposeCallbacks: Array<(mixed) => void>,\n |};\n}\ninterface ExtensionContext {\n runtime: {|\n reload(): void,\n getURL(url: string): string;\n getManifest(): {manifest_version: number, ...};\n |};\n}\ndeclare var module: {bundle: ParcelRequire, ...};\ndeclare var HMR_HOST: string;\ndeclare var HMR_PORT: string;\ndeclare var HMR_SERVER_PORT: string;\ndeclare var HMR_ENV_HASH: string;\ndeclare var HMR_SECURE: boolean;\ndeclare var HMR_USE_SSE: boolean;\ndeclare var chrome: ExtensionContext;\ndeclare var browser: ExtensionContext;\ndeclare var __parcel__import__: (string) => Promise;\ndeclare var __parcel__importScripts__: (string) => Promise;\ndeclare var globalThis: typeof self;\ndeclare var ServiceWorkerGlobalScope: Object;\n*/\nvar OVERLAY_ID = '__parcel__error__overlay__';\nvar OldModule = module.bundle.Module;\nfunction Module(moduleName) {\n OldModule.call(this, moduleName);\n this.hot = {\n data: module.bundle.hotData[moduleName],\n _acceptCallbacks: [],\n _disposeCallbacks: [],\n accept: function (fn) {\n this._acceptCallbacks.push(fn || function () {});\n },\n dispose: function (fn) {\n this._disposeCallbacks.push(fn);\n }\n };\n module.bundle.hotData[moduleName] = undefined;\n}\nmodule.bundle.Module = Module;\nmodule.bundle.hotData = {};\nvar checkedAssets /*: {|[string]: boolean|} */,\n disposedAssets /*: {|[string]: boolean|} */,\n assetsToDispose /*: Array<[ParcelRequire, string]> */,\n assetsToAccept /*: Array<[ParcelRequire, string]> */,\n bundleNotFound = false;\nfunction getHostname() {\n return HMR_HOST || (typeof location !== 'undefined' && location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost');\n}\nfunction getPort() {\n return HMR_PORT || (typeof location !== 'undefined' ? location.port : HMR_SERVER_PORT);\n}\n\n// eslint-disable-next-line no-redeclare\nlet WebSocket = globalThis.WebSocket;\nif (!WebSocket && typeof module.bundle.root === 'function') {\n try {\n // eslint-disable-next-line no-global-assign\n WebSocket = module.bundle.root('ws');\n } catch {\n // ignore.\n }\n}\nvar hostname = getHostname();\nvar port = getPort();\nvar protocol = HMR_SECURE || typeof location !== 'undefined' && location.protocol === 'https:' && !['localhost', '127.0.0.1', '0.0.0.0'].includes(hostname) ? 'wss' : 'ws';\n\n// eslint-disable-next-line no-redeclare\nvar parent = module.bundle.parent;\nif (!parent || !parent.isParcelRequire) {\n // Web extension context\n var extCtx = typeof browser === 'undefined' ? typeof chrome === 'undefined' ? null : chrome : browser;\n\n // Safari doesn't support sourceURL in error stacks.\n // eval may also be disabled via CSP, so do a quick check.\n var supportsSourceURL = false;\n try {\n (0, eval)('throw new Error(\"test\"); //# sourceURL=test.js');\n } catch (err) {\n supportsSourceURL = err.stack.includes('test.js');\n }\n var ws;\n if (HMR_USE_SSE) {\n ws = new EventSource('/__parcel_hmr');\n } else {\n try {\n // If we're running in the dev server's node runner, listen for messages on the parent port.\n let {\n workerData,\n parentPort\n } = module.bundle.root('node:worker_threads') /*: any*/;\n if (workerData !== null && workerData !== void 0 && workerData.__parcel) {\n parentPort.on('message', async message => {\n try {\n await handleMessage(message);\n parentPort.postMessage('updated');\n } catch {\n parentPort.postMessage('restart');\n }\n });\n\n // After the bundle has finished running, notify the dev server that the HMR update is complete.\n queueMicrotask(() => parentPort.postMessage('ready'));\n }\n } catch {\n if (typeof WebSocket !== 'undefined') {\n try {\n ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/');\n } catch (err) {\n // Ignore cloudflare workers error.\n if (err.message && !err.message.includes('Disallowed operation called within global scope')) {\n console.error(err.message);\n }\n }\n }\n }\n }\n if (ws) {\n // $FlowFixMe\n ws.onmessage = async function (event /*: {data: string, ...} */) {\n var data /*: HMRMessage */ = JSON.parse(event.data);\n await handleMessage(data);\n };\n if (ws instanceof WebSocket) {\n ws.onerror = function (e) {\n if (e.message) {\n console.error(e.message);\n }\n };\n ws.onclose = function () {\n console.warn('[parcel] 🚨 Connection to the HMR server was lost');\n };\n }\n }\n}\nasync function handleMessage(data /*: HMRMessage */) {\n checkedAssets = {} /*: {|[string]: boolean|} */;\n disposedAssets = {} /*: {|[string]: boolean|} */;\n assetsToAccept = [];\n assetsToDispose = [];\n bundleNotFound = false;\n if (data.type === 'reload') {\n fullReload();\n } else if (data.type === 'update') {\n // Remove error overlay if there is one\n if (typeof document !== 'undefined') {\n removeErrorOverlay();\n }\n let assets = data.assets;\n\n // Handle HMR Update\n let handled = assets.every(asset => {\n return asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle);\n });\n\n // Dispatch a custom event in case a bundle was not found. This might mean\n // an asset on the server changed and we should reload the page. This event\n // gives the client an opportunity to refresh without losing state\n // (e.g. via React Server Components). If e.preventDefault() is not called,\n // we will trigger a full page reload.\n if (handled && bundleNotFound && assets.some(a => a.envHash !== HMR_ENV_HASH) && typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n handled = !window.dispatchEvent(new CustomEvent('parcelhmrreload', {\n cancelable: true\n }));\n }\n if (handled) {\n console.clear();\n\n // Dispatch custom event so other runtimes (e.g React Refresh) are aware.\n if (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n window.dispatchEvent(new CustomEvent('parcelhmraccept'));\n }\n await hmrApplyUpdates(assets);\n hmrDisposeQueue();\n\n // Run accept callbacks. This will also re-execute other disposed assets in topological order.\n let processedAssets = {};\n for (let i = 0; i < assetsToAccept.length; i++) {\n let id = assetsToAccept[i][1];\n if (!processedAssets[id]) {\n hmrAccept(assetsToAccept[i][0], id);\n processedAssets[id] = true;\n }\n }\n } else fullReload();\n }\n if (data.type === 'error') {\n // Log parcel errors to console\n for (let ansiDiagnostic of data.diagnostics.ansi) {\n let stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack;\n console.error('🚨 [parcel]: ' + ansiDiagnostic.message + '\\n' + stack + '\\n\\n' + ansiDiagnostic.hints.join('\\n'));\n }\n if (typeof document !== 'undefined') {\n // Render the fancy html overlay\n removeErrorOverlay();\n var overlay = createErrorOverlay(data.diagnostics.html);\n // $FlowFixMe\n document.body.appendChild(overlay);\n }\n }\n}\nfunction removeErrorOverlay() {\n var overlay = document.getElementById(OVERLAY_ID);\n if (overlay) {\n overlay.remove();\n console.log('[parcel] ✨ Error resolved');\n }\n}\nfunction createErrorOverlay(diagnostics) {\n var overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n let errorHTML = '
';\n for (let diagnostic of diagnostics) {\n let stack = diagnostic.frames.length ? diagnostic.frames.reduce((p, frame) => {\n return `${p}\n${frame.location}\n${frame.code}`;\n }, '') : diagnostic.stack;\n errorHTML += `\n
\n
\n 🚨 ${diagnostic.message}\n
\n
${stack}
\n
\n ${diagnostic.hints.map(hint => '
πŸ’‘ ' + hint + '
').join('')}\n
\n ${diagnostic.documentation ? `
πŸ“ Learn more
` : ''}\n
\n `;\n }\n errorHTML += '
';\n overlay.innerHTML = errorHTML;\n return overlay;\n}\nfunction fullReload() {\n if (typeof location !== 'undefined' && 'reload' in location) {\n location.reload();\n } else if (typeof extCtx !== 'undefined' && extCtx && extCtx.runtime && extCtx.runtime.reload) {\n extCtx.runtime.reload();\n } else {\n try {\n let {\n workerData,\n parentPort\n } = module.bundle.root('node:worker_threads') /*: any*/;\n if (workerData !== null && workerData !== void 0 && workerData.__parcel) {\n parentPort.postMessage('restart');\n }\n } catch (err) {\n console.error('[parcel] ⚠️ An HMR update was not accepted. Please restart the process.');\n }\n }\n}\nfunction getParents(bundle, id) /*: Array<[ParcelRequire, string]> */{\n var modules = bundle.modules;\n if (!modules) {\n return [];\n }\n var parents = [];\n var k, d, dep;\n for (k in modules) {\n for (d in modules[k][1]) {\n dep = modules[k][1][d];\n if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) {\n parents.push([bundle, k]);\n }\n }\n }\n if (bundle.parent) {\n parents = parents.concat(getParents(bundle.parent, id));\n }\n return parents;\n}\nfunction updateLink(link) {\n var href = link.getAttribute('href');\n if (!href) {\n return;\n }\n var newLink = link.cloneNode();\n newLink.onload = function () {\n if (link.parentNode !== null) {\n // $FlowFixMe\n link.parentNode.removeChild(link);\n }\n };\n newLink.setAttribute('href',\n // $FlowFixMe\n href.split('?')[0] + '?' + Date.now());\n // $FlowFixMe\n link.parentNode.insertBefore(newLink, link.nextSibling);\n}\nvar cssTimeout = null;\nfunction reloadCSS() {\n if (cssTimeout || typeof document === 'undefined') {\n return;\n }\n cssTimeout = setTimeout(function () {\n var links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (var i = 0; i < links.length; i++) {\n // $FlowFixMe[incompatible-type]\n var href /*: string */ = links[i].getAttribute('href');\n var hostname = getHostname();\n var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\\\/\\\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort());\n var absolute = /^https?:\\/\\//i.test(href) && href.indexOf(location.origin) !== 0 && !servedFromHMRServer;\n if (!absolute) {\n updateLink(links[i]);\n }\n }\n cssTimeout = null;\n }, 50);\n}\nfunction hmrDownload(asset) {\n if (asset.type === 'js') {\n if (typeof document !== 'undefined') {\n let script = document.createElement('script');\n script.src = asset.url + '?t=' + Date.now();\n if (asset.outputFormat === 'esmodule') {\n script.type = 'module';\n }\n return new Promise((resolve, reject) => {\n var _document$head;\n script.onload = () => resolve(script);\n script.onerror = reject;\n (_document$head = document.head) === null || _document$head === void 0 || _document$head.appendChild(script);\n });\n } else if (typeof importScripts === 'function') {\n // Worker scripts\n if (asset.outputFormat === 'esmodule') {\n return __parcel__import__(asset.url + '?t=' + Date.now());\n } else {\n return new Promise((resolve, reject) => {\n try {\n __parcel__importScripts__(asset.url + '?t=' + Date.now());\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n }\n }\n }\n}\nasync function hmrApplyUpdates(assets) {\n global.parcelHotUpdate = Object.create(null);\n let scriptsToRemove;\n try {\n // If sourceURL comments aren't supported in eval, we need to load\n // the update from the dev server over HTTP so that stack traces\n // are correct in errors/logs. This is much slower than eval, so\n // we only do it if needed (currently just Safari).\n // https://bugs.webkit.org/show_bug.cgi?id=137297\n // This path is also taken if a CSP disallows eval.\n if (!supportsSourceURL) {\n let promises = assets.map(asset => {\n var _hmrDownload;\n return (_hmrDownload = hmrDownload(asset)) === null || _hmrDownload === void 0 ? void 0 : _hmrDownload.catch(err => {\n // Web extension fix\n if (extCtx && extCtx.runtime && extCtx.runtime.getManifest().manifest_version == 3 && typeof ServiceWorkerGlobalScope != 'undefined' && global instanceof ServiceWorkerGlobalScope) {\n extCtx.runtime.reload();\n return;\n }\n throw err;\n });\n });\n scriptsToRemove = await Promise.all(promises);\n }\n assets.forEach(function (asset) {\n hmrApply(module.bundle.root, asset);\n });\n } finally {\n delete global.parcelHotUpdate;\n if (scriptsToRemove) {\n scriptsToRemove.forEach(script => {\n if (script) {\n var _document$head2;\n (_document$head2 = document.head) === null || _document$head2 === void 0 || _document$head2.removeChild(script);\n }\n });\n }\n }\n}\nfunction hmrApply(bundle /*: ParcelRequire */, asset /*: HMRAsset */) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n if (asset.type === 'css') {\n reloadCSS();\n } else if (asset.type === 'js') {\n let deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID];\n if (deps) {\n if (modules[asset.id]) {\n // Remove dependencies that are removed and will become orphaned.\n // This is necessary so that if the asset is added back again, the cache is gone, and we prevent a full page reload.\n let oldDeps = modules[asset.id][1];\n for (let dep in oldDeps) {\n if (!deps[dep] || deps[dep] !== oldDeps[dep]) {\n let id = oldDeps[dep];\n let parents = getParents(module.bundle.root, id);\n if (parents.length === 1) {\n hmrDelete(module.bundle.root, id);\n }\n }\n }\n }\n if (supportsSourceURL) {\n // Global eval. We would use `new Function` here but browser\n // support for source maps is better with eval.\n (0, eval)(asset.output);\n }\n\n // $FlowFixMe\n let fn = global.parcelHotUpdate[asset.id];\n modules[asset.id] = [fn, deps];\n }\n\n // Always traverse to the parent bundle, even if we already replaced the asset in this bundle.\n // This is required in case modules are duplicated. We need to ensure all instances have the updated code.\n if (bundle.parent) {\n hmrApply(bundle.parent, asset);\n }\n }\n}\nfunction hmrDelete(bundle, id) {\n let modules = bundle.modules;\n if (!modules) {\n return;\n }\n if (modules[id]) {\n // Collect dependencies that will become orphaned when this module is deleted.\n let deps = modules[id][1];\n let orphans = [];\n for (let dep in deps) {\n let parents = getParents(module.bundle.root, deps[dep]);\n if (parents.length === 1) {\n orphans.push(deps[dep]);\n }\n }\n\n // Delete the module. This must be done before deleting dependencies in case of circular dependencies.\n delete modules[id];\n delete bundle.cache[id];\n\n // Now delete the orphans.\n orphans.forEach(id => {\n hmrDelete(module.bundle.root, id);\n });\n } else if (bundle.parent) {\n hmrDelete(bundle.parent, id);\n }\n}\nfunction hmrAcceptCheck(bundle /*: ParcelRequire */, id /*: string */, depsByBundle /*: ?{ [string]: { [string]: string } }*/) {\n checkedAssets = {};\n if (hmrAcceptCheckOne(bundle, id, depsByBundle)) {\n return true;\n }\n\n // Traverse parents breadth first. All possible ancestries must accept the HMR update, or we'll reload.\n let parents = getParents(module.bundle.root, id);\n let accepted = false;\n while (parents.length > 0) {\n let v = parents.shift();\n let a = hmrAcceptCheckOne(v[0], v[1], null);\n if (a) {\n // If this parent accepts, stop traversing upward, but still consider siblings.\n accepted = true;\n } else if (a !== null) {\n // Otherwise, queue the parents in the next level upward.\n let p = getParents(module.bundle.root, v[1]);\n if (p.length === 0) {\n // If there are no parents, then we've reached an entry without accepting. Reload.\n accepted = false;\n break;\n }\n parents.push(...p);\n }\n }\n return accepted;\n}\nfunction hmrAcceptCheckOne(bundle /*: ParcelRequire */, id /*: string */, depsByBundle /*: ?{ [string]: { [string]: string } }*/) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) {\n // If we reached the root bundle without finding where the asset should go,\n // there's nothing to do. Mark as \"accepted\" so we don't reload the page.\n if (!bundle.parent) {\n bundleNotFound = true;\n return true;\n }\n return hmrAcceptCheckOne(bundle.parent, id, depsByBundle);\n }\n if (checkedAssets[id]) {\n return null;\n }\n checkedAssets[id] = true;\n var cached = bundle.cache[id];\n if (!cached) {\n return true;\n }\n assetsToDispose.push([bundle, id]);\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n assetsToAccept.push([bundle, id]);\n return true;\n }\n return false;\n}\nfunction hmrDisposeQueue() {\n // Dispose all old assets.\n for (let i = 0; i < assetsToDispose.length; i++) {\n let id = assetsToDispose[i][1];\n if (!disposedAssets[id]) {\n hmrDispose(assetsToDispose[i][0], id);\n disposedAssets[id] = true;\n }\n }\n assetsToDispose = [];\n}\nfunction hmrDispose(bundle /*: ParcelRequire */, id /*: string */) {\n var cached = bundle.cache[id];\n bundle.hotData[id] = {};\n if (cached && cached.hot) {\n cached.hot.data = bundle.hotData[id];\n }\n if (cached && cached.hot && cached.hot._disposeCallbacks.length) {\n cached.hot._disposeCallbacks.forEach(function (cb) {\n cb(bundle.hotData[id]);\n });\n }\n delete bundle.cache[id];\n}\nfunction hmrAccept(bundle /*: ParcelRequire */, id /*: string */) {\n // Execute the module.\n bundle(id);\n\n // Run the accept callbacks in the new version of the module.\n var cached = bundle.cache[id];\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n let assetsToAlsoAccept = [];\n cached.hot._acceptCallbacks.forEach(function (cb) {\n let additionalAssets = cb(function () {\n return getParents(module.bundle.root, id);\n });\n if (Array.isArray(additionalAssets) && additionalAssets.length) {\n assetsToAlsoAccept.push(...additionalAssets);\n }\n });\n if (assetsToAlsoAccept.length) {\n let handled = assetsToAlsoAccept.every(function (a) {\n return hmrAcceptCheck(a[0], a[1]);\n });\n if (!handled) {\n return fullReload();\n }\n hmrDisposeQueue();\n }\n }\n}"],"names":[],"version":3,"file":"about.cad4fa1f.js.map","sourceRoot":"/__parcel_source_root/"} \ No newline at end of file diff --git a/dist/about.html b/dist/about.html new file mode 100644 index 0000000..3821c19 --- /dev/null +++ b/dist/about.html @@ -0,0 +1,505 @@ + + + + Document + + + + + +
+
+
+ + +
+
+
+ +
+
+

About CodeCanvas 🌍✨

+

CodeCanvas was born from a simple idea: creating a vibrant space where front-end developers at all levels could share their work, find inspiration, and grow together. We noticed that while there are many platforms for code sharing, there wasn't a dedicated community focused on celebrating the artistry and creativity in front-end development.

+ +
+

Why choose us

+

Unlike generic coding platforms, CodeCanvas is specifically tailored for front-end developers who:

+
    +
  • Value both functionality and aesthetics
  • +
  • Want to showcase their projects in a design-friendly format
  • +
  • Seek inspiration that balances technical excellence with visual appeal
  • +
  • Appreciate constructive feedback from peers
  • +
+
+ +
+

Our Mission

+

At CodeCanvas, we're on a mission to:

+
    +
  • Democratize front-end inspiration by making amazing designs accessible to everyone
  • +
  • Foster meaningful connections between developers worldwide
  • +
  • Celebrate creativity in all its forms - from stunning animations to clever UI solutions
  • +
  • Lower the barriers for newcomers to learn from real-world examples
  • +
+
+
+

Our Values

+
    +
  • ✨ Creativity First - We celebrate innovative thinking
  • +
  • 🌱 Always Learning - Every project teaches us something new
  • +
  • πŸ€— Community Focused - Your success is our success
  • +
  • πŸ”“ Open By Design - We believe in transparent, accessible development
  • +
+
+
+

CodeCanvas is more than a platform - it's a community. Contribute your projects, share feedback, or help us improve the platform. Together, we're painting the digital world one beautiful component at a time.

+
+ +
+
+ +
+

Β© 2025 CodeCanvas. Open source project for the developer community.

+

Built with ❀️ for showcasing amazing front-end projects

+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/dist/business.631f3311.png b/dist/business.631f3311.png new file mode 100644 index 0000000..9c57fba Binary files /dev/null and b/dist/business.631f3311.png differ diff --git a/dist/businessman.ff2c2652.png b/dist/businessman.ff2c2652.png new file mode 100644 index 0000000..da2d8b3 Binary files /dev/null and b/dist/businessman.ff2c2652.png differ diff --git a/dist/businesswoman.ac330bcc.png b/dist/businesswoman.ac330bcc.png new file mode 100644 index 0000000..009414a Binary files /dev/null and b/dist/businesswoman.ac330bcc.png differ diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..cd39b9a --- /dev/null +++ b/dist/index.html @@ -0,0 +1,265 @@ + + + + CodeCanvas - Showcase Front-End Projects + + + + + + + + +
+
+
+ + +
+
+
+ +
+
+
+

Showcase Your Front-End Creations

+

Discover, share, and get inspired by amazing front-end projects from developers around the world. Join the community and showcase your creativity!

+ Explore Projects +
+
+ +
+
+

Filter Projects

+ +
+ + +
+ +
+ + + +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + Has Open Issues +
+ + + + +
+ + +
+ + +
+ +
+
+ +
+
+
+ + +
+
+

Featured Projects

+
+ + +
+
+ +
+

Developer Reviews

+
+
+
+
+ Jane Doe +
+

Jane Doe

+

Frontend Developer

+

β€œCodeCanvas has completely changed the way I discover front-end projects. Super intuitive!”

+
+
+
+
+
+ Raj Patel +
+

Raj Patel

+

Open Source Contributor

+

β€œA must-have platform for developers looking to showcase their UI/UX skills.”

+
+
+
+
+
+ Maria Gonzales +
+

Maria Gonzales

+

Full Stack Developer

+

β€œI’ve found so many cool projects to contribute to. Highly recommended!”

+
+
+
+
+
+ Leo Kim +
+

Leo Kim

+

UI/UX Designer

+

β€œLove the simplicity and design. It's like Behance but for front-end developers.”

+
+
+
+
+
+ Sara Ahmed +
+

Sara Ahmed

+

JavaScript Enthusiast

+

β€œGreat place to get feedback on your code and build your portfolio!”

+
+
+
+
+
+
+
+
+ +
+
+

Contact Us

+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+ +
+ +
+
+
+ + + +
+ +
+

Β© 2025 CodeCanvas. Open source project for the developer community.

+

Built with ❀️ for showcasing amazing front-end projects

+
+
+ + + + + + +
+
+ +

Message Delivered

+
+
+ + + + + \ No newline at end of file diff --git a/dist/man.eb6e857b.png b/dist/man.eb6e857b.png new file mode 100644 index 0000000..573e5c8 Binary files /dev/null and b/dist/man.eb6e857b.png differ diff --git a/dist/woman.8b01508f.png b/dist/woman.8b01508f.png new file mode 100644 index 0000000..23fcf9e Binary files /dev/null and b/dist/woman.8b01508f.png differ diff --git a/index.html b/index.html index 8c5ff97..22b5977 100644 --- a/index.html +++ b/index.html @@ -28,7 +28,7 @@ Home Browse Submit - About + About Reviews Contact Us @@ -43,7 +43,7 @@
-
+

Showcase Your Front-End Creations

Discover, share, and get inspired by amazing front-end projects from developers around the world. Join the @@ -241,9 +241,6 @@

+
+

© 2025 CodeCanvas. Open source project for the developer community.

+

Built with ❀️ for showcasing amazing front-end projects

+
+ + + +

+