{"id":1,"date":"2024-11-06T01:39:42","date_gmt":"2024-11-06T01:39:42","guid":{"rendered":"https:\/\/onegood.life\/home\/snavazio14\/public_html\/?p=1"},"modified":"2025-12-13T01:43:16","modified_gmt":"2025-12-13T01:43:16","slug":"hello-world","status":"publish","type":"post","link":"https:\/\/onegood.life\/?p=1","title":{"rendered":"Hello world!"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Welcome to WordPress. This is your first post. Edit or delete it, then start writing!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">    <div class=\"psg-container\">\n        <style>\n            .psg-container { font-family: sans-serif; max-width: 1000px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; background: #f9f9f9; }\n            .psg-row { display: flex; gap: 20px; flex-wrap: wrap; }\n            .psg-col { flex: 1; min-width: 200px; margin-bottom: 15px; }\n            .psg-col label { display: block; font-weight: bold; margin-bottom: 5px; }\n            .psg-col input, .psg-col select { width: 100%; padding: 8px; }\n            .psg-unit-toggle { background: #e5e5e5; padding: 10px; margin-bottom: 15px; text-align: right; border-radius: 4px; }\n            \/* Preview container allows scrolling *\/\n            #psg-svg-preview { margin-top: 20px; border: 1px dashed #ccc; background: white; padding: 0; overflow: auto; text-align: left; height: 600px; position: relative; }\n            .psg-btn { background: #0073aa; color: white; padding: 10px 20px; border: none; cursor: pointer; font-size: 16px; }\n            .psg-btn:hover { background: #005177; }\n            .error-msg { color: red; font-weight: bold; display: none; margin-top: 10px; }\n            .psg-version { margin-top: 15px; font-size: 0.8em; color: #888; text-align: left; }\n        <\/style>\n\n        <h2>Plant Sleeve SVG Generator<\/h2>\n        \n        <form id=\"psg-form\">\n            <div class=\"psg-unit-toggle\">\n                <label style=\"margin-right:10px; font-weight:bold;\">Units:<\/label>\n                <select id=\"units\" style=\"width:auto;\" onchange=\"updateDefaults()\">\n                    <option value=\"mm\" selected>Millimeters (mm)<\/option>\n                    <option value=\"inches\">Inches (in)<\/option>\n                <\/select>\n            <\/div>\n\n            <div class=\"psg-row\">\n                <div class=\"psg-col\"><label>Sleeve Height<\/label><input type=\"number\" id=\"height\" value=\"130\" step=\"0.1\"><\/div>\n                <div class=\"psg-col\"><label>Top Inside Diameter<\/label><input type=\"number\" id=\"d_top\" value=\"160\" step=\"0.1\"><\/div>\n                <div class=\"psg-col\"><label>Bottom Inside Diameter<\/label><input type=\"number\" id=\"d_bottom\" value=\"125\" step=\"0.1\"><\/div>\n            <\/div>\n\n            <div class=\"psg-row\">\n                <div class=\"psg-col\"><label>Material Thickness<\/label><input type=\"number\" id=\"thickness\" value=\"3\" step=\"0.01\"><\/div>\n                <div class=\"psg-col\"><label>Number of Sides<\/label><input type=\"number\" id=\"sides\" value=\"12\" min=\"3\"><\/div>\n            <\/div>\n\n            <div class=\"psg-row\">\n                <div class=\"psg-col\"><label>Sheet Width<\/label><input type=\"number\" id=\"sheet_w\" value=\"600\" step=\"0.1\"><\/div>\n                <div class=\"psg-col\"><label>Sheet Height<\/label><input type=\"number\" id=\"sheet_h\" value=\"400\" step=\"0.1\"><\/div>\n            <\/div>\n\n            <div class=\"psg-row\">\n                <div class=\"psg-col\"><label>Kerf (always mm)<\/label><input type=\"number\" id=\"kerf\" value=\"0.15\" step=\"0.01\"><small>e.g. 0.15<\/small><\/div>\n                <div class=\"psg-col\"><label>Ring Width<\/label><input type=\"number\" id=\"ring_width\" value=\"15\" step=\"0.1\"><\/div>\n            <\/div>\n\n            <div class=\"psg-row\">\n                <div class=\"psg-col\"><label>Fingers per 2.5cm<\/label><input type=\"number\" id=\"finger_density\" value=\"1.5\" step=\"0.1\"><\/div>\n                <div class=\"psg-col\"><label>Base\/Feet Gap<\/label><input type=\"number\" id=\"feet_gap\" value=\"10\" step=\"0.1\"><small>Distance between slots<\/small><\/div>\n            <\/div>\n\n            <div class=\"psg-row\">\n                <div class=\"psg-col\"><label>Panel Hole Depth<\/label><input type=\"number\" id=\"panel_hole_depth\" value=\"3\" step=\"0.1\"><small>From outer edge<\/small><\/div>\n                <div class=\"psg-col\"><label>Number of Feet<\/label><input type=\"number\" id=\"feet_count\" value=\"4\" min=\"3\"><\/div>\n            <\/div>\n\n            <div class=\"psg-row\">\n                <div class=\"psg-col\">\n                    <label>Foot Shape<\/label>\n                    <select id=\"foot_shape\">\n                        <option value=\"circle\">Circle<\/option>\n                        <option value=\"square\">Square<\/option>\n                        <option value=\"arched\">Arched<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            \n            <div class=\"psg-row\">\n                <div class=\"psg-col\" style=\"display:flex; align-items:center;\">\n                    <input type=\"checkbox\" id=\"show_labels\" checked style=\"width:auto; margin-right:10px;\">\n                    <label for=\"show_labels\" style=\"margin:0;\">Show Labels<\/label>\n                <\/div>\n            <\/div>\n\n            <button type=\"button\" class=\"psg-btn\" onclick=\"generateSleeve()\">Generate Nested SVG<\/button>\n            <div id=\"psg-error\" class=\"error-msg\"><\/div>\n        <\/form>\n\n        <div id=\"psg-svg-preview\"><\/div>\n        <button id=\"psg-download-btn\" class=\"psg-btn\" style=\"display:none; margin-top:10px; background:#28a745;\">Download SVG<\/button>\n        <div class=\"psg-version\">Version: 3.13<\/div>\n    <\/div>\n\n    <script>\n    function updateDefaults() {\n        const units = document.getElementById('units').value;\n        if (units === 'inches') {\n            document.getElementById('height').value = 5.0;\n            document.getElementById('d_top').value = 6.0;\n            document.getElementById('d_bottom').value = 5.0;\n            document.getElementById('thickness').value = 0.125;\n            document.getElementById('sheet_w').value = 24.0;\n            document.getElementById('sheet_h').value = 12.0;\n            document.getElementById('ring_width').value = 0.6;\n            document.getElementById('finger_density').value = 1.5;\n            document.getElementById('feet_gap').value = 0.4;\n            document.getElementById('panel_hole_depth').value = 0.12;\n        } else {\n            document.getElementById('height').value = 130;\n            document.getElementById('d_top').value = 160;\n            document.getElementById('d_bottom').value = 125;\n            document.getElementById('thickness').value = 3.0;\n            document.getElementById('sheet_w').value = 600;\n            document.getElementById('sheet_h').value = 400;\n            document.getElementById('ring_width').value = 15;\n            document.getElementById('finger_density').value = 1.5;\n            document.getElementById('feet_gap').value = 10;\n            document.getElementById('panel_hole_depth').value = 3;\n        }\n    }\n\n    function generateSleeve() {\n        try {\n            const units = document.getElementById('units').value;\n            const toMM = (val) => (units === 'inches') ? val * 25.4 : val;\n\n            const H = toMM(parseFloat(document.getElementById('height').value));\n            const DTop = toMM(parseFloat(document.getElementById('d_top').value));\n            const DBot = toMM(parseFloat(document.getElementById('d_bottom').value));\n            const T = toMM(parseFloat(document.getElementById('thickness').value));\n            const N = parseInt(document.getElementById('sides').value);\n            const SheetW = toMM(parseFloat(document.getElementById('sheet_w').value));\n            const SheetH = toMM(parseFloat(document.getElementById('sheet_h').value));\n            const RingWidth = toMM(parseFloat(document.getElementById('ring_width').value));\n            const FingerDensity = parseFloat(document.getElementById('finger_density').value);\n            const FeetGap = toMM(parseFloat(document.getElementById('feet_gap').value));\n            const PanelHoleDepth = toMM(parseFloat(document.getElementById('panel_hole_depth').value));\n            const Kerf = parseFloat(document.getElementById('kerf').value); \n            const FeetCount = parseInt(document.getElementById('feet_count').value);\n            const FootShape = document.getElementById('foot_shape').value;\n            const ShowLabels = document.getElementById('show_labels').checked;\n            \n            const errorDiv = document.getElementById('psg-error');\n            errorDiv.style.display = 'none';\n\n            if (isNaN(H) || isNaN(DTop) || isNaN(DBot) || isNaN(T) || isNaN(N) || isNaN(SheetW) || isNaN(SheetH)) {\n                throw new Error(\"Please fill in all numeric fields.\");\n            }\n\n            const halfAngleRad = (180 \/ N) * (Math.PI \/ 180);\n            const panelW_Top = 2 * (DTop \/ 2) * Math.tan(halfAngleRad);\n            const panelW_Bot = 2 * (DBot \/ 2) * Math.tan(halfAngleRad);\n            \/\/ Fix: Add explicit spacing for tabs (T) and margin (15mm)\n            const maxPanelWidth = Math.max(panelW_Top, panelW_Bot) + (2 * T); \n            const panelSpacing = maxPanelWidth + 15; \/\/ Generous spacing\n\n            \/\/ Nesting Variables\n            let currentX = 5;\n            let currentY = 5;\n            let rowMaxH = 0;\n            let svgElements = [];\n\n            \/\/ --- 1. GENERATE ALL PANELS ---\n            let segments = (H > SheetH) ? 2 : 1;\n            const panelHeight = H \/ segments;\n\n            for (let s = 0; s < segments; s++) {\n                const hBottom = (s * panelHeight);\n                const w_seg_top = panelW_Top + (panelW_Bot - panelW_Top) * (hBottom \/ H);\n                const w_seg_bot = panelW_Top + (panelW_Bot - panelW_Top) * ((hBottom + panelHeight) \/ H);\n\n                let topEdgeType = (s === 0) ? 'top_tabs' : 'slots'; \n                let botEdgeType = (s === segments - 1) ? 'tab' : 'fingers_female'; \n                \n                if(segments > 1) {\n                    if (s === 0) botEdgeType = 'split_female'; \n                    if (s === 1) topEdgeType = 'split_male';\n                }\n\n                for(let i=0; i<N; i++) {\n                    const pathData = generateTrapezoidPath(w_seg_bot, w_seg_top, panelHeight, H, T, Kerf, topEdgeType, botEdgeType, FingerDensity);\n                    \n                    if (currentX + panelSpacing > SheetW) {\n                        currentX = 5;\n                        currentY += rowMaxH + 15;\n                        rowMaxH = 0;\n                    }\n                    \n                    svgElements.push({\n                        x: currentX + maxPanelWidth\/2, \n                        y: currentY, \n                        path: pathData, \n                        label: ShowLabels && i===0 ? `Panel Seg ${s+1} (x${N})` : ''\n                    });\n\n                    currentX += panelSpacing;\n                    rowMaxH = Math.max(rowMaxH, panelHeight);\n                }\n                currentX = 5;\n                currentY += rowMaxH + 20;\n                rowMaxH = 0;\n            }\n\n            \/\/ --- 2. RINGS ---\n            const topRingOuterApothem = (DTop\/2) + 5; \n            const topRingInnerApothem = topRingOuterApothem - RingWidth;\n            const topRingOuterR = topRingOuterApothem \/ Math.cos(Math.PI\/N);\n            const topRingInnerR = topRingInnerApothem \/ Math.cos(Math.PI\/N);\n\n            const baseRingOuterApothem = (DBot\/2) + PanelHoleDepth;\n            const baseRingInnerApothem = baseRingOuterApothem - RingWidth;\n            const baseRingOuterR = baseRingOuterApothem \/ Math.cos(Math.PI\/N);\n            const baseRingInnerR = baseRingInnerApothem \/ Math.cos(Math.PI\/N);\n            const feetSlotApothem = (DBot\/2) - FeetGap;\n\n            if (currentX + topRingOuterR*2 > SheetW) { currentX = 5; currentY += rowMaxH + 15; rowMaxH = 0; }\n            let ringCX = currentX + topRingOuterR;\n            let ringCY = currentY + topRingOuterR;\n            \n            const topRingPath = generateRing(N, topRingOuterR, topRingInnerR, DTop\/2, T, Kerf, 'top_ring', panelW_Top, 0, 0);\n            svgElements.push({ x: ringCX, y: ringCY, path: topRingPath, label: ShowLabels ? 'Top Ring' : '' });\n            \n            let feetNested = false;\n            const footSize = 30; \n            if ( (topRingInnerApothem * 2) > (footSize * 2) ) {\n                feetNested = true;\n                const footPath = generateFoot(FootShape, T);\n                const cols = Math.floor((topRingInnerApothem * 2) \/ (footSize + 2));\n                const startX = ringCX - (cols * footSize)\/2 + footSize\/2;\n                const startY = ringCY - (Math.ceil(FeetCount\/cols) * footSize)\/2 + footSize\/2;\n                \n                for(let f=0; f < FeetCount; f++) {\n                    const col = f % cols;\n                    const row = Math.floor(f \/ cols);\n                    const fx = startX + col * (footSize + 2);\n                    const fy = startY + row * (footSize + 2);\n                    svgElements.push({ x: fx, y: fy, path: footPath, label: (f===0 && ShowLabels) ? 'Feet (Nested)' : '' });\n                }\n            }\n\n            currentX += topRingOuterR*2 + 15;\n            rowMaxH = Math.max(rowMaxH, topRingOuterR*2);\n\n            if (currentX + baseRingOuterR*2 > SheetW) { currentX = 5; currentY += rowMaxH + 15; rowMaxH = 0; }\n            ringCX = currentX + baseRingOuterR;\n            ringCY = currentY + baseRingOuterR;\n            \n            const basePath = generateRing(N, baseRingOuterR, baseRingInnerR, DBot\/2, T, Kerf, 'base_ring', panelW_Bot, FeetCount, feetSlotApothem);\n            svgElements.push({ x: ringCX, y: ringCY, path: basePath, label: ShowLabels ? 'Base Ring' : '' });\n            \n            currentX += baseRingOuterR*2 + 15;\n            rowMaxH = Math.max(rowMaxH, baseRingOuterR*2);\n\n            if (!feetNested) {\n                const footPath = generateFoot(FootShape, T);\n                for(let f=0; f<FeetCount; f++) {\n                    if (currentX + 35 > SheetW) { currentX = 5; currentY += rowMaxH + 15; rowMaxH = 0; }\n                    svgElements.push({ x: currentX + 15, y: currentY + 15, path: footPath, label: f===0 && ShowLabels ? 'Feet' : '' });\n                    currentX += 40;\n                    rowMaxH = Math.max(rowMaxH, 30);\n                }\n            }\n\n            \/\/ FIX: Dynamic height ensures scrolling\n            const finalSVGHeight = Math.max(SheetH, currentY + rowMaxH + 50);\n\n            let svgContent = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"${SheetW}mm\" height=\"${finalSVGHeight}mm\" viewBox=\"0 0 ${SheetW} ${finalSVGHeight}\">`;\n            svgContent += `<style>path { fill: none; stroke: black; stroke-width: 0.1mm; } text { font-family: sans-serif; font-size: 5px; fill: red; }<\/style>`;\n            \n            svgElements.forEach(el => {\n                svgContent += `<path d=\"${el.path}\" transform=\"translate(${el.x}, ${el.y})\" \/>`;\n                if (el.label) svgContent += `<text x=\"${el.x}\" y=\"${el.y}\">${el.label}<\/text>`;\n            });\n            svgContent += `<\/svg>`;\n\n            document.getElementById('psg-svg-preview').innerHTML = svgContent;\n            const btn = document.getElementById('psg-download-btn');\n            btn.style.display = 'inline-block';\n            btn.onclick = function() {\n                const blob = new Blob([svgContent], {type: \"image\/svg+xml\"});\n                const url = URL.createObjectURL(blob);\n                const a = document.createElement(\"a\");\n                a.href = url;\n                a.download = \"plant_sleeve_nested.svg\";\n                document.body.appendChild(a);\n                a.click();\n                document.body.removeChild(a);\n            };\n\n        } catch (e) {\n            document.getElementById('psg-error').innerText = e.message;\n            document.getElementById('psg-error').style.display = 'block';\n        }\n    }\n\n    \/\/ --- HELPER FUNCTIONS ---\n\n    function generateTrapezoidPath(wBot, wTop, h, H_full, t, kerf, topType, botType, fingerDensity) {\n        let path = \"\";\n        \n        const unitsOf25 = h \/ 25.0; \n        let numTabs = Math.round(unitsOf25 * fingerDensity);\n        if (numTabs < 2) numTabs = 2; \n        const vSpace = h \/ numTabs;\n        \n        const dx = (wBot - wTop) \/ 2;\n        const dy = h;\n        const len = Math.sqrt(dx*dx + dy*dy);\n        const rx = dy \/ len;\n        const ry = -dx \/ len;\n        \n        path += `M ${-wTop\/2} 0 `; \n\n        \/\/ TOP EDGE\n        if (topType === 'top_tabs') {\n            const seg = wTop \/ 5;\n            path += `L ${-wTop\/2 + seg} 0 L ${-wTop\/2 + seg} ${-t} L ${-wTop\/2 + 2*seg} ${-t} L ${-wTop\/2 + 2*seg} 0 `;\n            path += `L ${-wTop\/2 + 3*seg} 0 L ${-wTop\/2 + 3*seg} ${-t} L ${-wTop\/2 + 4*seg} ${-t} L ${-wTop\/2 + 4*seg} 0 `;\n            path += `L ${wTop\/2} 0 `;\n        } else if (topType === 'split_male') {\n            \/\/ Male Fingers pointing UP (-y)\n            path += generateStraightFingers(-wTop\/2, 0, wTop\/2, 0, t, kerf, true, -1);\n        } else if (topType === 'fingers_male') {\n            path += generateStraightFingers(-wTop\/2, 0, wTop\/2, 0, t, kerf, true, -1);\n        } else {\n            path += `L ${wTop\/2} 0 `;\n        }\n        \n        \/\/ RIGHT EDGE\n        let rightPath = \"\";\n        for (let i = 0; i < numTabs; i++) {\n            const pct1 = i \/ numTabs;\n            const pct2 = (i + 1) \/ numTabs;\n            const x1 = wTop\/2 + dx * pct1; const y1 = dy * pct1;\n            const x2 = wTop\/2 + dx * pct2; const y2 = dy * pct2;\n            \n            if (i % 2 === 0) {\n                rightPath += `L ${x2} ${y2} `;\n            } else {\n                const tx = rx * t; const ty = ry * t;\n                rightPath += `L ${x1 + tx} ${y1 + ty} `; \n                rightPath += `L ${x2 + tx} ${y2 + ty} `; \n                rightPath += `L ${x2} ${y2} `;       \n            }\n        }\n        path += rightPath;\n        path += `L ${wBot\/2} ${h} `;\n\n        \/\/ BOTTOM EDGE\n        if (botType === 'tab') {\n            path += `L ${14\/2} ${h} L ${14\/2} ${h+t} L ${-14\/2} ${h+t} L ${-14\/2} ${h} `;\n            path += `L ${-wBot\/2} ${h} `;\n        } else if (botType === 'split_female') {\n            \/\/ Female Slots pointing UP (-y)\n            path += generateStraightFingers(wBot\/2, h, -wBot\/2, h, t, kerf, false, -1);\n        } else if (botType === 'fingers_female') {\n            path += generateStraightFingers(wBot\/2, h, -wBot\/2, h, t, kerf, false, 1);\n        } else {\n            path += `L ${-wBot\/2} ${h} `;\n        }\n\n        \/\/ LEFT EDGE\n        \/\/ FIX: Removed redundant move command.\n        \n        let leftPath = \"\";\n        for (let i = numTabs - 1; i >= 0; i--) {\n            const pct1 = i \/ numTabs;       \n            const pct2 = (i + 1) \/ numTabs; \n            const y1 = dy * pct1; const y2 = dy * pct2;\n            const lx1 = -(wTop\/2 + dx * pct1);\n            const lx2 = -(wTop\/2 + dx * pct2);\n            \n            if (i % 2 === 0) {\n                leftPath += `L ${lx1} ${y1} `;\n            } else {\n                const tx = rx * t; const ty = -ry * t; \n                leftPath += `L ${lx2 + tx} ${y2 + ty} `; \n                leftPath += `L ${lx1 + tx} ${y1 + ty} `; \n                leftPath += `L ${lx1} ${y1} `;       \n            }\n        }\n        path += leftPath;\n        path += \"Z\";\n        return path;\n    }\n\n    function generateStraightFingers(x1, y1, x2, y2, t, kerf, isMale, yDir) {\n        const dist = Math.sqrt(Math.pow(x2-x1, 2));\n        let numFingers = Math.floor(dist \/ (2*t));\n        if (numFingers % 2 === 0) numFingers--;\n        if (numFingers < 3) numFingers = 3;\n\n        const step = dist \/ numFingers;\n        let p = \"\";\n        let currX = x1;\n        const dir = (x2 > x1) ? 1 : -1;\n        const yOffset = t * yDir; \n\n        for(let i=0; i<numFingers; i++) {\n            let isOffset = (i%2 === 0);\n            \n            \/\/ Logic: Tabs (Male) need bumps. Slots (Female) need dips\/holes.\n            \/\/ yOffset = t * -1 (Up).\n            \/\/ Male (Bumps): Line goes UP.\n            \/\/ Female (Slots): Line goes UP (into material).\n            \/\/ SO: Both should draw the offset on isOffset (Even) indices.\n            \n            if(isOffset) {\n                p += `L ${currX} ${y1 + yOffset} L ${currX + (step*dir)} ${y1 + yOffset} L ${currX + (step*dir)} ${y1} `;\n            } else {\n                p += `L ${currX + (step*dir)} ${y1} `;\n            }\n            currX += (step*dir);\n        }\n        p += `L ${x2} ${y2} `;\n        return p;\n    }\n\n    \/\/ ... [Rest of functions unchanged] ...\n    function generateRing(N, outerR, innerR, slotApothem, t, kerf, type, panelW, feetCount, feetSlotApothem) {\n        let path = \"\";\n        const angleStep = (2 * Math.PI) \/ N;\n        for (let i = 0; i <= N; i++) {\n            const th = i * angleStep - Math.PI\/2;\n            path += (i===0 ? `M` : `L`) + ` ${outerR * Math.cos(th)} ${outerR * Math.sin(th)} `;\n        }\n        path += \"Z \";\n        for (let i = N; i >= 0; i--) {\n            const th = i * angleStep - Math.PI\/2;\n            path += (i===N ? `M` : `L`) + ` ${innerR * Math.cos(th)} ${innerR * Math.sin(th)} `;\n        }\n        path += \"Z \";\n        if(type === 'top_ring') {\n            const slotW = (panelW\/5) + kerf;\n            const slotH = t + kerf;\n            const offsetDist = panelW\/5 * 1.5; \n            for (let i = 0; i < N; i++) {\n                const cAng = i * angleStep - Math.PI\/2 + angleStep\/2;\n                let px = slotApothem * Math.cos(cAng) - (-offsetDist)*Math.sin(cAng);\n                let py = slotApothem * Math.sin(cAng) + (-offsetDist)*Math.cos(cAng);\n                path += drawRect(px, py, slotW, slotH, cAng + Math.PI\/2);\n                px = slotApothem * Math.cos(cAng) - (offsetDist)*Math.sin(cAng);\n                py = slotApothem * Math.sin(cAng) + (offsetDist)*Math.cos(cAng);\n                path += drawRect(px, py, slotW, slotH, cAng + Math.PI\/2);\n            }\n        } else {\n            const slotW = 14 + kerf; \n            const slotH = t + kerf;\n            for (let i = 0; i < N; i++) {\n                const cAng = i * angleStep - Math.PI\/2 + angleStep\/2;\n                const px = slotApothem * Math.cos(cAng);\n                const py = slotApothem * Math.sin(cAng);\n                path += drawRect(px, py, slotW, slotH, cAng + Math.PI\/2);\n            }\n            const fW = 15 + kerf;\n            const fH = t + kerf;\n            for (let i = 0; i < feetCount; i++) {\n                const fIndex = Math.round((i * N) \/ feetCount);\n                const cAng = fIndex * angleStep - Math.PI\/2 + angleStep\/2;\n                const px = feetSlotApothem * Math.cos(cAng);\n                const py = feetSlotApothem * Math.sin(cAng);\n                path += drawRect(px, py, fW, fH, cAng + Math.PI\/2);\n            }\n        }\n        return path;\n    }\n    function drawRect(cx, cy, w, h, ang) {\n        const c = Math.cos(ang), s = Math.sin(ang);\n        const dx = w\/2, dy = h\/2;\n        const r = (x,y) => [x*c - y*s + cx, x*s + y*c + cy];\n        const p1 = r(-dx, -dy); const p2 = r(dx, -dy);\n        const p3 = r(dx, dy);   const p4 = r(-dx, dy);\n        return `M ${p1[0]} ${p1[1]} L ${p2[0]} ${p2[1]} L ${p3[0]} ${p3[1]} L ${p4[0]} ${p4[1]} Z `;\n    }\n    function generateFoot(shape, t) {\n        const tab = `L 7.5 10 L 7.5 ${10+t} L -7.5 ${10+t} L -7.5 10`;\n        if (shape === 'circle') return `M -7.5 10 A 12.5 12.5 0 1 1 7.5 10 ${tab} Z`;\n        if (shape === 'square') return `M -12.5 -12.5 L 12.5 -12.5 L 12.5 10 ${tab} L -12.5 10 Z`;\n        return `M -15 0 Q 0 -20 15 0 L 15 10 ${tab} L -15 10 Z`;\n    }\n    <\/script>\n    <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">    <style>\n        .dig-wrapper { font-family: sans-serif; max-width: 1000px; margin: 20px auto; padding: 20px; border: 1px solid #ddd; background: #f9f9f9; } \n        .dig-row { display: flex; flex-wrap: wrap; gap: 20px; margin-bottom: 15px; }\n        .dig-group { flex: 1; min-width: 200px; }\n        .dig-group label { display: block; font-weight: bold; margin-bottom: 5px; }\n        .dig-group input, .dig-group select { width: 100%; padding: 8px; box-sizing: border-box; }\n        .dig-section-title { margin-top: 20px; margin-bottom: 10px; font-size: 1.1em; border-bottom: 2px solid #ccc; padding-bottom: 5px; }\n        #dig-canvas-preview { width: 100%; height: 800px; border: 2px dashed #bbb; background: #fff; margin-top: 20px; display: flex; align-items: center; justify-content: center; overflow: hidden; padding: 10px; }\n        .dig-btn { padding: 12px 24px; border: none; cursor: pointer; font-size: 16px; border-radius: 4px; background: #0073aa; color: white; margin-right: 10px; }\n        .dig-btn:hover { background: #005177; }\n        .dig-checkbox-wrapper { background: #e9f5ff; padding: 15px; border-radius: 4px; margin-top: 10px; border: 1px solid #bce0fd; }\n        .dig-checkbox-group { margin-bottom: 10px; }\n        .dig-checkbox-group label { display: flex; align-items: center; font-weight: bold; }\n        .dig-checkbox-group input { margin-right: 10px; transform: scale(1.2); }\n        .dig-version { margin-top: 10px; font-size: 0.8em; color: #888; }\n    <\/style>\n\n    <div class=\"dig-wrapper\">\n        <h2>Laser Cut Drawer Insert Generator (v11.0)<\/h2>\n\n        <div class=\"dig-section-title\">Units & Material<\/div>\n        <div class=\"dig-row\">\n            <div class=\"dig-group\">\n                <label>Unit System<\/label>\n                <select id=\"dig-units\" onchange=\"digUpdateLabels()\">\n                    <option value=\"mm\">Metric (mm)<\/option>\n                    <option value=\"in\">Imperial (inches)<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"dig-group\"><label>Material Thickness<\/label><input type=\"number\" id=\"dig-thickness\" value=\"3\" step=\"0.1\"><\/div>\n            <div class=\"dig-group\"><label>Laser Kerf<\/label><input type=\"number\" id=\"dig-kerf\" value=\"0.15\" step=\"0.001\"><\/div>\n            <div class=\"dig-group\"><label>Safety Gap<\/label><input type=\"number\" id=\"dig-clearance\" value=\"1\" step=\"0.1\"><\/div>\n        <\/div>\n\n        <div class=\"dig-section-title\">Sheet Size & Joints (MANDATORY SPLIT)<\/div>\n        <div class=\"dig-row\">\n            <div class=\"dig-group\"><label>Sheet Width<\/label><input type=\"number\" id=\"dig-sheet-w\" value=\"300\"><\/div>\n            <div class=\"dig-group\"><label>Sheet Height<\/label><input type=\"number\" id=\"dig-sheet-h\" value=\"300\"><\/div>\n            <div class=\"dig-group\"><label>Finger Joint Pitch<\/label><input type=\"number\" id=\"dig-joint-pitch\" value=\"25\"><\/div>\n        <\/div>\n\n        <div class=\"dig-section-title\">Drawer Dimensions (Internal)<\/div>\n        <div class=\"dig-row\">\n            <div class=\"dig-group\"><label>Drawer Width<\/label><input type=\"number\" id=\"dig-width\" value=\"300\"><\/div>\n            <div class=\"dig-group\"><label>Drawer Depth<\/label><input type=\"number\" id=\"dig-depth\" value=\"400\"><\/div>\n            <div class=\"dig-group\"><label>Insert Height<\/label><input type=\"number\" id=\"dig-height\" value=\"50\"><\/div>\n        <\/div>\n\n        <div class=\"dig-section-title\">Configuration<\/div>\n        <div class=\"dig-row\">\n            <div class=\"dig-group\"><label>Rows (Along Depth)<\/label><input type=\"number\" id=\"dig-rows\" value=\"3\" min=\"1\"><\/div>\n            <div class=\"dig-group\"><label>Columns (Along Width)<\/label><input type=\"number\" id=\"dig-cols\" value=\"2\" min=\"1\"><\/div>\n        <\/div>\n        \n        <div class=\"dig-checkbox-wrapper\">\n            <div class=\"dig-checkbox-group\">\n                <label><input type=\"checkbox\" id=\"dig-frame-all\" onchange=\"document.getElementById('dig-frame-ends').checked=false;\"> Include **All 4 Perimeter Walls** (Full Frame)<\/label>\n            <\/div>\n            <div class=\"dig-checkbox-group\">\n                <label><input type=\"checkbox\" id=\"dig-frame-ends\" checked onchange=\"document.getElementById('dig-frame-all').checked=false;\"> Include **Front and Back End Walls Only**<\/label>\n            <\/div>\n            <div class=\"dig-checkbox-group\">\n                <label><input type=\"checkbox\" id=\"dig-show-labels\" checked> Show Part Labels<\/label>\n            <\/div>\n        <\/div>\n\n        <div class=\"dig-actions\">\n            <button class=\"dig-btn\" onclick=\"digPreview()\">Preview Design<\/button>\n            <button class=\"dig-btn\" style=\"background:#28a745;\" onclick=\"digDownload()\">Download SVG<\/button>\n        <\/div>\n        \n        <div id=\"dig-canvas-preview\">Preview...<\/div>\n        <div class=\"dig-version\">Version 11.0 - Geometry Fixed<\/div>\n    <\/div>\n\n    <script>\n        \/\/ --- GEOMETRY ENGINE ---\n\n        \/\/ Draws the perimeter of a piece with specific left\/right edge types\n        function drawPoly(w, h, leftType, rightType, params) {\n            let path = `M 0,0 `; \/\/ Start Top-Left\n            path += `L ${w},0 `; \/\/ Top Edge\n\n            \/\/ RIGHT EDGE\n            path += getEdgePathDown(rightType, w, h, params);\n\n            \/\/ BOTTOM EDGE (Complex if there are tabs)\n            \/\/ If the Right edge was a TAB, we are currently at (w-t, h).\n            \/\/ If the Left edge is a TAB, we need to end at (t, h).\n            \/\/ Straight bottom line connects current point to start of Left Edge.\n            \n            \/\/ NOTE: getEdgePathDown ends at Y=h.\n            \/\/ If NOTCH_TAB, it ends at X=w-t, Y=h.\n            \/\/ If STRAIGHT\/JOINT, it ends at X=w, Y=h.\n            \n            \/\/ We need to draw a line to the start of the Left Edge (Up).\n            \/\/ Left Edge Up starts at Y=h.\n            \/\/ If Left is NOTCH_TAB, it starts at X=t.\n            \/\/ If Left is STRAIGHT\/JOINT, it starts at X=0.\n            \n            let bottomTargetX = (leftType === 'NOTCH_TAB') ? params.thickness : 0;\n            path += `L ${bottomTargetX},${h} `;\n\n            \/\/ LEFT EDGE (Upwards)\n            path += getEdgePathUp(leftType, 0, h, params);\n\n            path += \"Z\";\n            return path;\n        }\n\n        \/\/ Generates path segments for RIGHT edge (Drawing DOWN)\n        function getEdgePathDown(type, xOffset, h, params) {\n            let p = \"\";\n            let t = params.thickness;\n            let sd = params.slotDepth;\n            let pitch = params.pitch;\n            let fSize = pitch\/2;\n            let k = params.kerf;\n\n            if (type === 'STRAIGHT') {\n                p += `L ${xOffset},${h} `;\n            }\n            else if (type === 'NOTCH_TAB') {\n                \/\/ Divider Tab: Straight down, then cut IN at bottom to form tab? \n                \/\/ NO. A \"Tab\" usually means the full height is the tab, but we notch the top\/bottom \n                \/\/ to fit into the frame's slot.\n                \/\/ Frame Slot is `slotDepth` deep from Top.\n                \/\/ So Divider Tab needs to clear that.\n                \/\/ We draw straight down to (h - slotDepth).\n                \/\/ Then IN by `thickness`.\n                \/\/ Then DOWN to `h`.\n                \/\/ This creates a \"shoulder\" that rests on the frame slot bottom?\n                \/\/ Actually, standard is: Full height, but cut `thickness` off the top `slotDepth`?\n                \/\/ Let's assume the Frame Front\/Back are walls.\n                \/\/ Slot in Frame: Top-Down.\n                \/\/ Tab on Divider: Needs to slide into that slot.\n                \/\/ So the Divider needs to be narrower at the top?\n                \/\/ No, \"Egg Crate\": Slots on both pieces.\n                \/\/ But Frame Front\/Back usually acts as a wall.\n                \/\/ Let's implement the standard \"Notched End\":\n                \/\/ Go down to (h-sd). In by t. Down to h.\n                \/\/ This leaves a tab of height `sd` at the bottom? No, that leaves a tab of `sd` at the top... no.\n                \/\/ Let's stick to the visual the user had in v8:\n                \/\/ Down to `h-sd`. In `t`. Down to `h`.\n                p += `L ${xOffset},${h - sd} `;\n                p += `L ${xOffset - t},${h - sd} `;\n                p += `L ${xOffset - t},${h} `;\n            }\n            else if (type === 'MALE_JOINT' || type === 'FEMALE_JOINT') {\n                \/\/ Finger Joint Logic\n                let numP = Math.floor(h \/ pitch);\n                let startY = (h - (numP * pitch)) \/ 2;\n                let isMale = (type === 'MALE_JOINT');\n                \/\/ Male sticks OUT (+x), Female cuts IN (-x)\n                let amp = isMale ? (fSize + k) : -(fSize - k);\n\n                p += `L ${xOffset},${startY} `; \/\/ Move to start\n                let y = startY;\n                for(let i=0; i<numP; i++) {\n                    p += `L ${xOffset + amp},${y} `;\n                    p += `L ${xOffset + amp},${y + fSize} `;\n                    p += `L ${xOffset},${y + fSize} `;\n                    p += `L ${xOffset},${y + pitch} `;\n                    y += pitch;\n                }\n                p += `L ${xOffset},${h} `;\n            }\n            return p;\n        }\n\n        \/\/ Generates path segments for LEFT edge (Drawing UP)\n        function getEdgePathUp(type, xOffset, h, params) {\n            let p = \"\";\n            let t = params.thickness;\n            let sd = params.slotDepth;\n            let pitch = params.pitch;\n            let fSize = pitch\/2;\n            let k = params.kerf;\n\n            if (type === 'STRAIGHT') {\n                p += `L ${xOffset},0 `;\n            }\n            else if (type === 'NOTCH_TAB') {\n                \/\/ Drawing Upwards from (t, h).\n                \/\/ Go UP to (h-sd).\n                \/\/ Go OUT (Left) to 0.\n                \/\/ Go UP to 0.\n                p += `L ${xOffset + t},${h - sd} `;\n                p += `L ${xOffset},${h - sd} `;\n                p += `L ${xOffset},0 `;\n            }\n            else if (type === 'MALE_JOINT' || type === 'FEMALE_JOINT') {\n                let numP = Math.floor(h \/ pitch);\n                let startY = (h - (numP * pitch)) \/ 2;\n                let isMale = (type === 'MALE_JOINT');\n                \/\/ Male sticks OUT (Left is -x), Female cuts IN (Right is +x)\n                let amp = isMale ? -(fSize + k) : (fSize - k);\n\n                p += `L ${xOffset},${h - startY} `;\n                let y = h - startY;\n                for(let i=0; i<numP; i++) {\n                    y -= fSize; \/\/ Gap\n                    p += `L ${xOffset},${y} `;\n                    p += `L ${xOffset + amp},${y} `;\n                    y -= fSize; \/\/ Tooth\n                    p += `L ${xOffset + amp},${y} `;\n                    p += `L ${xOffset},${y} `;\n                }\n                p += `L ${xOffset},0 `;\n            }\n            return p;\n        }\n\n        \/\/ --- MAIN PREVIEW ---\n\n        let latestSVGContent = \"\";\n\n        function digUpdateLabels() {\n            const u = document.getElementById('dig-units').value;\n            const isIn = (u === 'in');\n            if(isIn && document.getElementById('dig-width').value > 100) {\n               document.getElementById('dig-thickness').value = 0.118; document.getElementById('dig-kerf').value = 0.006;\n               document.getElementById('dig-width').value = 25; document.getElementById('dig-depth').value = 19.75;\n               document.getElementById('dig-height').value = 3; document.getElementById('dig-sheet-w').value = 12;\n               document.getElementById('dig-sheet-h').value = 12; document.getElementById('dig-joint-pitch').value = 1;\n            } else if (!isIn && document.getElementById('dig-width').value < 100) {\n               document.getElementById('dig-thickness').value = 3; document.getElementById('dig-width').value = 635;\n               document.getElementById('dig-depth').value = 500; document.getElementById('dig-height').value = 80;\n               document.getElementById('dig-sheet-w').value = 300; document.getElementById('dig-sheet-h').value = 300;\n               document.getElementById('dig-joint-pitch').value = 25;\n            }\n        }\n\n        function digPreview() {\n            const u = document.getElementById('dig-units').value;\n            const scale = (u === 'in') ? 25.4 : 1;\n            \n            let th = parseFloat(document.getElementById('dig-thickness').value) * scale;\n            let kerf = parseFloat(document.getElementById('dig-kerf').value) * scale;\n            let cl = parseFloat(document.getElementById('dig-clearance').value) * scale;\n            let boxW = (parseFloat(document.getElementById('dig-width').value) * scale) - (cl*2);\n            let boxD = (parseFloat(document.getElementById('dig-depth').value) * scale) - (cl*2);\n            let boxH = parseFloat(document.getElementById('dig-height').value) * scale;\n            \n            let sheetW = parseFloat(document.getElementById('dig-sheet-w').value) * scale;\n            let sheetH = parseFloat(document.getElementById('dig-sheet-h').value) * scale;\n            let pitch = parseFloat(document.getElementById('dig-joint-pitch').value) * scale;\n            \n            let rows = parseInt(document.getElementById('dig-rows').value);\n            let cols = parseInt(document.getElementById('dig-cols').value);\n            \n            let fAll = document.getElementById('dig-frame-all').checked;\n            let fEnds = document.getElementById('dig-frame-ends').checked;\n            let showL = document.getElementById('dig-show-labels').checked;\n\n            let hasSide = fAll;\n            let hasFB = fAll || fEnds;\n\n            let params = { thickness: th, kerf: kerf, slotDepth: boxH\/2, pitch: pitch };\n            let maxLen = Math.max(sheetW, sheetH);\n\n            let allPieces = [];\n\n            \/\/ 1. Frame FB (Holds Cols)\n            if (hasFB) {\n                let slots = [];\n                let step = hasSide ? (boxW - 2*th)\/cols : boxW\/cols;\n                let startX = hasSide ? th : 0;\n                for(let c=1; c<cols; c++) {\n                    slots.push({x: startX + (step*c), type: 'DOWN'});\n                }\n                allPieces.push({name: \"Frame Front\", len: boxW, h: boxH, slots: slots, l: 'STRAIGHT', r: 'STRAIGHT'});\n                allPieces.push({name: \"Frame Back\", len: boxW, h: boxH, slots: slots, l: 'STRAIGHT', r: 'STRAIGHT'});\n            }\n\n            \/\/ 2. Frame Side (Holds Rows)\n            if (hasSide) {\n                let len = boxD - (2*th);\n                let slots = [];\n                let step = len\/rows;\n                for(let r=1; r<rows; r++) {\n                    slots.push({x: (step*r), type: 'DOWN'});\n                }\n                allPieces.push({name: \"Frame Left\", len: len, h: boxH, slots: slots, l: 'STRAIGHT', r: 'STRAIGHT'});\n                allPieces.push({name: \"Frame Right\", len: len, h: boxH, slots: slots, l: 'STRAIGHT', r: 'STRAIGHT'});\n            }\n\n            \/\/ 3. Row Dividers\n            let rowLen = hasSide ? boxW - (2*th) : boxW;\n            let rowSlots = [];\n            let rStep = rowLen\/cols;\n            for(let c=1; c<cols; c++) {\n                rowSlots.push({x: (rStep*c), type: 'DOWN'});\n            }\n            let rEnd = hasSide ? 'NOTCH_TAB' : 'STRAIGHT'; \/\/ Dividers have tabs if they meet side walls\n            for(let i=1; i<rows; i++) {\n                allPieces.push({name: \"Row Div \"+i, len: rowLen, h: boxH, slots: rowSlots, l: rEnd, r: rEnd});\n            }\n\n            \/\/ 4. Col Dividers\n            let colLen = hasFB ? boxD - (2*th) : boxD;\n            let colSlots = [];\n            if(rows > 1) {\n                let cStep = colLen\/rows;\n                for(let r=1; r<rows; r++) {\n                    colSlots.push({x: (cStep*r), type: 'UP'});\n                }\n            }\n            let cEnd = hasFB ? 'NOTCH_TAB' : 'STRAIGHT'; \/\/ Dividers have tabs if they meet FB walls\n            for(let i=1; i<cols; i++) {\n                allPieces.push({name: \"Col Div \"+i, len: colLen, h: boxH, slots: colSlots, l: cEnd, r: cEnd});\n            }\n\n            \/\/ --- SPLITTING & RENDERING ---\n            let finalSVG = \"\";\n            let curY = 0;\n            let gap = 15;\n            let totalW = 0;\n\n            allPieces.forEach(p => {\n                if (p.len > maxLen) {\n                    \/\/ SPLIT\n                    let numSplits = Math.ceil(p.len \/ maxLen);\n                    let segLen = p.len \/ numSplits;\n\n                    for(let i=0; i<numSplits; i++) {\n                        let isFirst = (i===0);\n                        let isLast = (i===numSplits-1);\n                        \n                        \/\/ Edge Logic:\n                        \/\/ First segment: Left = Original Left, Right = Male Joint\n                        \/\/ Middle segment: Left = Female Joint, Right = Male Joint\n                        \/\/ Last segment: Left = Female Joint, Right = Original Right\n                        \n                        let lType = isFirst ? p.l : 'FEMALE_JOINT';\n                        let rType = isLast ? p.r : 'MALE_JOINT';\n\n                        \/\/ Calculate Local Slots\n                        let segStart = i * segLen;\n                        let segEnd = (i+1) * segLen;\n                        let localSlots = \"\";\n                        \n                        p.slots.forEach(s => {\n                            if (s.x >= segStart && s.x <= segEnd) {\n                                let localX = s.x - segStart;\n                                if (s.type === 'DOWN') {\n                                    localSlots += `M ${localX},0 L ${localX},${params.slotDepth} L ${localX+th},${params.slotDepth} L ${localX+th},0 Z `;\n                                } else {\n                                    localSlots += `M ${localX},${boxH} L ${localX},${boxH - params.slotDepth} L ${localX+th},${boxH - params.slotDepth} L ${localX+th},${boxH} Z `;\n                                }\n                            }\n                        });\n\n                        let pathD = drawPoly(segLen, p.h, lType, rType, params);\n\n                        finalSVG += `<g transform=\"translate(0, ${curY})\">`;\n                        if(showL) finalSVG += `<text x=\"2\" y=\"-5\" font-size=\"4\" fill=\"black\">${p.name} (Part ${i+1})<\/text>`;\n                        finalSVG += `<path d=\"${pathD}\" fill=\"none\" stroke=\"black\" stroke-width=\"1\" \/>`;\n                        if (localSlots.length > 0) {\n                            \/\/ Ensure slots are drawn in black and visible\n                            finalSVG += `<path d=\"${localSlots}\" fill=\"none\" stroke=\"black\" stroke-width=\"1\" \/>`;\n                        }\n                        finalSVG += `<\/g>`;\n                        curY += p.h + gap;\n                        totalW = Math.max(totalW, segLen);\n                    }\n                } else {\n                    \/\/ NO SPLIT\n                    let localSlots = \"\";\n                    p.slots.forEach(s => {\n                        if (s.type === 'DOWN') {\n                            localSlots += `M ${s.x},0 L ${s.x},${params.slotDepth} L ${s.x+th},${params.slotDepth} L ${s.x+th},0 Z `;\n                        } else {\n                            localSlots += `M ${s.x},${boxH} L ${s.x},${boxH - params.slotDepth} L ${s.x+th},${boxH - params.slotDepth} L ${s.x+th},${boxH} Z `;\n                        }\n                    });\n\n                    let pathD = drawPoly(p.len, p.h, p.l, p.r, params);\n                    \n                    finalSVG += `<g transform=\"translate(0, ${curY})\">`;\n                    if(showL) finalSVG += `<text x=\"2\" y=\"-5\" font-size=\"4\" fill=\"black\">${p.name}<\/text>`;\n                    finalSVG += `<path d=\"${pathD}\" fill=\"none\" stroke=\"black\" stroke-width=\"1\" \/>`;\n                    if (localSlots.length > 0) {\n                        finalSVG += `<path d=\"${localSlots}\" fill=\"none\" stroke=\"black\" stroke-width=\"1\" \/>`;\n                    }\n                    finalSVG += `<\/g>`;\n                    curY += p.h + gap;\n                    totalW = Math.max(totalW, p.len);\n                }\n            });\n\n            let fullSVG = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100%\" height=\"100%\" viewBox=\"-10 -20 ${totalW+20} ${curY+20}\">\n            ${finalSVG}\n            <\/svg>`;\n\n            document.getElementById('dig-canvas-preview').innerHTML = fullSVG;\n            latestSVGContent = fullSVG;\n            document.getElementById('dig-download-btn').disabled = false;\n        }\n\n        function digDownload() {\n            if(!latestSVGContent) { alert(\"Generate preview first.\"); return; }\n            const blob = new Blob([latestSVGContent], {type: 'image\/svg+xml'});\n            const url = URL.createObjectURL(blob);\n            const a = document.createElement('a');\n            a.href = url;\n            a.download = `drawer_insert.svg`;\n            document.body.appendChild(a);\n            a.click();\n            document.body.removeChild(a);\n        }\n    <\/script>\n    <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/onegood.life\/index.php?rest_route=\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/onegood.life\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/onegood.life\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/onegood.life\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/onegood.life\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1"}],"version-history":[{"count":0,"href":"https:\/\/onegood.life\/index.php?rest_route=\/wp\/v2\/posts\/1\/revisions"}],"wp:attachment":[{"href":"https:\/\/onegood.life\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/onegood.life\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/onegood.life\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}