diff --git a/daring-daffodils/.github/workflows/lint.yaml b/daring-daffodils/.github/workflows/lint.yaml
new file mode 100644
index 00000000..7f67e803
--- /dev/null
+++ b/daring-daffodils/.github/workflows/lint.yaml
@@ -0,0 +1,35 @@
+# GitHub Action workflow enforcing our code style.
+
+name: Lint
+
+# Trigger the workflow on both push (to the main repository, on the main branch)
+# and pull requests (against the main repository, but from any repo, from any branch).
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+# Brand new concurrency setting! This ensures that not more than one run can be triggered for the same commit.
+# It is useful for pull requests coming from the main repository since both triggers will match.
+concurrency: lint-${{ github.sha }}
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+
+ env:
+ # The Python version your project uses. Feel free to change this if required.
+ PYTHON_VERSION: "3.12"
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up Python ${{ env.PYTHON_VERSION }}
+ uses: actions/setup-python@v5
+ with:
+ python-version: ${{ env.PYTHON_VERSION }}
+
+ - name: Run pre-commit hooks
+ uses: pre-commit/action@v3.0.1
diff --git a/daring-daffodils/.gitignore b/daring-daffodils/.gitignore
new file mode 100644
index 00000000..233eb87e
--- /dev/null
+++ b/daring-daffodils/.gitignore
@@ -0,0 +1,31 @@
+# Files generated by the interpreter
+__pycache__/
+*.py[cod]
+
+# Environment specific
+.venv
+venv
+.env
+env
+
+# Unittest reports
+.coverage*
+
+# Logs
+*.log
+
+# PyEnv version selector
+.python-version
+
+# Built objects
+*.so
+dist/
+build/
+
+# IDEs
+# PyCharm
+.idea/
+# VSCode
+.vscode/
+# MacOS
+.DS_Store
diff --git a/daring-daffodils/.pre-commit-config.yaml b/daring-daffodils/.pre-commit-config.yaml
new file mode 100644
index 00000000..c0a8de23
--- /dev/null
+++ b/daring-daffodils/.pre-commit-config.yaml
@@ -0,0 +1,18 @@
+# Pre-commit configuration.
+# See https://github.com/python-discord/code-jam-template/tree/main#pre-commit-run-linting-before-committing
+
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v5.0.0
+ hooks:
+ - id: check-toml
+ - id: check-yaml
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
+ args: [--markdown-linebreak-ext=md]
+
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.12.2
+ hooks:
+ - id: ruff-check
+ - id: ruff-format
diff --git a/daring-daffodils/LICENSE b/daring-daffodils/LICENSE
new file mode 100644
index 00000000..5a04926b
--- /dev/null
+++ b/daring-daffodils/LICENSE
@@ -0,0 +1,7 @@
+Copyright 2021 Python Discord
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/daring-daffodils/Makefile b/daring-daffodils/Makefile
new file mode 100644
index 00000000..544fd4f3
--- /dev/null
+++ b/daring-daffodils/Makefile
@@ -0,0 +1,45 @@
+# --- CONFIG ---
+VENV = .venv
+PYTHON = python3
+ifeq ($(OS),Windows_NT)
+ ENVPYTHON := $(VENV)/Scripts/python
+ POETRY := $(VENV)/Scripts/poetry
+ PIP := $(VENV)/Scripts/pip
+else
+ ENVPYTHON := $(VENV)/bin/python
+ POETRY := $(VENV)/bin/poetry
+ PIP := $(VENV)/bin/pip
+endif
+
+PYTHON3_OK := $(shell type -P python3)
+ifeq ('$(PYTHON3_OK)','')
+ PYTHON = python
+endif
+
+# --- TARGETS ---
+
+.PHONY: all setup run clean
+
+all: run
+
+# Ensure venv exists
+$(VENV):
+ @echo "👉 Creating virtual environment..."
+ @$(PYTHON) -m venv $(VENV)
+
+# Install Poetry inside venv if missing
+$(POETRY): $(VENV)
+ @echo "👉 Ensuring Poetry is installed..."
+ @$(PIP) install poetry
+
+setup: $(POETRY)
+ @echo "👉 Installing dependencies..."
+ @$(POETRY) install --no-root
+
+run: setup
+ @echo "👉 Running uvicorn server..."
+ @$(ENVPYTHON) app.py
+
+clean:
+ @echo "🧹 Cleaning up..."
+ @rm -rf $(VENV)
diff --git a/daring-daffodils/README.md b/daring-daffodils/README.md
new file mode 100644
index 00000000..a6d9d88c
--- /dev/null
+++ b/daring-daffodils/README.md
@@ -0,0 +1,264 @@
+# Misclick
+
+
+
+
"Wrong mouse, for a reason"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ![]() + Mobile page + |
+
+ ![]() + Browser extension + |
+
+ ![]() + Browser extension - Basic movement + |
+
+ ![]() + Browser extension - Mode Activation + |
+
+ ![]() + Browser extension - Selection + |
+
+ ![]() + Text Received by phone + |
+
+
+
+
+
which turns-out to be your
+ new cursor!
+- When a `delta` is received from the mobile page, it is rescaled to match the browser’s dimensions and projected onto the browser. This causes the cursor to move according to the user’s interaction.
+- It would get the type of event's user has sent like scroll, drag, selection and corresponding actions are performed
+
+PS: All `delta` should be reversed inside the browser to do the opposite interaction on browser
+##### Clicks
+- if a click is fired from the user side, then a `MouseEvent` is fired on browser
+#### Scroll
+- `touchstart` event detection along with finger counting
+##### Drag
+- Tap for 300ms and scroll, is considered as the Drag
+##### Selection
+- It could send user selected text to their connected phone
+- Defines a rectangle using the given screen coordinates (x1, y1) and (x2, y2).
+- Walks through all text nodes in the document body.
+- For each text node, checks whether any part of its bounding client rect intersects with the defined rectangle.
+- If overlapping text is found:
+ - Collects and returns the text content (whitespace-trimmed).
+ - Visually highlights the region by overlaying a semi-transparent blue box.
+ - The highlight box automatically disappears after 2 seconds.
+
+**Although, all our core functionality and logic are in python**
+ PyScript: Access to local files + (using "Paths:" in <py-env>) + is not available when directly opening a HTML file; + you must use a webserver to serve the additional files. + See this reference + on starting a simple webserver with Python.
`; + } + else if (e.message.includes('404')) { + errorContent = + `PyScript: Loading from file ` + + singleFile + + ` failed with error 404 (File not Found). Are your filename and path are correct?
`; + } + else { + errorContent = 'PyScript encountered an error while loading from file: ' + e.message + '
'; + } + showError(errorContent); + } + function readTextFromPath(path) { + const request = new XMLHttpRequest(); + request.open("GET", path, false); + request.send(); + const returnValue = request.responseText; + return returnValue; + } + function fillUserData(inputConfig, resultConfig) { + for (const key in inputConfig) { + // fill in all extra keys ignored by the validator + if (!(key in defaultConfig$1)) { + resultConfig[key] = inputConfig[key]; + } + } + return resultConfig; + } + function mergeConfig(inlineConfig, externalConfig) { + if (Object.keys(inlineConfig).length === 0 && Object.keys(externalConfig).length === 0) { + return defaultConfig$1; + } + else if (Object.keys(inlineConfig).length === 0) { + return externalConfig; + } + else if (Object.keys(externalConfig).length === 0) { + return inlineConfig; + } + else { + let merged = {}; + for (const keyType in allKeys) { + const keys = allKeys[keyType]; + keys.forEach(function (item) { + if (keyType === "boolean") { + merged[item] = (typeof inlineConfig[item] !== "undefined") ? inlineConfig[item] : externalConfig[item]; + } + else { + merged[item] = inlineConfig[item] || externalConfig[item]; + } + }); + } + // fill extra keys from external first + // they will be overridden by inline if extra keys also clash + merged = fillUserData(externalConfig, merged); + merged = fillUserData(inlineConfig, merged); + return merged; + } + } + function parseConfig(configText, configType = "toml") { + let config; + if (configType === "toml") { + try { + // TOML parser is soft and can parse even JSON strings, this additional check prevents it. + if (configText.trim()[0] === "{") { + const errMessage = `config supplied: ${configText} is an invalid TOML and cannot be parsed`; + showError(`${errMessage}
`); + throw Error(errMessage); + } + config = toml.parse(configText); + } + catch (err) { + const errMessage = err.toString(); + showError(`config supplied: ${configText} is an invalid TOML and cannot be parsed: ${errMessage}
`); + throw err; + } + } + else if (configType === "json") { + try { + config = JSON.parse(configText); + } + catch (err) { + const errMessage = err.toString(); + showError(`config supplied: ${configText} is an invalid JSON and cannot be parsed: ${errMessage}
`); + throw err; + } + } + else { + showError(`type of config supplied is: ${configType}, supported values are ["toml", "json"].
`); + } + return config; + } + function validateConfig(configText, configType = "toml") { + const config = parseConfig(configText, configType); + const finalConfig = {}; + for (const keyType in allKeys) { + const keys = allKeys[keyType]; + keys.forEach(function (item) { + if (validateParamInConfig(item, keyType, config)) { + if (item === "runtimes") { + finalConfig[item] = []; + const runtimes = config[item]; + runtimes.forEach(function (eachRuntime) { + const runtimeConfig = {}; + for (const eachRuntimeParam in eachRuntime) { + if (validateParamInConfig(eachRuntimeParam, "string", eachRuntime)) { + runtimeConfig[eachRuntimeParam] = eachRuntime[eachRuntimeParam]; + } + } + finalConfig[item].push(runtimeConfig); + }); + } + else { + finalConfig[item] = config[item]; + } + } + }); + } + return fillUserData(config, finalConfig); + } + function validateParamInConfig(paramName, paramType, config) { + if (paramName in config) { + return paramType === "array" ? Array.isArray(config[paramName]) : typeof config[paramName] === paramType; + } + return false; + } + + const logger$b = getLogger('pyscript/base'); + // Global `Runtime` that implements the generic runtimes API + let runtime$2; + let Element; + runtimeLoaded.subscribe(value => { + runtime$2 = value; + }); + class BaseEvalElement extends HTMLElement { + shadow; + wrapper; + code; + source; + btnConfig; + btnRun; + outputElement; + errorElement; + theme; + appendOutput; + constructor() { + super(); + // attach shadow so we can preserve the element original innerHtml content + this.shadow = this.attachShadow({ mode: 'open' }); + this.wrapper = document.createElement('slot'); + this.shadow.appendChild(this.wrapper); + this.setOutputMode("append"); + } + addToOutput(s) { + this.outputElement.innerHTML += '