{"id":67,"date":"2026-09-18T05:48:24","date_gmt":"2026-09-18T05:48:24","guid":{"rendered":"https:\/\/anthoniabirthguide.online\/?page_id=67"},"modified":"2026-09-18T05:49:01","modified_gmt":"2026-09-18T05:49:01","slug":"calculator","status":"publish","type":"page","link":"https:\/\/anthoniabirthguide.online\/?page_id=67","title":{"rendered":"calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"67\" class=\"elementor elementor-67\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3471d57 e-flex e-con-boxed e-con e-parent\" data-id=\"3471d57\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-546a529 elementor-widget elementor-widget-html\" data-id=\"546a529\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\" data-theme=\"dark\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <meta name=\"description\" content=\"NOVA Scientific \u2014 advanced offline scientific calculator and unit converter.\">\r\n    <title>NOVA Scientific Calculator<\/title>\r\n\r\n    <style>\r\n        \/* =========================================================\r\n           01. DESIGN TOKENS\r\n        ========================================================== *\/\r\n        :root {\r\n            color-scheme: dark;\r\n            --bg: #0e1117;\r\n            --surface: #151a23;\r\n            --surface-2: #1b2230;\r\n            --surface-3: #222b3a;\r\n            --display: #0b0e13;\r\n            --text: #f5f7fb;\r\n            --muted: #9ba6b5;\r\n            --subtle: #6f7b8b;\r\n            --border: #2a3443;\r\n            --border-strong: #39475b;\r\n            --accent: #7ea2ff;\r\n            --accent-strong: #5f87ee;\r\n            --accent-soft: rgba(126, 162, 255, 0.14);\r\n            --danger: #ff8f8f;\r\n            --danger-soft: rgba(255, 143, 143, 0.12);\r\n            --success: #7fd6a6;\r\n            --warning: #f1c46f;\r\n            --shadow: 0 18px 45px rgba(0, 0, 0, 0.28);\r\n            --radius-xl: 22px;\r\n            --radius-lg: 16px;\r\n            --radius-md: 12px;\r\n            --radius-sm: 9px;\r\n            --transition: 160ms ease;\r\n            --max-width: 1400px;\r\n        }\r\n\r\n        html[data-theme=\"light\"] {\r\n            color-scheme: light;\r\n            --bg: #eef2f7;\r\n            --surface: #ffffff;\r\n            --surface-2: #f6f8fb;\r\n            --surface-3: #edf1f6;\r\n            --display: #f7f9fc;\r\n            --text: #18202b;\r\n            --muted: #596678;\r\n            --subtle: #7e8996;\r\n            --border: #d7dee8;\r\n            --border-strong: #c4ceda;\r\n            --accent: #315fc9;\r\n            --accent-strong: #244aa6;\r\n            --accent-soft: rgba(49, 95, 201, 0.10);\r\n            --danger: #b84040;\r\n            --danger-soft: rgba(184, 64, 64, 0.10);\r\n            --success: #24794b;\r\n            --warning: #956900;\r\n            --shadow: 0 18px 45px rgba(25, 40, 60, 0.12);\r\n        }\r\n\r\n        \/* =========================================================\r\n           02. RESET & BASE\r\n        ========================================================== *\/\r\n        *,\r\n        *::before,\r\n        *::after {\r\n            box-sizing: border-box;\r\n        }\r\n\r\n        html {\r\n            font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n            background: var(--bg);\r\n        }\r\n\r\n        body {\r\n            margin: 0;\r\n            min-width: 320px;\r\n            min-height: 100%;\r\n            background: var(--bg);\r\n            color: var(--text);\r\n            line-height: 1.5;\r\n            -webkit-font-smoothing: antialiased;\r\n        }\r\n\r\n        button,\r\n        input,\r\n        select {\r\n            font: inherit;\r\n        }\r\n\r\n        button,\r\n        select {\r\n            color: inherit;\r\n        }\r\n\r\n        button {\r\n            border: 0;\r\n        }\r\n\r\n        button:focus-visible,\r\n        input:focus-visible,\r\n        select:focus-visible {\r\n            outline: 3px solid color-mix(in srgb, var(--accent) 58%, transparent);\r\n            outline-offset: 2px;\r\n        }\r\n\r\n        [hidden] {\r\n            display: none !important;\r\n        }\r\n\r\n        ::selection {\r\n            background: var(--accent-soft);\r\n        }\r\n\r\n        \/* =========================================================\r\n           03. APP SHELL\r\n        ========================================================== *\/\r\n        .app-shell {\r\n            width: min(100% - 24px, var(--max-width));\r\n            margin: 18px auto 28px;\r\n        }\r\n\r\n        .app-header {\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: space-between;\r\n            gap: 16px;\r\n            margin-bottom: 14px;\r\n        }\r\n\r\n        .brand-group {\r\n            min-width: 0;\r\n        }\r\n\r\n        .brand-kicker {\r\n            margin: 0 0 2px;\r\n            color: var(--muted);\r\n            font-size: 0.72rem;\r\n            font-weight: 700;\r\n            letter-spacing: 0.16em;\r\n            text-transform: uppercase;\r\n        }\r\n\r\n        .brand-title {\r\n            margin: 0;\r\n            font-size: clamp(1.15rem, 2vw, 1.48rem);\r\n            line-height: 1.15;\r\n            letter-spacing: -0.025em;\r\n        }\r\n\r\n        .header-actions {\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: flex-end;\r\n            flex-wrap: wrap;\r\n            gap: 8px;\r\n        }\r\n\r\n        .mode-switch,\r\n        .segment-control {\r\n            display: inline-flex;\r\n            align-items: center;\r\n            gap: 4px;\r\n            padding: 4px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 12px;\r\n            background: var(--surface);\r\n        }\r\n\r\n        .mode-button,\r\n        .segment-button,\r\n        .icon-button,\r\n        .soft-button {\r\n            min-height: 42px;\r\n            border-radius: 9px;\r\n            background: transparent;\r\n            color: var(--muted);\r\n            cursor: pointer;\r\n            transition: background var(--transition), color var(--transition), transform var(--transition), border-color var(--transition);\r\n        }\r\n\r\n        .mode-button,\r\n        .segment-button {\r\n            padding: 0 13px;\r\n            font-size: 0.86rem;\r\n            font-weight: 750;\r\n        }\r\n\r\n        .mode-button[aria-pressed=\"true\"],\r\n        .segment-button[aria-pressed=\"true\"] {\r\n            background: var(--accent-soft);\r\n            color: var(--accent);\r\n        }\r\n\r\n        .icon-button,\r\n        .soft-button {\r\n            border: 1px solid var(--border);\r\n            background: var(--surface);\r\n        }\r\n\r\n        .icon-button {\r\n            width: 44px;\r\n            display: inline-grid;\r\n            place-items: center;\r\n            font-size: 1.05rem;\r\n        }\r\n\r\n        .soft-button {\r\n            padding: 0 13px;\r\n            font-size: 0.82rem;\r\n            font-weight: 750;\r\n        }\r\n\r\n        @media (hover: hover) and (pointer: fine) {\r\n            .mode-button:hover,\r\n            .segment-button:hover,\r\n            .icon-button:hover,\r\n            .soft-button:hover {\r\n                color: var(--text);\r\n                background: var(--surface-2);\r\n            }\r\n        }\r\n\r\n        .mode-button:active,\r\n        .segment-button:active,\r\n        .icon-button:active,\r\n        .soft-button:active {\r\n            transform: translateY(1px);\r\n        }\r\n\r\n        \/* =========================================================\r\n           04. LAYOUT\r\n        ========================================================== *\/\r\n        .workspace {\r\n            display: grid;\r\n            grid-template-columns: minmax(0, 1fr) 320px;\r\n            gap: 14px;\r\n            align-items: start;\r\n        }\r\n\r\n        .calculator-panel,\r\n        .history-panel,\r\n        .converter-panel,\r\n        .settings-panel {\r\n            border: 1px solid var(--border);\r\n            background: var(--surface);\r\n            border-radius: var(--radius-xl);\r\n            box-shadow: var(--shadow);\r\n        }\r\n\r\n        .calculator-panel {\r\n            overflow: hidden;\r\n        }\r\n\r\n        .calculator-body {\r\n            padding: 14px;\r\n        }\r\n\r\n        .history-panel {\r\n            padding: 14px;\r\n            position: sticky;\r\n            top: 14px;\r\n        }\r\n\r\n        \/* =========================================================\r\n           05. DISPLAY\r\n        ========================================================== *\/\r\n        .display {\r\n            padding: 16px 16px 14px;\r\n            background: var(--display);\r\n            border-bottom: 1px solid var(--border);\r\n        }\r\n\r\n        .display-topline {\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: space-between;\r\n            gap: 10px;\r\n            margin-bottom: 10px;\r\n        }\r\n\r\n        .indicators {\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            gap: 6px;\r\n            min-width: 0;\r\n        }\r\n\r\n        .indicator {\r\n            display: inline-flex;\r\n            align-items: center;\r\n            min-height: 24px;\r\n            padding: 0 8px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 999px;\r\n            color: var(--muted);\r\n            font-size: 0.68rem;\r\n            font-weight: 800;\r\n            letter-spacing: 0.04em;\r\n        }\r\n\r\n        .indicator.is-active {\r\n            border-color: color-mix(in srgb, var(--accent) 45%, var(--border));\r\n            background: var(--accent-soft);\r\n            color: var(--accent);\r\n        }\r\n\r\n        .display-tools {\r\n            display: flex;\r\n            gap: 7px;\r\n            flex-shrink: 0;\r\n        }\r\n\r\n        .display-tool {\r\n            min-height: 34px;\r\n            padding: 0 10px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 8px;\r\n            background: transparent;\r\n            color: var(--muted);\r\n            cursor: pointer;\r\n            font-size: 0.76rem;\r\n            font-weight: 800;\r\n        }\r\n\r\n        .expression-input {\r\n            width: 100%;\r\n            min-height: 52px;\r\n            padding: 6px 0 4px;\r\n            border: 0;\r\n            background: transparent;\r\n            color: var(--text);\r\n            font-size: clamp(1.12rem, 2.6vw, 1.58rem);\r\n            font-weight: 560;\r\n            letter-spacing: 0.005em;\r\n            outline: none;\r\n            font-variant-numeric: tabular-nums;\r\n        }\r\n\r\n        .result-row {\r\n            display: flex;\r\n            align-items: end;\r\n            justify-content: space-between;\r\n            gap: 12px;\r\n            min-height: 62px;\r\n            margin-top: 2px;\r\n        }\r\n\r\n        .result-output {\r\n            min-width: 0;\r\n            max-width: 100%;\r\n            overflow-x: auto;\r\n            overflow-y: hidden;\r\n            color: var(--text);\r\n            font-size: clamp(1.85rem, 5vw, 3rem);\r\n            font-weight: 760;\r\n            line-height: 1.08;\r\n            letter-spacing: -0.035em;\r\n            white-space: nowrap;\r\n            font-variant-numeric: tabular-nums;\r\n            scrollbar-width: thin;\r\n        }\r\n\r\n        .preview-output {\r\n            flex: 0 0 auto;\r\n            max-width: 46%;\r\n            padding-bottom: 4px;\r\n            overflow: hidden;\r\n            color: var(--muted);\r\n            font-size: 0.9rem;\r\n            text-overflow: ellipsis;\r\n            white-space: nowrap;\r\n            font-variant-numeric: tabular-nums;\r\n        }\r\n\r\n        .message-line {\r\n            min-height: 24px;\r\n            margin-top: 6px;\r\n            color: var(--muted);\r\n            font-size: 0.8rem;\r\n        }\r\n\r\n        .message-line.is-error {\r\n            color: var(--danger);\r\n        }\r\n\r\n        .message-line.is-success {\r\n            color: var(--success);\r\n        }\r\n\r\n        \/* =========================================================\r\n           06. CALCULATOR CONTROLS\r\n        ========================================================== *\/\r\n        .control-strip {\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: space-between;\r\n            gap: 10px;\r\n            flex-wrap: wrap;\r\n            margin-bottom: 10px;\r\n        }\r\n\r\n        .control-strip-group {\r\n            display: flex;\r\n            align-items: center;\r\n            flex-wrap: wrap;\r\n            gap: 7px;\r\n        }\r\n\r\n        .tiny-button {\r\n            min-height: 38px;\r\n            min-width: 46px;\r\n            padding: 0 11px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 9px;\r\n            background: var(--surface-2);\r\n            color: var(--muted);\r\n            cursor: pointer;\r\n            font-size: 0.74rem;\r\n            font-weight: 800;\r\n            transition: background var(--transition), color var(--transition), transform var(--transition), border-color var(--transition);\r\n        }\r\n\r\n        .tiny-button[aria-pressed=\"true\"] {\r\n            border-color: color-mix(in srgb, var(--accent) 40%, var(--border));\r\n            background: var(--accent-soft);\r\n            color: var(--accent);\r\n        }\r\n\r\n        .tiny-button.is-danger {\r\n            color: var(--danger);\r\n        }\r\n\r\n        @media (hover: hover) and (pointer: fine) {\r\n            .tiny-button:hover {\r\n                background: var(--surface-3);\r\n                color: var(--text);\r\n            }\r\n        }\r\n\r\n        .keypad-layout {\r\n            display: grid;\r\n            grid-template-columns: minmax(0, 1.35fr) minmax(280px, 0.85fr);\r\n            gap: 10px;\r\n        }\r\n\r\n        .scientific-grid,\r\n        .numeric-grid {\r\n            display: grid;\r\n            gap: 8px;\r\n        }\r\n\r\n        .scientific-grid {\r\n            grid-template-columns: repeat(6, minmax(0, 1fr));\r\n        }\r\n\r\n        .numeric-grid {\r\n            grid-template-columns: repeat(4, minmax(0, 1fr));\r\n        }\r\n\r\n        .calc-key {\r\n            position: relative;\r\n            min-width: 0;\r\n            min-height: 50px;\r\n            padding: 8px 6px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 11px;\r\n            background: var(--surface-2);\r\n            color: var(--text);\r\n            cursor: pointer;\r\n            font-size: 0.9rem;\r\n            font-weight: 700;\r\n            line-height: 1.15;\r\n            transition: transform 120ms ease, background var(--transition), border-color var(--transition), color var(--transition);\r\n            user-select: none;\r\n            -webkit-tap-highlight-color: transparent;\r\n        }\r\n\r\n        .calc-key.key-number {\r\n            background: var(--surface);\r\n            font-size: 1rem;\r\n            font-weight: 800;\r\n        }\r\n\r\n        .calc-key.key-operator {\r\n            color: var(--accent);\r\n            font-size: 1.05rem;\r\n        }\r\n\r\n        .calc-key.key-function {\r\n            color: var(--muted);\r\n            font-size: 0.82rem;\r\n        }\r\n\r\n        .calc-key.key-danger {\r\n            color: var(--danger);\r\n            background: var(--danger-soft);\r\n        }\r\n\r\n        .calc-key.key-equals {\r\n            border-color: var(--accent);\r\n            background: var(--accent);\r\n            color: #0b1020;\r\n            font-size: 1.08rem;\r\n            font-weight: 900;\r\n        }\r\n\r\n        html[data-theme=\"light\"] .calc-key.key-equals {\r\n            color: #ffffff;\r\n        }\r\n\r\n        .calc-key.key-shifted,\r\n        .calc-key.is-flashed {\r\n            border-color: color-mix(in srgb, var(--accent) 58%, var(--border));\r\n            background: var(--accent-soft);\r\n            color: var(--accent);\r\n        }\r\n\r\n        @media (hover: hover) and (pointer: fine) {\r\n            .calc-key:hover {\r\n                border-color: var(--border-strong);\r\n                background: var(--surface-3);\r\n            }\r\n\r\n            .calc-key.key-equals:hover {\r\n                border-color: var(--accent-strong);\r\n                background: var(--accent-strong);\r\n            }\r\n        }\r\n\r\n        .calc-key:active,\r\n        .calc-key.is-flashed {\r\n            transform: translateY(1px) scale(0.985);\r\n        }\r\n\r\n        \/* =========================================================\r\n           07. HISTORY\r\n        ========================================================== *\/\r\n        .panel-heading {\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: space-between;\r\n            gap: 10px;\r\n            margin-bottom: 12px;\r\n        }\r\n\r\n        .panel-title {\r\n            margin: 0;\r\n            font-size: 0.98rem;\r\n            letter-spacing: -0.01em;\r\n        }\r\n\r\n        .history-list {\r\n            display: grid;\r\n            gap: 8px;\r\n            max-height: 580px;\r\n            overflow-y: auto;\r\n            padding-right: 2px;\r\n            scrollbar-width: thin;\r\n        }\r\n\r\n        .history-empty {\r\n            padding: 22px 12px;\r\n            border: 1px dashed var(--border);\r\n            border-radius: 12px;\r\n            color: var(--muted);\r\n            text-align: center;\r\n            font-size: 0.84rem;\r\n        }\r\n\r\n        .history-item {\r\n            position: relative;\r\n            padding: 11px 38px 10px 11px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 12px;\r\n            background: var(--surface-2);\r\n        }\r\n\r\n        .history-expression,\r\n        .history-result {\r\n            width: 100%;\r\n            padding: 0;\r\n            border: 0;\r\n            background: transparent;\r\n            text-align: left;\r\n            cursor: pointer;\r\n            font-variant-numeric: tabular-nums;\r\n        }\r\n\r\n        .history-expression {\r\n            overflow: hidden;\r\n            color: var(--muted);\r\n            font-size: 0.78rem;\r\n            text-overflow: ellipsis;\r\n            white-space: nowrap;\r\n        }\r\n\r\n        .history-result {\r\n            margin-top: 3px;\r\n            overflow: hidden;\r\n            color: var(--text);\r\n            font-size: 1rem;\r\n            font-weight: 820;\r\n            text-overflow: ellipsis;\r\n            white-space: nowrap;\r\n        }\r\n\r\n        .history-time {\r\n            display: block;\r\n            margin-top: 5px;\r\n            color: var(--subtle);\r\n            font-size: 0.68rem;\r\n        }\r\n\r\n        .history-delete {\r\n            position: absolute;\r\n            top: 8px;\r\n            right: 8px;\r\n            width: 28px;\r\n            height: 28px;\r\n            border-radius: 8px;\r\n            background: transparent;\r\n            color: var(--subtle);\r\n            cursor: pointer;\r\n        }\r\n\r\n        \/* =========================================================\r\n           08. CONVERTER\r\n        ========================================================== *\/\r\n        .converter-panel {\r\n            padding: 18px;\r\n        }\r\n\r\n        .converter-head {\r\n            display: flex;\r\n            align-items: start;\r\n            justify-content: space-between;\r\n            gap: 12px;\r\n            margin-bottom: 18px;\r\n        }\r\n\r\n        .converter-title {\r\n            margin: 0 0 3px;\r\n            font-size: 1.12rem;\r\n        }\r\n\r\n        .converter-subtitle {\r\n            margin: 0;\r\n            color: var(--muted);\r\n            font-size: 0.82rem;\r\n        }\r\n\r\n        .converter-grid {\r\n            display: grid;\r\n            grid-template-columns: repeat(2, minmax(0, 1fr));\r\n            gap: 14px;\r\n        }\r\n\r\n        .converter-card {\r\n            padding: 14px;\r\n            border: 1px solid var(--border);\r\n            border-radius: var(--radius-lg);\r\n            background: var(--surface-2);\r\n        }\r\n\r\n        .field-label {\r\n            display: block;\r\n            margin-bottom: 6px;\r\n            color: var(--muted);\r\n            font-size: 0.74rem;\r\n            font-weight: 780;\r\n            letter-spacing: 0.03em;\r\n            text-transform: uppercase;\r\n        }\r\n\r\n        .field-control {\r\n            width: 100%;\r\n            min-height: 48px;\r\n            padding: 0 12px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 10px;\r\n            background: var(--surface);\r\n            color: var(--text);\r\n            outline: none;\r\n        }\r\n\r\n        .field-stack {\r\n            display: grid;\r\n            gap: 12px;\r\n        }\r\n\r\n        .converter-result {\r\n            display: flex;\r\n            align-items: end;\r\n            min-height: 48px;\r\n            padding: 8px 12px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 10px;\r\n            background: var(--display);\r\n            color: var(--text);\r\n            font-size: 1.1rem;\r\n            font-weight: 820;\r\n            font-variant-numeric: tabular-nums;\r\n            overflow-wrap: anywhere;\r\n        }\r\n\r\n        \/* =========================================================\r\n           09. SETTINGS DIALOG\r\n        ========================================================== *\/\r\n        .settings-backdrop {\r\n            position: fixed;\r\n            inset: 0;\r\n            z-index: 40;\r\n            display: grid;\r\n            place-items: center;\r\n            padding: 18px;\r\n            background: rgba(3, 7, 12, 0.66);\r\n        }\r\n\r\n        .settings-panel {\r\n            width: min(100%, 520px);\r\n            max-height: min(720px, calc(100vh - 36px));\r\n            overflow-y: auto;\r\n            padding: 18px;\r\n        }\r\n\r\n        .settings-list {\r\n            display: grid;\r\n            gap: 14px;\r\n        }\r\n\r\n        .setting-row {\r\n            display: grid;\r\n            grid-template-columns: minmax(0, 1fr) minmax(160px, 0.62fr);\r\n            gap: 14px;\r\n            align-items: center;\r\n        }\r\n\r\n        .setting-copy strong {\r\n            display: block;\r\n            font-size: 0.88rem;\r\n        }\r\n\r\n        .setting-copy span {\r\n            display: block;\r\n            margin-top: 2px;\r\n            color: var(--muted);\r\n            font-size: 0.76rem;\r\n        }\r\n\r\n        .settings-footer {\r\n            display: flex;\r\n            justify-content: flex-end;\r\n            gap: 8px;\r\n            margin-top: 18px;\r\n        }\r\n\r\n        .shortcut-list {\r\n            display: grid;\r\n            grid-template-columns: repeat(2, minmax(0, 1fr));\r\n            gap: 7px 12px;\r\n            padding: 12px;\r\n            border: 1px solid var(--border);\r\n            border-radius: 12px;\r\n            background: var(--surface-2);\r\n        }\r\n\r\n        .shortcut-item {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            gap: 10px;\r\n            color: var(--muted);\r\n            font-size: 0.76rem;\r\n        }\r\n\r\n        .shortcut-item kbd {\r\n            min-width: 32px;\r\n            padding: 2px 7px;\r\n            border: 1px solid var(--border-strong);\r\n            border-radius: 6px;\r\n            background: var(--surface);\r\n            color: var(--text);\r\n            text-align: center;\r\n            font: inherit;\r\n            font-weight: 780;\r\n        }\r\n\r\n        \/* =========================================================\r\n           10. MOBILE HISTORY DRAWER\r\n        ========================================================== *\/\r\n        .mobile-history-toggle {\r\n            display: none;\r\n        }\r\n\r\n        .mobile-history-backdrop {\r\n            display: none;\r\n        }\r\n\r\n        \/* =========================================================\r\n           11. RESPONSIVE\r\n        ========================================================== *\/\r\n        @media (max-width: 1080px) {\r\n            .workspace {\r\n                grid-template-columns: minmax(0, 1fr) 286px;\r\n            }\r\n\r\n            .keypad-layout {\r\n                grid-template-columns: 1fr;\r\n            }\r\n\r\n            .scientific-grid {\r\n                grid-template-columns: repeat(6, minmax(0, 1fr));\r\n            }\r\n        }\r\n\r\n        @media (max-width: 820px) {\r\n            .app-shell {\r\n                width: min(100% - 16px, var(--max-width));\r\n                margin-top: 8px;\r\n            }\r\n\r\n            .app-header {\r\n                align-items: flex-start;\r\n            }\r\n\r\n            .workspace {\r\n                grid-template-columns: 1fr;\r\n            }\r\n\r\n            .history-panel {\r\n                position: fixed;\r\n                top: 0;\r\n                right: 0;\r\n                z-index: 31;\r\n                width: min(88vw, 360px);\r\n                height: 100%;\r\n                border-radius: 20px 0 0 20px;\r\n                transform: translateX(104%);\r\n                transition: transform var(--transition);\r\n            }\r\n\r\n            .history-panel.is-open {\r\n                transform: translateX(0);\r\n            }\r\n\r\n            .mobile-history-toggle {\r\n                display: inline-grid;\r\n            }\r\n\r\n            .mobile-history-backdrop {\r\n                position: fixed;\r\n                inset: 0;\r\n                z-index: 30;\r\n                display: block;\r\n                background: rgba(3, 7, 12, 0.56);\r\n            }\r\n\r\n            .history-list {\r\n                max-height: calc(100vh - 94px);\r\n            }\r\n        }\r\n\r\n        @media (max-width: 640px) {\r\n            .app-header {\r\n                gap: 10px;\r\n            }\r\n\r\n            .brand-kicker {\r\n                display: none;\r\n            }\r\n\r\n            .header-actions {\r\n                gap: 6px;\r\n            }\r\n\r\n            .mode-switch {\r\n                order: 3;\r\n                width: 100%;\r\n            }\r\n\r\n            .mode-button {\r\n                flex: 1 1 0;\r\n            }\r\n\r\n            .calculator-body,\r\n            .display {\r\n                padding-left: 10px;\r\n                padding-right: 10px;\r\n            }\r\n\r\n            .display-topline {\r\n                align-items: flex-start;\r\n            }\r\n\r\n            .preview-output {\r\n                max-width: 42%;\r\n            }\r\n\r\n            .scientific-grid {\r\n                grid-template-columns: repeat(4, minmax(0, 1fr));\r\n            }\r\n\r\n            .calc-key {\r\n                min-height: 48px;\r\n            }\r\n\r\n            .converter-grid,\r\n            .setting-row {\r\n                grid-template-columns: 1fr;\r\n            }\r\n\r\n            .shortcut-list {\r\n                grid-template-columns: 1fr;\r\n            }\r\n        }\r\n\r\n        @media (max-width: 390px) {\r\n            .app-shell {\r\n                width: min(100% - 10px, var(--max-width));\r\n            }\r\n\r\n            .brand-title {\r\n                font-size: 1.05rem;\r\n            }\r\n\r\n            .icon-button {\r\n                width: 42px;\r\n            }\r\n\r\n            .scientific-grid {\r\n                grid-template-columns: repeat(3, minmax(0, 1fr));\r\n            }\r\n\r\n            .numeric-grid {\r\n                gap: 7px;\r\n            }\r\n\r\n            .calc-key {\r\n                padding-inline: 4px;\r\n            }\r\n        }\r\n\r\n        @media (prefers-reduced-motion: reduce) {\r\n            *,\r\n            *::before,\r\n            *::after {\r\n                scroll-behavior: auto !important;\r\n                transition-duration: 0.01ms !important;\r\n                animation-duration: 0.01ms !important;\r\n            }\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n    <main class=\"app-shell\" id=\"appRoot\">\r\n        <!-- =====================================================\r\n             HEADER\r\n        ====================================================== -->\r\n        <header class=\"app-header\">\r\n            <div class=\"brand-group\">\r\n                <p class=\"brand-kicker\">Precision workspace<\/p>\r\n                <h1 class=\"brand-title\">NOVA Scientific<\/h1>\r\n            <\/div>\r\n\r\n            <div class=\"header-actions\">\r\n                <div class=\"mode-switch\" aria-label=\"Application mode\">\r\n                    <button class=\"mode-button\" id=\"scientificModeButton\" type=\"button\" aria-pressed=\"true\">Scientific<\/button>\r\n                    <button class=\"mode-button\" id=\"converterModeButton\" type=\"button\" aria-pressed=\"false\">Converter<\/button>\r\n                <\/div>\r\n\r\n                <button class=\"icon-button mobile-history-toggle\" id=\"mobileHistoryButton\" type=\"button\" aria-label=\"Open calculation history\" title=\"History\">\u2315<\/button>\r\n                <button class=\"icon-button\" id=\"themeButton\" type=\"button\" aria-label=\"Toggle color theme\" title=\"Toggle theme\">\u25d0<\/button>\r\n                <button class=\"icon-button\" id=\"settingsButton\" type=\"button\" aria-label=\"Open settings\" title=\"Settings\">\u2699<\/button>\r\n            <\/div>\r\n        <\/header>\r\n\r\n        <!-- =====================================================\r\n             SCIENTIFIC WORKSPACE\r\n        ====================================================== -->\r\n        <section class=\"workspace\" id=\"scientificWorkspace\" aria-label=\"Scientific calculator workspace\">\r\n            <section class=\"calculator-panel\" aria-label=\"Scientific calculator\">\r\n                <!-- Display -->\r\n                <div class=\"display\">\r\n                    <div class=\"display-topline\">\r\n                        <div class=\"indicators\" aria-label=\"Calculator status\">\r\n                            <span class=\"indicator is-active\" id=\"angleIndicator\">DEG<\/span>\r\n                            <span class=\"indicator\" id=\"memoryIndicator\">M<\/span>\r\n                            <span class=\"indicator\" id=\"shiftIndicator\">2nd<\/span>\r\n                            <span class=\"indicator is-active\" id=\"formatIndicator\">NORMAL<\/span>\r\n                        <\/div>\r\n\r\n                        <div class=\"display-tools\">\r\n                            <button class=\"display-tool\" id=\"fractionButton\" type=\"button\" title=\"Convert result to fraction\">a\/b<\/button>\r\n                            <button class=\"display-tool\" id=\"copyButton\" type=\"button\" title=\"Copy result\">Copy<\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <label for=\"expressionInput\" class=\"field-label\" style=\"position:absolute;left:-9999px;\">Expression<\/label>\r\n                    <input\r\n                        class=\"expression-input\"\r\n                        id=\"expressionInput\"\r\n                        type=\"text\"\r\n                        inputmode=\"text\"\r\n                        autocomplete=\"off\"\r\n                        autocapitalize=\"off\"\r\n                        spellcheck=\"false\"\r\n                        aria-describedby=\"messageLine\"\r\n                        placeholder=\"Enter an expression\u2026\"\r\n                    >\r\n\r\n                    <div class=\"result-row\">\r\n                        <output class=\"result-output\" id=\"resultOutput\" aria-live=\"polite\">0<\/output>\r\n                        <div class=\"preview-output\" id=\"previewOutput\" aria-live=\"off\"><\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"message-line\" id=\"messageLine\" aria-live=\"polite\"><\/div>\r\n                <\/div>\r\n\r\n                <!-- Calculator controls -->\r\n                <div class=\"calculator-body\">\r\n                    <div class=\"control-strip\">\r\n                        <div class=\"control-strip-group\" aria-label=\"Angle mode\">\r\n                            <button class=\"tiny-button\" type=\"button\" data-angle=\"DEG\" aria-pressed=\"true\">DEG<\/button>\r\n                            <button class=\"tiny-button\" type=\"button\" data-angle=\"RAD\" aria-pressed=\"false\">RAD<\/button>\r\n                            <button class=\"tiny-button\" type=\"button\" data-angle=\"GRAD\" aria-pressed=\"false\">GRAD<\/button>\r\n                        <\/div>\r\n\r\n                        <div class=\"control-strip-group\" aria-label=\"Memory controls\">\r\n                            <button class=\"tiny-button\" type=\"button\" data-action=\"memory-clear\">MC<\/button>\r\n                            <button class=\"tiny-button\" type=\"button\" data-action=\"memory-recall\">MR<\/button>\r\n                            <button class=\"tiny-button\" type=\"button\" data-action=\"memory-add\">M+<\/button>\r\n                            <button class=\"tiny-button\" type=\"button\" data-action=\"memory-subtract\">M\u2212<\/button>\r\n                            <button class=\"tiny-button\" type=\"button\" data-action=\"memory-store\">MS<\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"keypad-layout\">\r\n                        <!-- Scientific keypad -->\r\n                        <div class=\"scientific-grid\" id=\"scientificGrid\" aria-label=\"Scientific functions\">\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-action=\"shift\" id=\"shiftButton\">2nd<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"(\">(<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\")\">)<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-action=\"smart-parenthesis\">( )<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"pi\">\u03c0<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"e\">e<\/button>\r\n\r\n                            <button class=\"calc-key key-function shiftable\" type=\"button\" data-normal-label=\"sin\" data-shift-label=\"sin\u207b\u00b9\" data-normal-insert=\"sin(\" data-shift-insert=\"asin(\" data-insert=\"sin(\">sin<\/button>\r\n                            <button class=\"calc-key key-function shiftable\" type=\"button\" data-normal-label=\"cos\" data-shift-label=\"cos\u207b\u00b9\" data-normal-insert=\"cos(\" data-shift-insert=\"acos(\" data-insert=\"cos(\">cos<\/button>\r\n                            <button class=\"calc-key key-function shiftable\" type=\"button\" data-normal-label=\"tan\" data-shift-label=\"tan\u207b\u00b9\" data-normal-insert=\"tan(\" data-shift-insert=\"atan(\" data-insert=\"tan(\">tan<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"sinh(\">sinh<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"cosh(\">cosh<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"tanh(\">tanh<\/button>\r\n\r\n                            <button class=\"calc-key key-function shiftable\" type=\"button\" data-normal-label=\"x\u00b2\" data-shift-label=\"\u221ax\" data-normal-action=\"square\" data-shift-insert=\"sqrt(\" data-action=\"square\">x\u00b2<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-action=\"cube\">x\u00b3<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"^\">x\u02b8<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"sqrt(\">\u221ax<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"cbrt(\">\u221bx<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"root(\">\u02b8\u221ax<\/button>\r\n\r\n                            <button class=\"calc-key key-function shiftable\" type=\"button\" data-normal-label=\"10\u02e3\" data-shift-label=\"log\" data-normal-insert=\"10^(\" data-shift-insert=\"log(\" data-insert=\"10^(\">10\u02e3<\/button>\r\n                            <button class=\"calc-key key-function shiftable\" type=\"button\" data-normal-label=\"e\u02e3\" data-shift-label=\"ln\" data-normal-insert=\"e^(\" data-shift-insert=\"ln(\" data-insert=\"e^(\">e\u02e3<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"2^(\">2\u02e3<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"log(\">log<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"ln(\">ln<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"log2(\">log\u2082<\/button>\r\n\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"abs(\">|x|<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"!\">x!<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-action=\"reciprocal\">1\/x<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"floor(\">floor<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"ceil(\">ceil<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"round(\">round<\/button>\r\n\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"ncr(\">nCr<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"npr(\">nPr<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"gcd(\">gcd<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"lcm(\">lcm<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"mod(\">mod<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-action=\"random\">RAND<\/button>\r\n\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"min(\">min<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"max(\">max<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"trunc(\">trunc<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"sign(\">sign<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"phi\">\u03c6<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"E\">EXP<\/button>\r\n\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"logb(\">log\u1d66<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"randbetween(\">RND(a,b)<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"atanh(\">atanh<\/button>\r\n                        <\/div>\r\n\r\n                        <!-- Numeric keypad -->\r\n                        <div class=\"numeric-grid\" id=\"numericGrid\" aria-label=\"Basic calculator keypad\">\r\n                            <button class=\"calc-key key-danger\" type=\"button\" data-action=\"clear\">AC<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-action=\"backspace\">\u232b<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"%\">%<\/button>\r\n                            <button class=\"calc-key key-operator\" type=\"button\" data-insert=\"\u00f7\">\u00f7<\/button>\r\n\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"7\">7<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"8\">8<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"9\">9<\/button>\r\n                            <button class=\"calc-key key-operator\" type=\"button\" data-insert=\"\u00d7\">\u00d7<\/button>\r\n\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"4\">4<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"5\">5<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"6\">6<\/button>\r\n                            <button class=\"calc-key key-operator\" type=\"button\" data-insert=\"-\">\u2212<\/button>\r\n\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"1\">1<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"2\">2<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"3\">3<\/button>\r\n                            <button class=\"calc-key key-operator\" type=\"button\" data-insert=\"+\">+<\/button>\r\n\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-action=\"toggle-sign\">\u00b1<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\"0\">0<\/button>\r\n                            <button class=\"calc-key key-number\" type=\"button\" data-insert=\".\">.<\/button>\r\n                            <button class=\"calc-key key-equals\" type=\"button\" data-action=\"evaluate\">=<\/button>\r\n\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"ans\">ANS<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\",\">,<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"asinh(\">asinh<\/button>\r\n                            <button class=\"calc-key key-function\" type=\"button\" data-insert=\"acosh(\">acosh<\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/section>\r\n\r\n            <!-- History panel -->\r\n            <aside class=\"history-panel\" id=\"historyPanel\" aria-label=\"Calculation history\">\r\n                <div class=\"panel-heading\">\r\n                    <h2 class=\"panel-title\">History<\/h2>\r\n                    <button class=\"soft-button\" id=\"clearHistoryButton\" type=\"button\">Clear<\/button>\r\n                <\/div>\r\n                <div class=\"history-list\" id=\"historyList\"><\/div>\r\n            <\/aside>\r\n        <\/section>\r\n\r\n        <!-- =====================================================\r\n             CONVERTER WORKSPACE\r\n        ====================================================== -->\r\n        <section class=\"converter-panel\" id=\"converterWorkspace\" aria-label=\"Unit converter\" hidden>\r\n            <div class=\"converter-head\">\r\n                <div>\r\n                    <h2 class=\"converter-title\">Unit converter<\/h2>\r\n                    <p class=\"converter-subtitle\">Offline conversions for common scientific and everyday units.<\/p>\r\n                <\/div>\r\n                <span class=\"indicator is-active\">LOCAL<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"converter-grid\">\r\n                <div class=\"converter-card field-stack\">\r\n                    <div>\r\n                        <label class=\"field-label\" for=\"converterCategory\">Category<\/label>\r\n                        <select class=\"field-control\" id=\"converterCategory\"><\/select>\r\n                    <\/div>\r\n                    <div>\r\n                        <label class=\"field-label\" for=\"converterValue\">Value<\/label>\r\n                        <input class=\"field-control\" id=\"converterValue\" type=\"number\" inputmode=\"decimal\" step=\"any\" value=\"1\">\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"converter-card field-stack\">\r\n                    <div>\r\n                        <label class=\"field-label\" for=\"converterFrom\">From<\/label>\r\n                        <select class=\"field-control\" id=\"converterFrom\"><\/select>\r\n                    <\/div>\r\n                    <div>\r\n                        <label class=\"field-label\" for=\"converterTo\">To<\/label>\r\n                        <select class=\"field-control\" id=\"converterTo\"><\/select>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"converter-card field-stack\">\r\n                    <div>\r\n                        <span class=\"field-label\">Converted result<\/span>\r\n                        <output class=\"converter-result\" id=\"converterResult\" aria-live=\"polite\">1<\/output>\r\n                    <\/div>\r\n                    <button class=\"soft-button\" id=\"swapUnitsButton\" type=\"button\">Swap units<\/button>\r\n                <\/div>\r\n\r\n                <div class=\"converter-card field-stack\">\r\n                    <div>\r\n                        <span class=\"field-label\">Formula<\/span>\r\n                        <div class=\"converter-result\" id=\"converterFormula\" style=\"font-size:0.88rem;font-weight:650;color:var(--muted);\">Direct scale conversion<\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/section>\r\n    <\/main>\r\n\r\n    <!-- Mobile history overlay -->\r\n    <button class=\"mobile-history-backdrop\" id=\"mobileHistoryBackdrop\" type=\"button\" aria-label=\"Close history\" hidden><\/button>\r\n\r\n    <!-- =========================================================\r\n         SETTINGS DIALOG\r\n    ========================================================== -->\r\n    <div class=\"settings-backdrop\" id=\"settingsBackdrop\" hidden>\r\n        <section class=\"settings-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"settingsTitle\">\r\n            <div class=\"panel-heading\">\r\n                <h2 class=\"panel-title\" id=\"settingsTitle\">Calculator settings<\/h2>\r\n                <button class=\"icon-button\" id=\"closeSettingsButton\" type=\"button\" aria-label=\"Close settings\">\u00d7<\/button>\r\n            <\/div>\r\n\r\n            <div class=\"settings-list\">\r\n                <div class=\"setting-row\">\r\n                    <div class=\"setting-copy\">\r\n                        <strong>Theme<\/strong>\r\n                        <span>Choose light or dark appearance.<\/span>\r\n                    <\/div>\r\n                    <select class=\"field-control\" id=\"themeSelect\">\r\n                        <option value=\"dark\">Dark<\/option>\r\n                        <option value=\"light\">Light<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n\r\n                <div class=\"setting-row\">\r\n                    <div class=\"setting-copy\">\r\n                        <strong>Number format<\/strong>\r\n                        <span>Normal, scientific, or engineering notation.<\/span>\r\n                    <\/div>\r\n                    <select class=\"field-control\" id=\"formatSelect\">\r\n                        <option value=\"normal\">Normal<\/option>\r\n                        <option value=\"scientific\">Scientific<\/option>\r\n                        <option value=\"engineering\">Engineering<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n\r\n                <div class=\"setting-row\">\r\n                    <div class=\"setting-copy\">\r\n                        <strong>Precision<\/strong>\r\n                        <span>Display precision only; internal calculations keep full floating-point precision.<\/span>\r\n                    <\/div>\r\n                    <select class=\"field-control\" id=\"precisionSelect\">\r\n                        <option value=\"auto\">Auto<\/option>\r\n                        <option value=\"4\">4 decimals<\/option>\r\n                        <option value=\"6\">6 decimals<\/option>\r\n                        <option value=\"8\">8 decimals<\/option>\r\n                        <option value=\"10\">10 decimals<\/option>\r\n                        <option value=\"12\">12 decimals<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n\r\n                <div class=\"setting-row\">\r\n                    <div class=\"setting-copy\">\r\n                        <strong>History persistence<\/strong>\r\n                        <span>Keep recent calculations after closing the browser.<\/span>\r\n                    <\/div>\r\n                    <select class=\"field-control\" id=\"historyPersistenceSelect\">\r\n                        <option value=\"on\">On<\/option>\r\n                        <option value=\"off\">Off<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n\r\n                <div>\r\n                    <span class=\"field-label\">Keyboard shortcuts<\/span>\r\n                    <div class=\"shortcut-list\">\r\n                        <div class=\"shortcut-item\"><span>Calculate<\/span><kbd>Enter<\/kbd><\/div>\r\n                        <div class=\"shortcut-item\"><span>Clear<\/span><kbd>Esc<\/kbd><\/div>\r\n                        <div class=\"shortcut-item\"><span>Delete<\/span><kbd>\u232b<\/kbd><\/div>\r\n                        <div class=\"shortcut-item\"><span>Power<\/span><kbd>^<\/kbd><\/div>\r\n                        <div class=\"shortcut-item\"><span>Multiply<\/span><kbd>*<\/kbd><\/div>\r\n                        <div class=\"shortcut-item\"><span>Divide<\/span><kbd>\/<\/kbd><\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"settings-footer\">\r\n                <button class=\"soft-button\" id=\"resetSettingsButton\" type=\"button\">Reset settings<\/button>\r\n                <button class=\"soft-button\" id=\"doneSettingsButton\" type=\"button\">Done<\/button>\r\n            <\/div>\r\n        <\/section>\r\n    <\/div>\r\n\r\n    <script>\r\n        \"use strict\";\r\n\r\n        \/* =========================================================\r\n           01. CONSTANTS & APPLICATION STATE\r\n        ========================================================== *\/\r\n        const STORAGE_KEYS = {\r\n            theme: \"nova.theme\",\r\n            angle: \"nova.angle\",\r\n            precision: \"nova.precision\",\r\n            format: \"nova.format\",\r\n            history: \"nova.history\",\r\n            historyPersistence: \"nova.historyPersistence\"\r\n        };\r\n\r\n        const MAX_HISTORY = 60;\r\n        const MAX_FACTORIAL = 170;\r\n        const GOLDEN_RATIO = (1 + Math.sqrt(5)) \/ 2;\r\n\r\n        const state = {\r\n            expression: \"\",\r\n            result: 0,\r\n            previousAnswer: 0,\r\n            memory: 0,\r\n            angleMode: \"DEG\",\r\n            secondMode: false,\r\n            theme: \"dark\",\r\n            numberFormat: \"normal\",\r\n            precision: \"auto\",\r\n            historyPersistence: true,\r\n            history: [],\r\n            justEvaluated: false,\r\n            lastEvaluation: null,\r\n            currentMode: \"scientific\"\r\n        };\r\n\r\n        \/* =========================================================\r\n           02. DOM CACHE\r\n        ========================================================== *\/\r\n        const dom = {\r\n            html: document.documentElement,\r\n            expressionInput: document.getElementById(\"expressionInput\"),\r\n            resultOutput: document.getElementById(\"resultOutput\"),\r\n            previewOutput: document.getElementById(\"previewOutput\"),\r\n            messageLine: document.getElementById(\"messageLine\"),\r\n            angleIndicator: document.getElementById(\"angleIndicator\"),\r\n            memoryIndicator: document.getElementById(\"memoryIndicator\"),\r\n            shiftIndicator: document.getElementById(\"shiftIndicator\"),\r\n            formatIndicator: document.getElementById(\"formatIndicator\"),\r\n            scientificWorkspace: document.getElementById(\"scientificWorkspace\"),\r\n            converterWorkspace: document.getElementById(\"converterWorkspace\"),\r\n            scientificModeButton: document.getElementById(\"scientificModeButton\"),\r\n            converterModeButton: document.getElementById(\"converterModeButton\"),\r\n            themeButton: document.getElementById(\"themeButton\"),\r\n            settingsButton: document.getElementById(\"settingsButton\"),\r\n            copyButton: document.getElementById(\"copyButton\"),\r\n            fractionButton: document.getElementById(\"fractionButton\"),\r\n            shiftButton: document.getElementById(\"shiftButton\"),\r\n            historyList: document.getElementById(\"historyList\"),\r\n            historyPanel: document.getElementById(\"historyPanel\"),\r\n            clearHistoryButton: document.getElementById(\"clearHistoryButton\"),\r\n            mobileHistoryButton: document.getElementById(\"mobileHistoryButton\"),\r\n            mobileHistoryBackdrop: document.getElementById(\"mobileHistoryBackdrop\"),\r\n            settingsBackdrop: document.getElementById(\"settingsBackdrop\"),\r\n            closeSettingsButton: document.getElementById(\"closeSettingsButton\"),\r\n            doneSettingsButton: document.getElementById(\"doneSettingsButton\"),\r\n            resetSettingsButton: document.getElementById(\"resetSettingsButton\"),\r\n            themeSelect: document.getElementById(\"themeSelect\"),\r\n            formatSelect: document.getElementById(\"formatSelect\"),\r\n            precisionSelect: document.getElementById(\"precisionSelect\"),\r\n            historyPersistenceSelect: document.getElementById(\"historyPersistenceSelect\"),\r\n            converterCategory: document.getElementById(\"converterCategory\"),\r\n            converterValue: document.getElementById(\"converterValue\"),\r\n            converterFrom: document.getElementById(\"converterFrom\"),\r\n            converterTo: document.getElementById(\"converterTo\"),\r\n            converterResult: document.getElementById(\"converterResult\"),\r\n            converterFormula: document.getElementById(\"converterFormula\"),\r\n            swapUnitsButton: document.getElementById(\"swapUnitsButton\")\r\n        };\r\n\r\n        \/* =========================================================\r\n           03. UTILITY HELPERS\r\n        ========================================================== *\/\r\n        function clamp(value, min, max) {\r\n            return Math.min(Math.max(value, min), max);\r\n        }\r\n\r\n        function nearlyInteger(value) {\r\n            return Math.abs(value - Math.round(value)) < 1e-12;\r\n        }\r\n\r\n        function isFiniteNumber(value) {\r\n            return typeof value === \"number\" && Number.isFinite(value);\r\n        }\r\n\r\n        function safeStorageGet(key) {\r\n            try {\r\n                return localStorage.getItem(key);\r\n            } catch {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        function safeStorageSet(key, value) {\r\n            try {\r\n                localStorage.setItem(key, value);\r\n                return true;\r\n            } catch {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        function safeStorageRemove(key) {\r\n            try {\r\n                localStorage.removeItem(key);\r\n            } catch {\r\n                \/\/ Persistence is optional; silently continue.\r\n            }\r\n        }\r\n\r\n        function normalizeNegativeZero(value) {\r\n            return Object.is(value, -0) ? 0 : value;\r\n        }\r\n\r\n        function roundFloatingNoise(value) {\r\n            if (!isFiniteNumber(value)) return value;\r\n            if (value === 0) return 0;\r\n            const magnitude = Math.abs(value);\r\n            if (magnitude >= 1e15 || magnitude < 1e-12) return value;\r\n            return Number.parseFloat(value.toPrecision(15));\r\n        }\r\n\r\n        function showMessage(message = \"\", type = \"neutral\") {\r\n            dom.messageLine.textContent = message;\r\n            dom.messageLine.classList.toggle(\"is-error\", type === \"error\");\r\n            dom.messageLine.classList.toggle(\"is-success\", type === \"success\");\r\n        }\r\n\r\n        function clearMessage() {\r\n            showMessage(\"\");\r\n        }\r\n\r\n        \/* =========================================================\r\n           04. MATHEMATICAL DOMAIN HELPERS\r\n        ========================================================== *\/\r\n        function toRadians(value) {\r\n            if (state.angleMode === \"DEG\") return value * Math.PI \/ 180;\r\n            if (state.angleMode === \"GRAD\") return value * Math.PI \/ 200;\r\n            return value;\r\n        }\r\n\r\n        function fromRadians(value) {\r\n            if (state.angleMode === \"DEG\") return value * 180 \/ Math.PI;\r\n            if (state.angleMode === \"GRAD\") return value * 200 \/ Math.PI;\r\n            return value;\r\n        }\r\n\r\n        function factorial(value) {\r\n            if (!nearlyInteger(value) || value < 0) {\r\n                throw new CalcError(\"Factorial requires a non-negative integer\");\r\n            }\r\n            if (value > MAX_FACTORIAL) {\r\n                throw new CalcError(\"Factorial is too large for this calculator\");\r\n            }\r\n            let result = 1;\r\n            for (let i = 2; i <= value; i += 1) result *= i;\r\n            return result;\r\n        }\r\n\r\n        function integerGcd(a, b) {\r\n            if (!nearlyInteger(a) || !nearlyInteger(b)) {\r\n                throw new CalcError(\"gcd requires integer arguments\");\r\n            }\r\n            a = Math.abs(Math.trunc(a));\r\n            b = Math.abs(Math.trunc(b));\r\n            while (b !== 0) {\r\n                [a, b] = [b, a % b];\r\n            }\r\n            return a;\r\n        }\r\n\r\n        function integerLcm(a, b) {\r\n            if (!nearlyInteger(a) || !nearlyInteger(b)) {\r\n                throw new CalcError(\"lcm requires integer arguments\");\r\n            }\r\n            if (a === 0 || b === 0) return 0;\r\n            return Math.abs((a \/ integerGcd(a, b)) * b);\r\n        }\r\n\r\n        function combination(n, r) {\r\n            if (!nearlyInteger(n) || !nearlyInteger(r) || n < 0 || r < 0 || r > n) {\r\n                throw new CalcError(\"nCr requires integers with 0 \u2264 r \u2264 n\");\r\n            }\r\n            r = Math.min(r, n - r);\r\n            let result = 1;\r\n            for (let i = 1; i <= r; i += 1) {\r\n                result = result * (n - r + i) \/ i;\r\n            }\r\n            return result;\r\n        }\r\n\r\n        function permutation(n, r) {\r\n            if (!nearlyInteger(n) || !nearlyInteger(r) || n < 0 || r < 0 || r > n) {\r\n                throw new CalcError(\"nPr requires integers with 0 \u2264 r \u2264 n\");\r\n            }\r\n            let result = 1;\r\n            for (let i = 0; i < r; i += 1) result *= (n - i);\r\n            return result;\r\n        }\r\n\r\n        \/* =========================================================\r\n           05. CALCULATOR ERROR TYPE\r\n        ========================================================== *\/\r\n        class CalcError extends Error {\r\n            constructor(message) {\r\n                super(message);\r\n                this.name = \"CalcError\";\r\n            }\r\n        }\r\n\r\n        \/* =========================================================\r\n           06. TOKENIZER\r\n        ========================================================== *\/\r\n        const FUNCTION_NAMES = new Set([\r\n            \"sin\", \"cos\", \"tan\", \"asin\", \"acos\", \"atan\",\r\n            \"sinh\", \"cosh\", \"tanh\", \"asinh\", \"acosh\", \"atanh\",\r\n            \"log\", \"ln\", \"log2\", \"logb\", \"sqrt\", \"cbrt\", \"root\",\r\n            \"abs\", \"floor\", \"ceil\", \"round\", \"trunc\", \"sign\",\r\n            \"min\", \"max\", \"gcd\", \"lcm\", \"ncr\", \"npr\", \"mod\",\r\n            \"randbetween\"\r\n        ]);\r\n\r\n        const CONSTANT_NAMES = new Set([\"pi\", \"e\", \"phi\", \"ans\"]);\r\n\r\n        function normalizeExpressionSource(source) {\r\n            return source\r\n                .replace(\/\u00d7\/g, \"*\")\r\n                .replace(\/\u00f7\/g, \"\/\")\r\n                .replace(\/[\u2212\u2013\u2014]\/g, \"-\")\r\n                .replace(\/\u03c0\/g, \"pi\")\r\n                .replace(\/\u03c6\/g, \"phi\")\r\n                .replace(\/\u221a\/g, \"sqrt\")\r\n                .trim();\r\n        }\r\n\r\n        function tokenize(source) {\r\n            const input = normalizeExpressionSource(source);\r\n            const tokens = [];\r\n            let index = 0;\r\n\r\n            while (index < input.length) {\r\n                const char = input[index];\r\n\r\n                if (\/\\s\/.test(char)) {\r\n                    index += 1;\r\n                    continue;\r\n                }\r\n\r\n                if (\/\\d|\\.\/.test(char)) {\r\n                    const start = index;\r\n                    let sawDot = false;\r\n\r\n                    if (char === \".\") sawDot = true;\r\n                    index += 1;\r\n\r\n                    while (index < input.length) {\r\n                        const next = input[index];\r\n                        if (\/\\d\/.test(next)) {\r\n                            index += 1;\r\n                            continue;\r\n                        }\r\n                        if (next === \".\" && !sawDot) {\r\n                            sawDot = true;\r\n                            index += 1;\r\n                            continue;\r\n                        }\r\n                        break;\r\n                    }\r\n\r\n                    if (input[index] === \"e\" || input[index] === \"E\") {\r\n                        let exponentIndex = index + 1;\r\n                        if (input[exponentIndex] === \"+\" || input[exponentIndex] === \"-\") exponentIndex += 1;\r\n                        const digitsStart = exponentIndex;\r\n                        while (\/\\d\/.test(input[exponentIndex] || \"\")) exponentIndex += 1;\r\n                        if (exponentIndex > digitsStart) index = exponentIndex;\r\n                    }\r\n\r\n                    const raw = input.slice(start, index);\r\n                    if (!\/^(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$\/.test(raw)) {\r\n                        throw new CalcError(\"Invalid number format\");\r\n                    }\r\n                    tokens.push({ type: \"number\", value: Number(raw), raw });\r\n                    continue;\r\n                }\r\n\r\n                if (\/[A-Za-z]\/.test(char)) {\r\n                    const start = index;\r\n                    index += 1;\r\n                    while (\/[A-Za-z0-9_]\/.test(input[index] || \"\")) index += 1;\r\n                    const name = input.slice(start, index).toLowerCase();\r\n                    tokens.push({ type: \"identifier\", value: name });\r\n                    continue;\r\n                }\r\n\r\n                if (\"+-*\/^!%,()\".includes(char)) {\r\n                    if (char === \"(\") tokens.push({ type: \"lparen\", value: char });\r\n                    else if (char === \")\") tokens.push({ type: \"rparen\", value: char });\r\n                    else if (char === \",\") tokens.push({ type: \"comma\", value: char });\r\n                    else tokens.push({ type: \"operator\", value: char });\r\n                    index += 1;\r\n                    continue;\r\n                }\r\n\r\n                throw new CalcError(`Unsupported symbol: ${char}`);\r\n            }\r\n\r\n            return insertImplicitMultiplication(tokens);\r\n        }\r\n\r\n        function canEndImplicitMultiplication(token) {\r\n            if (!token) return false;\r\n            return token.type === \"number\" ||\r\n                token.type === \"rparen\" ||\r\n                (token.type === \"identifier\" && CONSTANT_NAMES.has(token.value)) ||\r\n                (token.type === \"operator\" && (token.value === \"!\" || token.value === \"%\"));\r\n        }\r\n\r\n        function canStartImplicitMultiplication(token) {\r\n            if (!token) return false;\r\n            if (token.type === \"number\" || token.type === \"lparen\") return true;\r\n            if (token.type === \"identifier\") return true;\r\n            return false;\r\n        }\r\n\r\n        function insertImplicitMultiplication(tokens) {\r\n            const output = [];\r\n\r\n            for (let i = 0; i < tokens.length; i += 1) {\r\n                const current = tokens[i];\r\n                const previous = output[output.length - 1];\r\n\r\n                const previousIsFunction = previous?.type === \"identifier\" && FUNCTION_NAMES.has(previous.value);\r\n                const currentIsLParen = current.type === \"lparen\";\r\n\r\n                if (\r\n                    previous &&\r\n                    canEndImplicitMultiplication(previous) &&\r\n                    canStartImplicitMultiplication(current) &&\r\n                    !(previousIsFunction && currentIsLParen)\r\n                ) {\r\n                    output.push({ type: \"operator\", value: \"*\", implicit: true });\r\n                }\r\n\r\n                output.push(current);\r\n            }\r\n\r\n            return output;\r\n        }\r\n\r\n        \/* =========================================================\r\n           07. RECURSIVE-DESCENT EXPRESSION PARSER\r\n        ========================================================== *\/\r\n        class Parser {\r\n            constructor(tokens) {\r\n                this.tokens = tokens;\r\n                this.position = 0;\r\n            }\r\n\r\n            peek(offset = 0) {\r\n                return this.tokens[this.position + offset] || null;\r\n            }\r\n\r\n            consume() {\r\n                return this.tokens[this.position++] || null;\r\n            }\r\n\r\n            match(type, value = null) {\r\n                const token = this.peek();\r\n                if (!token || token.type !== type) return false;\r\n                if (value !== null && token.value !== value) return false;\r\n                this.position += 1;\r\n                return true;\r\n            }\r\n\r\n            expect(type, value = null, message = \"Invalid expression\") {\r\n                const token = this.peek();\r\n                if (!token || token.type !== type || (value !== null && token.value !== value)) {\r\n                    throw new CalcError(message);\r\n                }\r\n                return this.consume();\r\n            }\r\n\r\n            parse() {\r\n                if (this.tokens.length === 0) throw new CalcError(\"Enter an expression\");\r\n                const value = this.parseExpression();\r\n                if (this.peek()) throw new CalcError(\"Invalid expression\");\r\n                return value;\r\n            }\r\n\r\n            parseExpression() {\r\n                return this.parseAdditive();\r\n            }\r\n\r\n            parseAdditive() {\r\n                let left = this.parseMultiplicative();\r\n\r\n                while (true) {\r\n                    if (this.match(\"operator\", \"+\")) {\r\n                        left += this.parseMultiplicative();\r\n                    } else if (this.match(\"operator\", \"-\")) {\r\n                        left -= this.parseMultiplicative();\r\n                    } else {\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                return left;\r\n            }\r\n\r\n            parseMultiplicative() {\r\n                let left = this.parseUnary();\r\n\r\n                while (true) {\r\n                    if (this.match(\"operator\", \"*\")) {\r\n                        left *= this.parseUnary();\r\n                    } else if (this.match(\"operator\", \"\/\")) {\r\n                        const divisor = this.parseUnary();\r\n                        if (divisor === 0) throw new CalcError(\"Cannot divide by zero\");\r\n                        left \/= divisor;\r\n                    } else {\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                return left;\r\n            }\r\n\r\n            parseUnary() {\r\n                if (this.match(\"operator\", \"+\")) return +this.parseUnary();\r\n                if (this.match(\"operator\", \"-\")) return -this.parseUnary();\r\n                return this.parsePower();\r\n            }\r\n\r\n            parsePower() {\r\n                let base = this.parsePostfix();\r\n                if (this.match(\"operator\", \"^\")) {\r\n                    const exponent = this.parseUnary();\r\n                    const result = Math.pow(base, exponent);\r\n                    if (Number.isNaN(result)) throw new CalcError(\"Power operation is outside the real-number domain\");\r\n                    base = result;\r\n                }\r\n                return base;\r\n            }\r\n\r\n            parsePostfix() {\r\n                let value = this.parsePrimary();\r\n\r\n                while (true) {\r\n                    if (this.match(\"operator\", \"!\")) {\r\n                        value = factorial(value);\r\n                    } else if (this.match(\"operator\", \"%\")) {\r\n                        value \/= 100;\r\n                    } else {\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                return value;\r\n            }\r\n\r\n            parsePrimary() {\r\n                const token = this.peek();\r\n                if (!token) throw new CalcError(\"Expression is incomplete\");\r\n\r\n                if (token.type === \"number\") {\r\n                    this.consume();\r\n                    return token.value;\r\n                }\r\n\r\n                if (token.type === \"identifier\") {\r\n                    this.consume();\r\n                    const name = token.value;\r\n\r\n                    if (CONSTANT_NAMES.has(name)) {\r\n                        return this.resolveConstant(name);\r\n                    }\r\n\r\n                    if (!FUNCTION_NAMES.has(name)) {\r\n                        throw new CalcError(`Unknown function or constant: ${name}`);\r\n                    }\r\n\r\n                    this.expect(\"lparen\", \"(\", `Expected '(' after ${name}`);\r\n                    const args = [];\r\n\r\n                    if (!this.match(\"rparen\", \")\")) {\r\n                        do {\r\n                            args.push(this.parseExpression());\r\n                        } while (this.match(\"comma\", \",\"));\r\n                        this.expect(\"rparen\", \")\", \"Check parentheses\");\r\n                    }\r\n\r\n                    return this.callFunction(name, args);\r\n                }\r\n\r\n                if (this.match(\"lparen\", \"(\")) {\r\n                    const value = this.parseExpression();\r\n                    this.expect(\"rparen\", \")\", \"Check parentheses\");\r\n                    return value;\r\n                }\r\n\r\n                throw new CalcError(\"Invalid expression\");\r\n            }\r\n\r\n            resolveConstant(name) {\r\n                if (name === \"pi\") return Math.PI;\r\n                if (name === \"e\") return Math.E;\r\n                if (name === \"phi\") return GOLDEN_RATIO;\r\n                if (name === \"ans\") return state.previousAnswer;\r\n                throw new CalcError(`Unknown constant: ${name}`);\r\n            }\r\n\r\n            callFunction(name, args) {\r\n                const requireCount = (count) => {\r\n                    if (args.length !== count) throw new CalcError(`${name} requires ${count} argument${count === 1 ? \"\" : \"s\"}`);\r\n                };\r\n\r\n                const requireAtLeast = (count) => {\r\n                    if (args.length < count) throw new CalcError(`${name} requires at least ${count} arguments`);\r\n                };\r\n\r\n                switch (name) {\r\n                    case \"sin\": requireCount(1); return Math.sin(toRadians(args[0]));\r\n                    case \"cos\": requireCount(1); return Math.cos(toRadians(args[0]));\r\n                    case \"tan\": {\r\n                        requireCount(1);\r\n                        const radians = toRadians(args[0]);\r\n                        if (Math.abs(Math.cos(radians)) < 1e-14) throw new CalcError(\"tan is undefined at this angle\");\r\n                        return Math.tan(radians);\r\n                    }\r\n                    case \"asin\":\r\n                        requireCount(1);\r\n                        if (args[0] < -1 || args[0] > 1) throw new CalcError(\"asin input must be between -1 and 1\");\r\n                        return fromRadians(Math.asin(args[0]));\r\n                    case \"acos\":\r\n                        requireCount(1);\r\n                        if (args[0] < -1 || args[0] > 1) throw new CalcError(\"acos input must be between -1 and 1\");\r\n                        return fromRadians(Math.acos(args[0]));\r\n                    case \"atan\": requireCount(1); return fromRadians(Math.atan(args[0]));\r\n                    case \"sinh\": requireCount(1); return Math.sinh(args[0]);\r\n                    case \"cosh\": requireCount(1); return Math.cosh(args[0]);\r\n                    case \"tanh\": requireCount(1); return Math.tanh(args[0]);\r\n                    case \"asinh\": requireCount(1); return Math.asinh(args[0]);\r\n                    case \"acosh\":\r\n                        requireCount(1);\r\n                        if (args[0] < 1) throw new CalcError(\"acosh input must be at least 1\");\r\n                        return Math.acosh(args[0]);\r\n                    case \"atanh\":\r\n                        requireCount(1);\r\n                        if (args[0] <= -1 || args[0] >= 1) throw new CalcError(\"atanh input must be between -1 and 1\");\r\n                        return Math.atanh(args[0]);\r\n                    case \"log\":\r\n                        requireCount(1);\r\n                        if (args[0] <= 0) throw new CalcError(\"Logarithm input must be greater than zero\");\r\n                        return Math.log10(args[0]);\r\n                    case \"ln\":\r\n                        requireCount(1);\r\n                        if (args[0] <= 0) throw new CalcError(\"Logarithm input must be greater than zero\");\r\n                        return Math.log(args[0]);\r\n                    case \"log2\":\r\n                        requireCount(1);\r\n                        if (args[0] <= 0) throw new CalcError(\"Logarithm input must be greater than zero\");\r\n                        return Math.log2(args[0]);\r\n                    case \"logb\":\r\n                        requireCount(2);\r\n                        if (args[0] <= 0) throw new CalcError(\"Logarithm input must be greater than zero\");\r\n                        if (args[1] <= 0 || args[1] === 1) throw new CalcError(\"Logarithm base must be positive and not equal to 1\");\r\n                        return Math.log(args[0]) \/ Math.log(args[1]);\r\n                    case \"sqrt\":\r\n                        requireCount(1);\r\n                        if (args[0] < 0) throw new CalcError(\"Square root of a negative number is not real\");\r\n                        return Math.sqrt(args[0]);\r\n                    case \"cbrt\": requireCount(1); return Math.cbrt(args[0]);\r\n                    case \"root\": {\r\n                        requireCount(2);\r\n                        const [x, n] = args;\r\n                        if (n === 0) throw new CalcError(\"Root degree cannot be zero\");\r\n                        if (x < 0 && !nearlyInteger(n)) throw new CalcError(\"This root is outside the real-number domain\");\r\n                        if (x < 0 && Math.abs(Math.round(n)) % 2 === 0) throw new CalcError(\"Even root of a negative number is not real\");\r\n                        if (x < 0) return -Math.pow(-x, 1 \/ n);\r\n                        return Math.pow(x, 1 \/ n);\r\n                    }\r\n                    case \"abs\": requireCount(1); return Math.abs(args[0]);\r\n                    case \"floor\": requireCount(1); return Math.floor(args[0]);\r\n                    case \"ceil\": requireCount(1); return Math.ceil(args[0]);\r\n                    case \"round\": requireCount(1); return Math.round(args[0]);\r\n                    case \"trunc\": requireCount(1); return Math.trunc(args[0]);\r\n                    case \"sign\": requireCount(1); return Math.sign(args[0]);\r\n                    case \"min\": requireAtLeast(1); return Math.min(...args);\r\n                    case \"max\": requireAtLeast(1); return Math.max(...args);\r\n                    case \"gcd\": requireCount(2); return integerGcd(args[0], args[1]);\r\n                    case \"lcm\": requireCount(2); return integerLcm(args[0], args[1]);\r\n                    case \"ncr\": requireCount(2); return combination(args[0], args[1]);\r\n                    case \"npr\": requireCount(2); return permutation(args[0], args[1]);\r\n                    case \"mod\": {\r\n                        requireCount(2);\r\n                        if (args[1] === 0) throw new CalcError(\"Modulo divisor cannot be zero\");\r\n                        return args[0] % args[1];\r\n                    }\r\n                    case \"randbetween\": {\r\n                        requireCount(2);\r\n                        let [a, b] = args;\r\n                        if (!nearlyInteger(a) || !nearlyInteger(b)) throw new CalcError(\"randbetween requires integer bounds\");\r\n                        if (a > b) [a, b] = [b, a];\r\n                        return Math.floor(Math.random() * (b - a + 1)) + a;\r\n                    }\r\n                    default:\r\n                        throw new CalcError(`Unsupported function: ${name}`);\r\n                }\r\n            }\r\n        }\r\n\r\n        function tryEvaluateRelativePercentage(tokens) {\r\n            if (tokens.length < 4) return null;\r\n            const last = tokens[tokens.length - 1];\r\n            if (last.type !== \"operator\" || last.value !== \"%\") return null;\r\n\r\n            let depth = 0;\r\n            const candidates = [];\r\n\r\n            for (let i = 0; i < tokens.length - 1; i += 1) {\r\n                const token = tokens[i];\r\n                if (token.type === \"lparen\") depth += 1;\r\n                if (token.type === \"rparen\") depth -= 1;\r\n\r\n                if (depth === 0 && token.type === \"operator\" && (token.value === \"+\" || token.value === \"-\") && i > 0) {\r\n                    const previous = tokens[i - 1];\r\n                    const isUnary = previous.type === \"operator\" || previous.type === \"lparen\" || previous.type === \"comma\";\r\n                    if (!isUnary) candidates.push(i);\r\n                }\r\n            }\r\n\r\n            if (candidates.length !== 1) return null;\r\n\r\n            const operatorIndex = candidates[0];\r\n            const leftTokens = tokens.slice(0, operatorIndex);\r\n            const rightTokens = tokens.slice(operatorIndex + 1);\r\n            if (!leftTokens.length || !rightTokens.length) return null;\r\n\r\n            const base = new Parser(leftTokens).parse();\r\n            const fraction = new Parser(rightTokens).parse();\r\n            return tokens[operatorIndex].value === \"+\"\r\n                ? base + (base * fraction)\r\n                : base - (base * fraction);\r\n        }\r\n\r\n        function evaluateExpression(expression) {\r\n            const tokens = tokenize(expression);\r\n            const relativePercentageResult = tryEvaluateRelativePercentage(tokens);\r\n            const parser = new Parser(tokens);\r\n            let result = relativePercentageResult ?? parser.parse();\r\n\r\n            if (Number.isNaN(result)) throw new CalcError(\"Result is not a real number\");\r\n            if (!Number.isFinite(result)) throw new CalcError(\"Result is outside the supported numeric range\");\r\n\r\n            result = roundFloatingNoise(normalizeNegativeZero(result));\r\n            return result;\r\n        }\r\n\r\n        \/* =========================================================\r\n           08. RESULT FORMATTING\r\n        ========================================================== *\/\r\n        function formatExponent(exponent) {\r\n            return exponent >= 0 ? `+${exponent}` : `${exponent}`;\r\n        }\r\n\r\n        function formatNormal(value) {\r\n            const precision = state.precision === \"auto\" ? null : Number(state.precision);\r\n            let normalized = normalizeNegativeZero(value);\r\n\r\n            if (precision !== null) {\r\n                normalized = Number(normalized.toFixed(precision));\r\n            } else {\r\n                normalized = roundFloatingNoise(normalized);\r\n            }\r\n\r\n            const absolute = Math.abs(normalized);\r\n            if (absolute !== 0 && (absolute >= 1e15 || absolute < 1e-9)) {\r\n                return normalized.toExponential(12).replace(\/\\.0+e\/, \"e\").replace(\/(\\.\\d*?[1-9])0+e\/, \"$1e\");\r\n            }\r\n\r\n            const raw = String(normalized);\r\n            if (\/e\/i.test(raw)) return raw;\r\n\r\n            const [integerPart, decimalPart] = raw.split(\".\");\r\n            const sign = integerPart.startsWith(\"-\") ? \"-\" : \"\";\r\n            const integerDigits = sign ? integerPart.slice(1) : integerPart;\r\n            const grouped = integerDigits.replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, \",\");\r\n            return `${sign}${grouped}${decimalPart ? `.${decimalPart}` : \"\"}`;\r\n        }\r\n\r\n        function formatScientific(value) {\r\n            if (value === 0) return \"0\";\r\n            const digits = state.precision === \"auto\" ? 10 : clamp(Number(state.precision), 1, 12);\r\n            const [coefficient, exponent] = value.toExponential(digits).split(\"e\");\r\n            return `${Number(coefficient)} \u00d7 10^${Number(exponent)}`;\r\n        }\r\n\r\n        function formatEngineering(value) {\r\n            if (value === 0) return \"0\";\r\n            const exponent = Math.floor(Math.log10(Math.abs(value)) \/ 3) * 3;\r\n            const coefficient = value \/ Math.pow(10, exponent);\r\n            const digits = state.precision === \"auto\" ? 10 : clamp(Number(state.precision), 1, 12);\r\n            const rounded = Number(coefficient.toPrecision(digits));\r\n            return `${rounded} \u00d7 10^${exponent}`;\r\n        }\r\n\r\n        function formatResult(value) {\r\n            if (!isFiniteNumber(value)) return \"Error\";\r\n            if (state.numberFormat === \"scientific\") return formatScientific(value);\r\n            if (state.numberFormat === \"engineering\") return formatEngineering(value);\r\n            return formatNormal(value);\r\n        }\r\n\r\n        \/* =========================================================\r\n           09. INPUT EDITING\r\n        ========================================================== *\/\r\n        function getInputSelection() {\r\n            const start = dom.expressionInput.selectionStart ?? dom.expressionInput.value.length;\r\n            const end = dom.expressionInput.selectionEnd ?? start;\r\n            return { start, end };\r\n        }\r\n\r\n        function setInputCursor(position) {\r\n            requestAnimationFrame(() => {\r\n                dom.expressionInput.focus();\r\n                dom.expressionInput.setSelectionRange(position, position);\r\n            });\r\n        }\r\n\r\n        function replaceSelection(text, cursorOffset = text.length) {\r\n            const input = dom.expressionInput;\r\n            const { start, end } = getInputSelection();\r\n            const before = input.value.slice(0, start);\r\n            const after = input.value.slice(end);\r\n\r\n            input.value = before + text + after;\r\n            state.expression = input.value;\r\n            state.justEvaluated = false;\r\n            const nextPosition = start + cursorOffset;\r\n            setInputCursor(nextPosition);\r\n            updateLivePreview();\r\n        }\r\n\r\n        function insertText(text) {\r\n            if (state.justEvaluated && \/^[0-9.(A-Za-z]\/.test(text) && ![\"pi\", \"e\", \"phi\", \"ans\"].includes(text)) {\r\n                clearCurrentExpression(false);\r\n            } else if (state.justEvaluated && \/^[+\\-*\/^%]\/.test(text)) {\r\n                dom.expressionInput.value = String(state.result);\r\n                state.expression = dom.expressionInput.value;\r\n                dom.expressionInput.setSelectionRange(dom.expressionInput.value.length, dom.expressionInput.value.length);\r\n            }\r\n\r\n            replaceSelection(text);\r\n        }\r\n\r\n        function smartParenthesis() {\r\n            const value = dom.expressionInput.value;\r\n            const { start } = getInputSelection();\r\n            const before = value.slice(0, start);\r\n            const opens = (before.match(\/\\(\/g) || []).length;\r\n            const closes = (before.match(\/\\)\/g) || []).length;\r\n            const previous = before.trim().slice(-1);\r\n\r\n            const shouldClose = opens > closes && \/[\\dA-Za-z)!%]\/.test(previous);\r\n            insertText(shouldClose ? \")\" : \"(\");\r\n        }\r\n\r\n        function backspaceInput() {\r\n            const input = dom.expressionInput;\r\n            const { start, end } = getInputSelection();\r\n\r\n            if (start !== end) {\r\n                input.setRangeText(\"\", start, end, \"end\");\r\n            } else if (start > 0) {\r\n                const before = input.value.slice(0, start);\r\n                const knownSuffixes = [\"sqrt(\", \"asinh(\", \"acosh(\", \"atanh(\", \"sinh(\", \"cosh(\", \"tanh(\", \"asin(\", \"acos(\", \"atan(\", \"log2(\", \"floor(\", \"ceil(\", \"round(\", \"trunc(\", \"sign(\", \"sin(\", \"cos(\", \"tan(\", \"log(\", \"ln(\", \"abs(\", \"gcd(\", \"lcm(\", \"ncr(\", \"npr(\", \"mod(\", \"min(\", \"max(\", \"root(\"];\r\n                const suffix = knownSuffixes.find(item => before.endsWith(item));\r\n                const deleteCount = suffix ? suffix.length : 1;\r\n                input.setRangeText(\"\", start - deleteCount, start, \"end\");\r\n            }\r\n\r\n            state.expression = input.value;\r\n            state.justEvaluated = false;\r\n            updateLivePreview();\r\n            input.focus();\r\n        }\r\n\r\n        function clearCurrentExpression(resetResult = true) {\r\n            dom.expressionInput.value = \"\";\r\n            state.expression = \"\";\r\n            state.justEvaluated = false;\r\n            dom.previewOutput.textContent = \"\";\r\n            if (resetResult) {\r\n                state.result = 0;\r\n                dom.resultOutput.textContent = \"0\";\r\n            }\r\n            clearMessage();\r\n            dom.expressionInput.focus();\r\n        }\r\n\r\n        function toggleSign() {\r\n            const input = dom.expressionInput;\r\n            const { start, end } = getInputSelection();\r\n\r\n            if (start !== end) {\r\n                const selected = input.value.slice(start, end);\r\n                input.setRangeText(`-(${selected})`, start, end, \"end\");\r\n            } else if (input.value.trim()) {\r\n                input.value = `-(${input.value})`;\r\n                input.setSelectionRange(input.value.length, input.value.length);\r\n            } else if (state.result !== 0) {\r\n                input.value = String(-state.result);\r\n                input.setSelectionRange(input.value.length, input.value.length);\r\n            } else {\r\n                input.value = \"-\";\r\n                input.setSelectionRange(1, 1);\r\n            }\r\n\r\n            state.expression = input.value;\r\n            state.justEvaluated = false;\r\n            updateLivePreview();\r\n            input.focus();\r\n        }\r\n\r\n        function wrapCurrentExpression(prefix, suffix = \")\") {\r\n            const input = dom.expressionInput;\r\n            const { start, end } = getInputSelection();\r\n\r\n            if (start !== end) {\r\n                const selected = input.value.slice(start, end);\r\n                input.setRangeText(`${prefix}${selected}${suffix}`, start, end, \"end\");\r\n            } else if (input.value.trim()) {\r\n                input.value = `${prefix}${input.value}${suffix}`;\r\n                input.setSelectionRange(input.value.length, input.value.length);\r\n            } else if (state.justEvaluated || state.result !== 0) {\r\n                input.value = `${prefix}${state.result}${suffix}`;\r\n                input.setSelectionRange(input.value.length, input.value.length);\r\n            } else {\r\n                input.value = prefix + suffix;\r\n                const cursor = prefix.length;\r\n                input.setSelectionRange(cursor, cursor);\r\n            }\r\n\r\n            state.expression = input.value;\r\n            state.justEvaluated = false;\r\n            updateLivePreview();\r\n            input.focus();\r\n        }\r\n\r\n        \/* =========================================================\r\n           10. EVALUATION & LIVE PREVIEW\r\n        ========================================================== *\/\r\n        function updateLivePreview() {\r\n            state.expression = dom.expressionInput.value;\r\n            clearMessage();\r\n\r\n            if (!state.expression.trim()) {\r\n                dom.previewOutput.textContent = \"\";\r\n                return;\r\n            }\r\n\r\n            try {\r\n                const result = evaluateExpression(state.expression);\r\n                dom.previewOutput.textContent = `= ${formatResult(result)}`;\r\n            } catch {\r\n                dom.previewOutput.textContent = \"\";\r\n            }\r\n        }\r\n\r\n        function evaluateCurrentExpression() {\r\n            const expression = dom.expressionInput.value.trim();\r\n            if (!expression) {\r\n                showMessage(\"Enter an expression\", \"error\");\r\n                return;\r\n            }\r\n\r\n            try {\r\n                const result = evaluateExpression(expression);\r\n                state.result = result;\r\n                state.previousAnswer = result;\r\n                state.justEvaluated = true;\r\n                state.lastEvaluation = { expression, result };\r\n\r\n                dom.resultOutput.textContent = formatResult(result);\r\n                dom.previewOutput.textContent = \"\";\r\n                clearMessage();\r\n\r\n                addHistory(expression, result);\r\n            } catch (error) {\r\n                const message = error instanceof CalcError ? error.message : \"Invalid expression\";\r\n                showMessage(message, \"error\");\r\n                dom.previewOutput.textContent = \"\";\r\n            }\r\n        }\r\n\r\n        \/* =========================================================\r\n           11. SHIFT \/ SECOND FUNCTIONS\r\n        ========================================================== *\/\r\n        function setSecondMode(enabled) {\r\n            state.secondMode = Boolean(enabled);\r\n            dom.shiftIndicator.classList.toggle(\"is-active\", state.secondMode);\r\n            dom.shiftButton.classList.toggle(\"key-shifted\", state.secondMode);\r\n            dom.shiftButton.setAttribute(\"aria-pressed\", String(state.secondMode));\r\n\r\n            document.querySelectorAll(\".shiftable\").forEach(button => {\r\n                if (state.secondMode) {\r\n                    button.textContent = button.dataset.shiftLabel || button.textContent;\r\n\r\n                    if (button.dataset.shiftInsert) button.dataset.insert = button.dataset.shiftInsert;\r\n                    else delete button.dataset.insert;\r\n\r\n                    if (button.dataset.shiftAction) button.dataset.action = button.dataset.shiftAction;\r\n                    else delete button.dataset.action;\r\n                } else {\r\n                    button.textContent = button.dataset.normalLabel || button.textContent;\r\n\r\n                    if (button.dataset.normalInsert) button.dataset.insert = button.dataset.normalInsert;\r\n                    else delete button.dataset.insert;\r\n\r\n                    if (button.dataset.normalAction) button.dataset.action = button.dataset.normalAction;\r\n                    else delete button.dataset.action;\r\n                }\r\n            });\r\n        }\r\n\r\n        \/* =========================================================\r\n           12. MEMORY\r\n        ========================================================== *\/\r\n        function resolveCurrentNumericValue() {\r\n            const expression = dom.expressionInput.value.trim();\r\n            if (expression) return evaluateExpression(expression);\r\n            return state.result;\r\n        }\r\n\r\n        function updateMemoryIndicator() {\r\n            dom.memoryIndicator.classList.toggle(\"is-active\", state.memory !== 0);\r\n            dom.memoryIndicator.title = state.memory !== 0 ? `Memory: ${formatResult(state.memory)}` : \"Memory is empty\";\r\n        }\r\n\r\n        function memoryAction(action) {\r\n            try {\r\n                switch (action) {\r\n                    case \"memory-clear\":\r\n                        state.memory = 0;\r\n                        showMessage(\"Memory cleared\", \"success\");\r\n                        break;\r\n                    case \"memory-recall\":\r\n                        insertText(String(state.memory));\r\n                        showMessage(\"Memory recalled\", \"success\");\r\n                        break;\r\n                    case \"memory-store\":\r\n                        state.memory = resolveCurrentNumericValue();\r\n                        showMessage(\"Value stored in memory\", \"success\");\r\n                        break;\r\n                    case \"memory-add\":\r\n                        state.memory += resolveCurrentNumericValue();\r\n                        showMessage(\"Added to memory\", \"success\");\r\n                        break;\r\n                    case \"memory-subtract\":\r\n                        state.memory -= resolveCurrentNumericValue();\r\n                        showMessage(\"Subtracted from memory\", \"success\");\r\n                        break;\r\n                    default:\r\n                        return;\r\n                }\r\n                state.memory = roundFloatingNoise(state.memory);\r\n                updateMemoryIndicator();\r\n            } catch (error) {\r\n                showMessage(error instanceof CalcError ? error.message : \"Unable to use memory\", \"error\");\r\n            }\r\n        }\r\n\r\n        \/* =========================================================\r\n           13. HISTORY\r\n        ========================================================== *\/\r\n        function loadHistory() {\r\n            if (!state.historyPersistence) {\r\n                state.history = [];\r\n                return;\r\n            }\r\n\r\n            const raw = safeStorageGet(STORAGE_KEYS.history);\r\n            if (!raw) return;\r\n\r\n            try {\r\n                const parsed = JSON.parse(raw);\r\n                if (Array.isArray(parsed)) {\r\n                    state.history = parsed\r\n                        .filter(item => item && typeof item.expression === \"string\" && isFiniteNumber(item.result))\r\n                        .slice(0, MAX_HISTORY);\r\n                }\r\n            } catch {\r\n                state.history = [];\r\n            }\r\n        }\r\n\r\n        function persistHistory() {\r\n            if (!state.historyPersistence) {\r\n                safeStorageRemove(STORAGE_KEYS.history);\r\n                return;\r\n            }\r\n            safeStorageSet(STORAGE_KEYS.history, JSON.stringify(state.history.slice(0, MAX_HISTORY)));\r\n        }\r\n\r\n        function addHistory(expression, result) {\r\n            const entry = {\r\n                id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n                expression,\r\n                result,\r\n                timestamp: Date.now()\r\n            };\r\n\r\n            state.history.unshift(entry);\r\n            state.history = state.history.slice(0, MAX_HISTORY);\r\n            persistHistory();\r\n            renderHistory();\r\n        }\r\n\r\n        function renderHistory() {\r\n            dom.historyList.innerHTML = \"\";\r\n\r\n            if (!state.history.length) {\r\n                const empty = document.createElement(\"div\");\r\n                empty.className = \"history-empty\";\r\n                empty.textContent = \"Your completed calculations will appear here.\";\r\n                dom.historyList.appendChild(empty);\r\n                return;\r\n            }\r\n\r\n            const fragment = document.createDocumentFragment();\r\n\r\n            state.history.forEach(entry => {\r\n                const item = document.createElement(\"article\");\r\n                item.className = \"history-item\";\r\n                item.dataset.historyId = entry.id;\r\n\r\n                const expressionButton = document.createElement(\"button\");\r\n                expressionButton.className = \"history-expression\";\r\n                expressionButton.type = \"button\";\r\n                expressionButton.textContent = entry.expression;\r\n                expressionButton.title = \"Load expression\";\r\n                expressionButton.dataset.historyAction = \"expression\";\r\n\r\n                const resultButton = document.createElement(\"button\");\r\n                resultButton.className = \"history-result\";\r\n                resultButton.type = \"button\";\r\n                resultButton.textContent = `= ${formatResult(entry.result)}`;\r\n                resultButton.title = \"Use result\";\r\n                resultButton.dataset.historyAction = \"result\";\r\n\r\n                const time = document.createElement(\"time\");\r\n                time.className = \"history-time\";\r\n                time.dateTime = new Date(entry.timestamp).toISOString();\r\n                time.textContent = new Date(entry.timestamp).toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\r\n\r\n                const removeButton = document.createElement(\"button\");\r\n                removeButton.className = \"history-delete\";\r\n                removeButton.type = \"button\";\r\n                removeButton.ariaLabel = \"Delete history entry\";\r\n                removeButton.title = \"Delete\";\r\n                removeButton.textContent = \"\u00d7\";\r\n                removeButton.dataset.historyAction = \"delete\";\r\n\r\n                item.append(expressionButton, resultButton, time, removeButton);\r\n                fragment.appendChild(item);\r\n            });\r\n\r\n            dom.historyList.appendChild(fragment);\r\n        }\r\n\r\n        function handleHistoryClick(event) {\r\n            const button = event.target.closest(\"button[data-history-action]\");\r\n            if (!button) return;\r\n\r\n            const item = button.closest(\".history-item\");\r\n            const entry = state.history.find(historyEntry => historyEntry.id === item?.dataset.historyId);\r\n            if (!entry) return;\r\n\r\n            const action = button.dataset.historyAction;\r\n\r\n            if (action === \"delete\") {\r\n                state.history = state.history.filter(historyEntry => historyEntry.id !== entry.id);\r\n                persistHistory();\r\n                renderHistory();\r\n                return;\r\n            }\r\n\r\n            if (action === \"expression\") {\r\n                dom.expressionInput.value = entry.expression;\r\n                state.expression = entry.expression;\r\n                state.justEvaluated = false;\r\n                dom.expressionInput.focus();\r\n                dom.expressionInput.setSelectionRange(entry.expression.length, entry.expression.length);\r\n                updateLivePreview();\r\n            }\r\n\r\n            if (action === \"result\") {\r\n                insertText(String(entry.result));\r\n            }\r\n\r\n            closeMobileHistory();\r\n        }\r\n\r\n        function clearHistory() {\r\n            state.history = [];\r\n            persistHistory();\r\n            renderHistory();\r\n            showMessage(\"History cleared\", \"success\");\r\n        }\r\n\r\n        \/* =========================================================\r\n           14. COPY & FRACTION\r\n        ========================================================== *\/\r\n        async function copyResult() {\r\n            const text = String(state.result);\r\n            if (!text || !isFiniteNumber(state.result)) {\r\n                showMessage(\"Nothing to copy\", \"error\");\r\n                return;\r\n            }\r\n\r\n            try {\r\n                if (navigator.clipboard && window.isSecureContext) {\r\n                    await navigator.clipboard.writeText(text);\r\n                } else {\r\n                    const helper = document.createElement(\"textarea\");\r\n                    helper.value = text;\r\n                    helper.setAttribute(\"readonly\", \"\");\r\n                    helper.style.position = \"absolute\";\r\n                    helper.style.left = \"-9999px\";\r\n                    document.body.appendChild(helper);\r\n                    helper.select();\r\n                    const copied = document.execCommand(\"copy\");\r\n                    helper.remove();\r\n                    if (!copied) throw new Error(\"Copy failed\");\r\n                }\r\n                showMessage(\"Copied\", \"success\");\r\n            } catch {\r\n                showMessage(\"Copy is not available in this browser\", \"error\");\r\n            }\r\n        }\r\n\r\n        function decimalToFraction(value, maxDenominator = 100000) {\r\n            if (!isFiniteNumber(value)) return null;\r\n            if (nearlyInteger(value)) return `${Math.round(value)}\/1`;\r\n\r\n            const sign = value < 0 ? -1 : 1;\r\n            let x = Math.abs(value);\r\n            let h1 = 1, h0 = 0, k1 = 0, k0 = 1;\r\n            let bestH = 0, bestK = 1;\r\n\r\n            for (let i = 0; i < 40; i += 1) {\r\n                const a = Math.floor(x);\r\n                const h2 = a * h1 + h0;\r\n                const k2 = a * k1 + k0;\r\n                if (k2 > maxDenominator) break;\r\n                bestH = h2;\r\n                bestK = k2;\r\n                if (Math.abs(value - sign * bestH \/ bestK) < 1e-12) break;\r\n                h0 = h1; h1 = h2;\r\n                k0 = k1; k1 = k2;\r\n                x = 1 \/ (x - a);\r\n                if (!Number.isFinite(x)) break;\r\n            }\r\n\r\n            const gcd = integerGcd(bestH, bestK);\r\n            return `${sign * (bestH \/ gcd)}\/${bestK \/ gcd}`;\r\n        }\r\n\r\n        function showFraction() {\r\n            if (!isFiniteNumber(state.result)) {\r\n                showMessage(\"No numeric result available\", \"error\");\r\n                return;\r\n            }\r\n            const fraction = decimalToFraction(state.result);\r\n            showMessage(`Fraction: ${fraction}`, \"success\");\r\n        }\r\n\r\n        \/* =========================================================\r\n           15. THEMES & SETTINGS\r\n        ========================================================== *\/\r\n        function applyTheme(theme, persist = true) {\r\n            state.theme = theme === \"light\" ? \"light\" : \"dark\";\r\n            dom.html.dataset.theme = state.theme;\r\n            dom.themeSelect.value = state.theme;\r\n            dom.themeButton.title = state.theme === \"dark\" ? \"Switch to light theme\" : \"Switch to dark theme\";\r\n            if (persist) safeStorageSet(STORAGE_KEYS.theme, state.theme);\r\n        }\r\n\r\n        function applyAngleMode(mode, persist = true) {\r\n            if (![\"DEG\", \"RAD\", \"GRAD\"].includes(mode)) return;\r\n            state.angleMode = mode;\r\n            dom.angleIndicator.textContent = mode;\r\n            document.querySelectorAll(\"[data-angle]\").forEach(button => {\r\n                button.setAttribute(\"aria-pressed\", String(button.dataset.angle === mode));\r\n            });\r\n            if (persist) safeStorageSet(STORAGE_KEYS.angle, mode);\r\n            updateLivePreview();\r\n        }\r\n\r\n        function applyNumberFormat(format, persist = true) {\r\n            if (![\"normal\", \"scientific\", \"engineering\"].includes(format)) return;\r\n            state.numberFormat = format;\r\n            dom.formatSelect.value = format;\r\n            dom.formatIndicator.textContent = format.toUpperCase();\r\n            if (persist) safeStorageSet(STORAGE_KEYS.format, format);\r\n            dom.resultOutput.textContent = formatResult(state.result);\r\n            renderHistory();\r\n            updateLivePreview();\r\n        }\r\n\r\n        function applyPrecision(precision, persist = true) {\r\n            const allowed = new Set([\"auto\", \"4\", \"6\", \"8\", \"10\", \"12\"]);\r\n            state.precision = allowed.has(String(precision)) ? String(precision) : \"auto\";\r\n            dom.precisionSelect.value = state.precision;\r\n            if (persist) safeStorageSet(STORAGE_KEYS.precision, state.precision);\r\n            dom.resultOutput.textContent = formatResult(state.result);\r\n            renderHistory();\r\n            updateLivePreview();\r\n        }\r\n\r\n        function applyHistoryPersistence(value, persist = true) {\r\n            state.historyPersistence = value === true || value === \"on\";\r\n            dom.historyPersistenceSelect.value = state.historyPersistence ? \"on\" : \"off\";\r\n            if (persist) safeStorageSet(STORAGE_KEYS.historyPersistence, state.historyPersistence ? \"on\" : \"off\");\r\n            if (!state.historyPersistence) safeStorageRemove(STORAGE_KEYS.history);\r\n            else persistHistory();\r\n        }\r\n\r\n        function openSettings() {\r\n            dom.settingsBackdrop.hidden = false;\r\n            dom.closeSettingsButton.focus();\r\n        }\r\n\r\n        function closeSettings() {\r\n            dom.settingsBackdrop.hidden = true;\r\n            dom.settingsButton.focus();\r\n        }\r\n\r\n        function resetSettings() {\r\n            applyTheme(window.matchMedia?.(\"(prefers-color-scheme: light)\").matches ? \"light\" : \"dark\");\r\n            applyAngleMode(\"DEG\");\r\n            applyNumberFormat(\"normal\");\r\n            applyPrecision(\"auto\");\r\n            applyHistoryPersistence(true);\r\n            showMessage(\"Settings reset\", \"success\");\r\n        }\r\n\r\n        function loadSettings() {\r\n            const preferredTheme = window.matchMedia?.(\"(prefers-color-scheme: light)\").matches ? \"light\" : \"dark\";\r\n            applyTheme(safeStorageGet(STORAGE_KEYS.theme) || preferredTheme, false);\r\n            applyAngleMode(safeStorageGet(STORAGE_KEYS.angle) || \"DEG\", false);\r\n            applyNumberFormat(safeStorageGet(STORAGE_KEYS.format) || \"normal\", false);\r\n            applyPrecision(safeStorageGet(STORAGE_KEYS.precision) || \"auto\", false);\r\n            applyHistoryPersistence(safeStorageGet(STORAGE_KEYS.historyPersistence) !== \"off\", false);\r\n        }\r\n\r\n        \/* =========================================================\r\n           16. APPLICATION MODES\r\n        ========================================================== *\/\r\n        function setApplicationMode(mode) {\r\n            state.currentMode = mode === \"converter\" ? \"converter\" : \"scientific\";\r\n            const scientific = state.currentMode === \"scientific\";\r\n            dom.scientificWorkspace.hidden = !scientific;\r\n            dom.converterWorkspace.hidden = scientific;\r\n            dom.scientificModeButton.setAttribute(\"aria-pressed\", String(scientific));\r\n            dom.converterModeButton.setAttribute(\"aria-pressed\", String(!scientific));\r\n            if (scientific) dom.expressionInput.focus();\r\n        }\r\n\r\n        \/* =========================================================\r\n           17. UNIT CONVERTER DATA & ENGINE\r\n        ========================================================== *\/\r\n        const UNIT_DATA = {\r\n            Length: {\r\n                base: \"m\",\r\n                formula: \"Converted through metres\",\r\n                units: {\r\n                    mm: { label: \"Millimetres (mm)\", factor: 0.001 },\r\n                    cm: { label: \"Centimetres (cm)\", factor: 0.01 },\r\n                    m: { label: \"Metres (m)\", factor: 1 },\r\n                    km: { label: \"Kilometres (km)\", factor: 1000 },\r\n                    in: { label: \"Inches (in)\", factor: 0.0254 },\r\n                    ft: { label: \"Feet (ft)\", factor: 0.3048 },\r\n                    yd: { label: \"Yards (yd)\", factor: 0.9144 },\r\n                    mi: { label: \"Miles (mi)\", factor: 1609.344 }\r\n                }\r\n            },\r\n            Mass: {\r\n                base: \"kg\",\r\n                formula: \"Converted through kilograms\",\r\n                units: {\r\n                    mg: { label: \"Milligrams (mg)\", factor: 1e-6 },\r\n                    g: { label: \"Grams (g)\", factor: 0.001 },\r\n                    kg: { label: \"Kilograms (kg)\", factor: 1 },\r\n                    oz: { label: \"Ounces (oz)\", factor: 0.028349523125 },\r\n                    lb: { label: \"Pounds (lb)\", factor: 0.45359237 }\r\n                }\r\n            },\r\n            Temperature: {\r\n                base: \"C\",\r\n                formula: \"Uses exact temperature offset\/scale formulas\",\r\n                units: {\r\n                    C: { label: \"Celsius (\u00b0C)\" },\r\n                    F: { label: \"Fahrenheit (\u00b0F)\" },\r\n                    K: { label: \"Kelvin (K)\" }\r\n                }\r\n            },\r\n            Area: {\r\n                base: \"m2\",\r\n                formula: \"Converted through square metres\",\r\n                units: {\r\n                    m2: { label: \"Square metres (m\u00b2)\", factor: 1 },\r\n                    km2: { label: \"Square kilometres (km\u00b2)\", factor: 1e6 },\r\n                    ft2: { label: \"Square feet (ft\u00b2)\", factor: 0.09290304 },\r\n                    acre: { label: \"Acres\", factor: 4046.8564224 },\r\n                    hectare: { label: \"Hectares\", factor: 10000 }\r\n                }\r\n            },\r\n            Volume: {\r\n                base: \"L\",\r\n                formula: \"Converted through litres (US customary cup\/gallon)\",\r\n                units: {\r\n                    mL: { label: \"Millilitres (mL)\", factor: 0.001 },\r\n                    L: { label: \"Litres (L)\", factor: 1 },\r\n                    cup: { label: \"US cups\", factor: 0.2365882365 },\r\n                    gallon: { label: \"US gallons\", factor: 3.785411784 }\r\n                }\r\n            },\r\n            Speed: {\r\n                base: \"mps\",\r\n                formula: \"Converted through metres per second\",\r\n                units: {\r\n                    mps: { label: \"Metres\/second (m\/s)\", factor: 1 },\r\n                    kmh: { label: \"Kilometres\/hour (km\/h)\", factor: 0.2777777777777778 },\r\n                    mph: { label: \"Miles\/hour (mph)\", factor: 0.44704 }\r\n                }\r\n            },\r\n            Time: {\r\n                base: \"s\",\r\n                formula: \"Converted through seconds\",\r\n                units: {\r\n                    s: { label: \"Seconds\", factor: 1 },\r\n                    min: { label: \"Minutes\", factor: 60 },\r\n                    h: { label: \"Hours\", factor: 3600 },\r\n                    d: { label: \"Days\", factor: 86400 }\r\n                }\r\n            }\r\n        };\r\n\r\n        function temperatureToCelsius(value, unit) {\r\n            if (unit === \"C\") return value;\r\n            if (unit === \"F\") return (value - 32) * 5 \/ 9;\r\n            if (unit === \"K\") return value - 273.15;\r\n            return value;\r\n        }\r\n\r\n        function celsiusToTemperature(value, unit) {\r\n            if (unit === \"C\") return value;\r\n            if (unit === \"F\") return value * 9 \/ 5 + 32;\r\n            if (unit === \"K\") return value + 273.15;\r\n            return value;\r\n        }\r\n\r\n        function convertUnits(category, value, fromUnit, toUnit) {\r\n            const group = UNIT_DATA[category];\r\n            if (!group) throw new Error(\"Unknown category\");\r\n\r\n            if (category === \"Temperature\") {\r\n                const celsius = temperatureToCelsius(value, fromUnit);\r\n                const result = celsiusToTemperature(celsius, toUnit);\r\n                if (toUnit === \"K\" && result < 0) throw new CalcError(\"Temperature cannot be below absolute zero\");\r\n                return result;\r\n            }\r\n\r\n            const from = group.units[fromUnit];\r\n            const to = group.units[toUnit];\r\n            if (!from || !to) throw new Error(\"Unknown unit\");\r\n            return value * from.factor \/ to.factor;\r\n        }\r\n\r\n        function populateConverterCategories() {\r\n            dom.converterCategory.innerHTML = \"\";\r\n            Object.keys(UNIT_DATA).forEach(category => {\r\n                const option = document.createElement(\"option\");\r\n                option.value = category;\r\n                option.textContent = category;\r\n                dom.converterCategory.appendChild(option);\r\n            });\r\n            dom.converterCategory.value = \"Length\";\r\n            populateConverterUnits();\r\n        }\r\n\r\n        function populateConverterUnits() {\r\n            const category = dom.converterCategory.value;\r\n            const group = UNIT_DATA[category];\r\n            dom.converterFrom.innerHTML = \"\";\r\n            dom.converterTo.innerHTML = \"\";\r\n\r\n            Object.entries(group.units).forEach(([key, data]) => {\r\n                const fromOption = document.createElement(\"option\");\r\n                fromOption.value = key;\r\n                fromOption.textContent = data.label;\r\n                dom.converterFrom.appendChild(fromOption);\r\n\r\n                const toOption = fromOption.cloneNode(true);\r\n                dom.converterTo.appendChild(toOption);\r\n            });\r\n\r\n            const keys = Object.keys(group.units);\r\n            dom.converterFrom.value = keys[0];\r\n            dom.converterTo.value = keys[Math.min(1, keys.length - 1)];\r\n            dom.converterFormula.textContent = group.formula;\r\n            updateConverter();\r\n        }\r\n\r\n        function updateConverter() {\r\n            const value = Number(dom.converterValue.value);\r\n            if (!Number.isFinite(value)) {\r\n                dom.converterResult.textContent = \"Enter a valid number\";\r\n                return;\r\n            }\r\n\r\n            try {\r\n                const result = convertUnits(\r\n                    dom.converterCategory.value,\r\n                    value,\r\n                    dom.converterFrom.value,\r\n                    dom.converterTo.value\r\n                );\r\n                dom.converterResult.textContent = formatNormal(roundFloatingNoise(result));\r\n            } catch (error) {\r\n                dom.converterResult.textContent = error instanceof CalcError ? error.message : \"Conversion error\";\r\n            }\r\n        }\r\n\r\n        function swapConverterUnits() {\r\n            const from = dom.converterFrom.value;\r\n            dom.converterFrom.value = dom.converterTo.value;\r\n            dom.converterTo.value = from;\r\n            updateConverter();\r\n        }\r\n\r\n        \/* =========================================================\r\n           18. MOBILE HISTORY\r\n        ========================================================== *\/\r\n        function openMobileHistory() {\r\n            dom.historyPanel.classList.add(\"is-open\");\r\n            dom.mobileHistoryBackdrop.hidden = false;\r\n        }\r\n\r\n        function closeMobileHistory() {\r\n            dom.historyPanel.classList.remove(\"is-open\");\r\n            dom.mobileHistoryBackdrop.hidden = true;\r\n        }\r\n\r\n        \/* =========================================================\r\n           19. CALCULATOR BUTTON ACTIONS\r\n        ========================================================== *\/\r\n        function handleCalculatorButton(button) {\r\n            const action = button.dataset.action;\r\n            const insert = button.dataset.insert;\r\n\r\n            if (insert !== undefined) {\r\n                insertText(insert);\r\n                if (state.secondMode && button.classList.contains(\"shiftable\")) setSecondMode(false);\r\n                return;\r\n            }\r\n\r\n            switch (action) {\r\n                case \"evaluate\":\r\n                    evaluateCurrentExpression();\r\n                    break;\r\n                case \"clear\":\r\n                    clearCurrentExpression(true);\r\n                    break;\r\n                case \"backspace\":\r\n                    backspaceInput();\r\n                    break;\r\n                case \"smart-parenthesis\":\r\n                    smartParenthesis();\r\n                    break;\r\n                case \"toggle-sign\":\r\n                    toggleSign();\r\n                    break;\r\n                case \"shift\":\r\n                    setSecondMode(!state.secondMode);\r\n                    break;\r\n                case \"square\":\r\n                    wrapCurrentExpression(\"(\", \")^2\");\r\n                    break;\r\n                case \"cube\":\r\n                    wrapCurrentExpression(\"(\", \")^3\");\r\n                    break;\r\n                case \"reciprocal\":\r\n                    wrapCurrentExpression(\"1\/(\", \")\");\r\n                    break;\r\n                case \"random\":\r\n                    insertText(String(Math.random()));\r\n                    break;\r\n                case \"memory-clear\":\r\n                case \"memory-recall\":\r\n                case \"memory-add\":\r\n                case \"memory-subtract\":\r\n                case \"memory-store\":\r\n                    memoryAction(action);\r\n                    break;\r\n                default:\r\n                    break;\r\n            }\r\n\r\n            if (state.secondMode && button.classList.contains(\"shiftable\")) setSecondMode(false);\r\n        }\r\n\r\n        \/* =========================================================\r\n           20. KEYBOARD INPUT\r\n        ========================================================== *\/\r\n        function flashMatchingKey(key) {\r\n            const selectorMap = {\r\n                \"+\": '[data-insert=\"+\"]',\r\n                \"-\": '[data-insert=\"-\"]',\r\n                \"*\": '[data-insert=\"\u00d7\"]',\r\n                \"\/\": '[data-insert=\"\u00f7\"]',\r\n                \"^\": '[data-insert=\"^\"]',\r\n                \"%\": '[data-insert=\"%\"]',\r\n                \"(\": '[data-insert=\"(\"]',\r\n                \")\": '[data-insert=\")\"]',\r\n                \".\": '[data-insert=\".\"]'\r\n            };\r\n\r\n            const selector = \/\\d\/.test(key) ? `[data-insert=\"${key}\"]` : selectorMap[key];\r\n            if (!selector) return;\r\n            const button = document.querySelector(selector);\r\n            if (!button) return;\r\n            button.classList.add(\"is-flashed\");\r\n            window.setTimeout(() => button.classList.remove(\"is-flashed\"), 120);\r\n        }\r\n\r\n        function handleKeyboard(event) {\r\n            if (state.currentMode !== \"scientific\") return;\r\n            if (dom.settingsBackdrop.hidden === false) return;\r\n\r\n            const inputFocused = document.activeElement === dom.expressionInput;\r\n            if (!inputFocused) return;\r\n\r\n            if (event.key === \"Enter\") {\r\n                event.preventDefault();\r\n                evaluateCurrentExpression();\r\n                return;\r\n            }\r\n\r\n            if (event.key === \"Escape\") {\r\n                event.preventDefault();\r\n                clearCurrentExpression(true);\r\n                return;\r\n            }\r\n\r\n            if (event.key === \"Backspace\") {\r\n                event.preventDefault();\r\n                backspaceInput();\r\n                return;\r\n            }\r\n\r\n            const permitted = \/^[0-9+\\-*\/^().,%]$\/;\r\n            if (permitted.test(event.key)) {\r\n                event.preventDefault();\r\n                const displayKey = event.key === \"*\" ? \"\u00d7\" : event.key === \"\/\" ? \"\u00f7\" : event.key;\r\n                insertText(displayKey);\r\n                flashMatchingKey(event.key);\r\n                return;\r\n            }\r\n\r\n            if (\/^[A-Za-z]$\/.test(event.key)) {\r\n                \/\/ Let browser type function names naturally into the focused input.\r\n                return;\r\n            }\r\n        }\r\n\r\n        \/* =========================================================\r\n           21. EVENT BINDINGS\r\n        ========================================================== *\/\r\n        function bindEvents() {\r\n            document.querySelectorAll(\".calc-key, .tiny-button\").forEach(button => {\r\n                if (button.dataset.angle) {\r\n                    button.addEventListener(\"click\", () => applyAngleMode(button.dataset.angle));\r\n                } else {\r\n                    button.addEventListener(\"click\", () => handleCalculatorButton(button));\r\n                }\r\n            });\r\n\r\n            dom.expressionInput.addEventListener(\"input\", () => {\r\n                state.expression = dom.expressionInput.value;\r\n                state.justEvaluated = false;\r\n                updateLivePreview();\r\n            });\r\n\r\n            dom.expressionInput.addEventListener(\"keydown\", handleKeyboard);\r\n\r\n            dom.copyButton.addEventListener(\"click\", copyResult);\r\n            dom.fractionButton.addEventListener(\"click\", showFraction);\r\n            dom.themeButton.addEventListener(\"click\", () => applyTheme(state.theme === \"dark\" ? \"light\" : \"dark\"));\r\n\r\n            dom.scientificModeButton.addEventListener(\"click\", () => setApplicationMode(\"scientific\"));\r\n            dom.converterModeButton.addEventListener(\"click\", () => setApplicationMode(\"converter\"));\r\n\r\n            dom.historyList.addEventListener(\"click\", handleHistoryClick);\r\n            dom.clearHistoryButton.addEventListener(\"click\", clearHistory);\r\n            dom.mobileHistoryButton.addEventListener(\"click\", openMobileHistory);\r\n            dom.mobileHistoryBackdrop.addEventListener(\"click\", closeMobileHistory);\r\n\r\n            dom.settingsButton.addEventListener(\"click\", openSettings);\r\n            dom.closeSettingsButton.addEventListener(\"click\", closeSettings);\r\n            dom.doneSettingsButton.addEventListener(\"click\", closeSettings);\r\n            dom.resetSettingsButton.addEventListener(\"click\", resetSettings);\r\n\r\n            dom.settingsBackdrop.addEventListener(\"click\", event => {\r\n                if (event.target === dom.settingsBackdrop) closeSettings();\r\n            });\r\n\r\n            dom.themeSelect.addEventListener(\"change\", () => applyTheme(dom.themeSelect.value));\r\n            dom.formatSelect.addEventListener(\"change\", () => applyNumberFormat(dom.formatSelect.value));\r\n            dom.precisionSelect.addEventListener(\"change\", () => applyPrecision(dom.precisionSelect.value));\r\n            dom.historyPersistenceSelect.addEventListener(\"change\", () => applyHistoryPersistence(dom.historyPersistenceSelect.value));\r\n\r\n            dom.converterCategory.addEventListener(\"change\", populateConverterUnits);\r\n            dom.converterValue.addEventListener(\"input\", updateConverter);\r\n            dom.converterFrom.addEventListener(\"change\", updateConverter);\r\n            dom.converterTo.addEventListener(\"change\", updateConverter);\r\n            dom.swapUnitsButton.addEventListener(\"click\", swapConverterUnits);\r\n\r\n            window.addEventListener(\"resize\", () => {\r\n                if (window.innerWidth > 820) closeMobileHistory();\r\n            });\r\n        }\r\n\r\n        \/* =========================================================\r\n           22. SELF-TESTS\r\n        ========================================================== *\/\r\n        function runSelfTests() {\r\n            const originalMode = state.angleMode;\r\n            const tests = [\r\n                [\"2+2\", 4],\r\n                [\"2+3*4\", 14],\r\n                [\"(2+3)*4\", 20],\r\n                [\"10\/2+3\", 8],\r\n                [\"2^3\", 8],\r\n                [\"2^3^2\", 512],\r\n                [\"sqrt(144)\", 12],\r\n                [\"5!\", 120],\r\n                [\"0!\", 1],\r\n                [\"log(100)\", 2],\r\n                [\"ln(e)\", 1],\r\n                [\"0.1+0.2\", 0.3],\r\n                [\"ncr(5,2)\", 10],\r\n                [\"npr(5,2)\", 20],\r\n                [\"logb(8,2)\", 3],\r\n                [\"200*10%\", 20],\r\n                [\"200+10%\", 220],\r\n                [\"200-10%\", 180],\r\n                [\"2(3+4)\", 14],\r\n                [\"2pi\", 2 * Math.PI],\r\n                [\"(2+3)(4+5)\", 45],\r\n                [\"-5+10\", 5],\r\n                [\"2^-3\", 0.125],\r\n                [\"sqrt(0)\", 0]\r\n            ];\r\n\r\n            const failures = [];\r\n\r\n            try {\r\n                state.angleMode = \"DEG\";\r\n                tests.push([\"sin(30)\", 0.5], [\"cos(60)\", 0.5], [\"tan(45)\", 1]);\r\n\r\n                for (const [expression, expected] of tests) {\r\n                    const actual = evaluateExpression(expression);\r\n                    if (Math.abs(actual - expected) > 1e-10 * Math.max(1, Math.abs(expected))) {\r\n                        failures.push({ expression, expected, actual });\r\n                    }\r\n                }\r\n\r\n                state.angleMode = \"RAD\";\r\n                const radActual = evaluateExpression(\"sin(pi\/2)\");\r\n                if (Math.abs(radActual - 1) > 1e-10) failures.push({ expression: \"sin(pi\/2)\", expected: 1, actual: radActual });\r\n\r\n                const errorTests = [\"1\/0\", \"sqrt(-1)\", \"log(0)\", \"log(-5)\", \"(-5)!\"];\r\n                for (const expression of errorTests) {\r\n                    let threw = false;\r\n                    try {\r\n                        evaluateExpression(expression);\r\n                    } catch {\r\n                        threw = true;\r\n                    }\r\n                    if (!threw) failures.push({ expression, expected: \"error\", actual: \"no error\" });\r\n                }\r\n            } finally {\r\n                state.angleMode = originalMode;\r\n            }\r\n\r\n            if (failures.length) {\r\n                console.warn(\"NOVA calculator self-test failures:\", failures);\r\n            }\r\n        }\r\n\r\n        \/* =========================================================\r\n           23. INITIALIZATION\r\n        ========================================================== *\/\r\n        function initialize() {\r\n            loadSettings();\r\n            loadHistory();\r\n            renderHistory();\r\n            populateConverterCategories();\r\n            bindEvents();\r\n            updateMemoryIndicator();\r\n            setSecondMode(false);\r\n            setApplicationMode(\"scientific\");\r\n            dom.resultOutput.textContent = formatResult(0);\r\n            runSelfTests();\r\n            dom.expressionInput.focus();\r\n        }\r\n\r\n        initialize();\r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>NOVA Scientific Calculator Precision workspace NOVA Scientific Scientific Converter \u2315 \u25d0 \u2699 DEG M 2nd NORMAL a\/b Copy Expression 0 DEG RAD GRAD MC MR M+ M\u2212 MS 2nd ( ) ( ) \u03c0 e sin cos tan sinh cosh tanh x\u00b2 x\u00b3 x\u02b8 \u221ax \u221bx \u02b8\u221ax 10\u02e3 e\u02e3 2\u02e3 log ln log\u2082 |x| x! [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-67","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=\/wp\/v2\/pages\/67","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=67"}],"version-history":[{"count":4,"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=\/wp\/v2\/pages\/67\/revisions"}],"predecessor-version":[{"id":71,"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=\/wp\/v2\/pages\/67\/revisions\/71"}],"wp:attachment":[{"href":"https:\/\/anthoniabirthguide.online\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}