Mathful Interface Clone

Replicates Mathful search interface with AI capabilities

目前為 2025-02-17 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Mathful Interface Clone
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Replicates Mathful search interface with AI capabilities
// @author       PrimeMinisteModiji1111111111
// @match        https://*.mathful.com/*
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==


(function() {
    'use strict';


    // Add required styles
    const styles = `
        .mathful-container {
            min-height: 100vh;
            background-color: #F4F9FA;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
        }


        .mathful-header {
            position: sticky;
            top: 0;
            z-index: 10;
            width: 100%;
            background-color: white;
            box-shadow: 0 2px 8px 0 rgba(28,39,49,0.1);
        }


        .mathful-header-content {
            max-width: 1632px;
            margin: 0 auto;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: space-between;
            padding: 0 1rem;
        }


        .mathful-logo {
            height: 24px;
            width: 122px;
            background-size: contain;
            background-repeat: no-repeat;
        }


        .mathful-search-container {
            display: flex;
            align-items: center;
            width: 740px;
        }


        .mathful-search-form {
            position: relative;
            display: flex;
            align-items: center;
            width: 100%;
            height: 40px;
            background: white;
            border: 1px solid #E5E7EB;
            border-radius: 9999px;
            padding: 8px 75px 8px 16px;
        }


        .mathful-search-input {
            width: 100%;
            height: 100%;
            border: none;
            outline: none;
            font-size: 14px;
        }


        .mathful-search-input::placeholder {
            font-size: 16px;
            font-weight: normal;
        }


        .shadow-card3 {
            position: absolute;
            left: 0;
            top: calc(100% + 8px);
            z-index: 100;
            width: 100%;
            transform-origin: top;
            transform: scaleY(0);
            border-radius: 18px;
            background: white;
            padding: 0.75rem;
            text-align: left;
            transition: all 0.3s ease-in-out;
            opacity: 0;
            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
        }


        .upload-wrapper {
            display: flex;
            height: 254px;
            align-items: center;
            justify-content: center;
            padding: 0;
        }


        .upload-drag {
            width: 100%;
            height: 100%;
            border: 2px dashed #E5E7EB;
            border-radius: 16px;
            display: flex;
            align-items: center;
            justify-content: center;
            cursor: pointer;
        }


        .upload-container {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            gap: 12px;
            padding: 12px;
        }


        .upload-icon {
            height: 64px;
            width: 64px;
            background-color: #F3F4F6;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
        }


        .shortcut-key {
            display: inline-block;
            border: 1px solid #94A2AE;
            border-opacity: 0.3;
            padding: 0 2px;
            border-radius: 4px;
        }


        .nav-links {
            display: flex;
            gap: 24px;
            align-items: center;
        }


        .nav-link {
            color: #12000873;
            text-decoration: none;
            font-weight: 500;
        }


        .nav-link:hover {
            color: #12957D;
        }


        .calculator-icon {
            position: absolute;
            right: 50px;
            z-index: 3;
            height: 24px;
            width: 24px;
            cursor: pointer;
            color: rgba(18, 0, 8, 0.45);
        }


        .calculator-icon:hover {
            color: #12957D;
        }


        .submit-button {
            position: absolute;
            right: 8px;
            top: 50%;
            transform: translateY(-50%);
            z-index: 10;
            display: flex;
            align-items: center;
            justify-content: center;
            border-left: 1px solid #E5E7EB;
            padding-left: 12px;
            background: none;
            border: none;
            cursor: pointer;
            color: rgba(18, 0, 8, 0.5);
        }


        .submit-button:hover {
            color: #12957D;
        }
    `;


    GM_addStyle(styles);


    // Create and inject the main interface
    function createInterface() {
        const container = document.createElement('div');
        container.className = 'mathful-container';
        container.innerHTML = `
            <header class="mathful-header">
                <div class="mathful-header-content">
                    <a href="/" class="mathful-logo"></a>
                    <div class="mathful-search-container">
                        <form class="mathful-search-form">
                            <input type="text" 
                                   class="mathful-search-input" 
                                   placeholder="Type or upload your question" 
                                   required />
                            <div class="shadow-card3">
                                <div class="upload-wrapper">
                                    <div class="upload-drag">
                                        <div class="upload-container">
                                            <div class="upload-icon">
                                                <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
                                                    <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
                                                    <path d="M7 10l5-5 5 5M12 15V5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                                                </svg>
                                            </div>
                                            <p>Drag image here or click to upload</p>
                                            <div>
                                                Or press <span class="shortcut-key">Ctrl</span> + 
                                                <span class="shortcut-key">V</span> to paste
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="calculator-icon">
                                <svg viewBox="0 0 24 24" width="24" height="24">
                                    <path fill="currentColor" d="M4 2h16a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zm0 2v16h16V4H4zm2 2h12v4H6V6zm0 6h4v2H6v-2zm0 4h4v2H6v-2zm6-4h6v2h-6v-2zm0 4h6v2h-6v-2z"/>
                                </svg>
                            </div>
                            <button type="submit" class="submit-button">
                                <svg viewBox="0 0 24 24" width="20" height="20">
                                    <path fill="currentColor" d="M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
                                </svg>
                            </button>
                        </form>
                    </div>
                    <nav class="nav-links">
                        <a href="/photomath" class="nav-link">Photomath</a>
                        <a href="/mathgpt" class="nav-link">MathGPT</a>
                        <a href="/hub" class="nav-link">Resources</a>
                        <a href="/pricing" class="nav-link">Pricing</a>
                        <a href="/login" class="nav-link">Login</a>
                    </nav>
                </div>
            </header>
            <main>
                <div id="mathful-content"></div>
            </main>
        `;


        document.body.innerHTML = '';
        document.body.appendChild(container);
    }


    // Initialize drag and drop functionality
    function initializeUpload() {
        const dropZone = document.querySelector('.upload-drag');
        const searchInput = document.querySelector('.mathful-search-input');


        searchInput.addEventListener('focus', () => {
            const uploadZone = document.querySelector('.shadow-card3');
            uploadZone.style.transform = 'scaleY(1)';
            uploadZone.style.opacity = '1';
        });


        document.addEventListener('click', (e) => {
            if (!e.target.closest('.mathful-search-form')) {
                const uploadZone = document.querySelector('.shadow-card3');
                uploadZone.style.transform = 'scaleY(0)';
                uploadZone.style.opacity = '0';
            }
        });


        dropZone.addEventListener('dragover', (e) => {
            e.preventDefault();
            dropZone.style.borderColor = '#12957D';
        });


        dropZone.addEventListener('dragleave', (e) => {
            e.preventDefault();
            dropZone.style.borderColor = '#E5E7EB';
        });


        dropZone.addEventListener('drop', (e) => {
            e.preventDefault();
            const files = e.dataTransfer.files;
            if (files.length > 0) {
                handleFileUpload(files[0]);
            }
        });


        document.addEventListener('paste', (e) => {
            const items = e.clipboardData.items;
            for (let item of items) {
                if (item.type.indexOf('image') !== -1) {
                    const file = item.getAsFile();
                    handleFileUpload(file);
                    break;
                }
            }
        });
    }


    // Handle file upload
    function handleFileUpload(file) {
        if (file.type.startsWith('image/')) {
            const reader = new FileReader();
            reader.onload = (e) => {
                console.log('Image uploaded:', e.target.result);
                // TODO: Implement image processing and math recognition
            };
            reader.readAsDataURL(file);
        }
    }


    // Initialize search functionality
    function initializeSearch() {
        const searchForm = document.querySelector('.mathful-search-form');
        const searchInput = document.querySelector('.mathful-search-input');


        searchForm.addEventListener('submit', async (e) => {
            e.preventDefault();
            const query = searchInput.value.trim();
            if (query) {
                console.log('Search query:', query);
                // TODO: Implement search API call
            }
        });
    }


    // Wait for page load then initialize
    window.addEventListener('load', () => {
        createInterface();
        initializeSearch();
        initializeUpload();
    });


})();