{"id":960,"date":"2023-03-11T14:12:02","date_gmt":"2023-03-11T05:12:02","guid":{"rendered":"https:\/\/sakura-hikari.isana.duckdns.org\/?p=960"},"modified":"2026-02-19T13:54:46","modified_gmt":"2026-02-19T04:54:46","slug":"%ea%b0%84%ed%8e%b8-%ec%9d%b4%eb%8f%99","status":"publish","type":"post","link":"https:\/\/saku-hika.azki.in\/?p=960","title":{"rendered":"\uac04\ud3b8 \uc774\ub3d9"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Investment Dashboard<\/title>\n    <!-- Tailwind CSS (\uc2a4\ud0c0\uc77c\ub9c1\uc6a9) -->\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <!-- Google Fonts: IBM Plex Sans KR -->\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Sans+KR:wght@300;400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <style>\n        \/* \ucee4\uc2a4\ud140 \uc2a4\ud06c\ub864\ubc14 \uc228\uae40 \ucc98\ub9ac *\/\n        .scrollbar-hide::-webkit-scrollbar { display: none; }\n        .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; }\n        \/* \ub85c\ub529 \uc560\ub2c8\uba54\uc774\uc158 *\/\n        @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n        .animate-spin { animation: spin 1s linear infinite; }\n        \/* \ud3f0\ud2b8 \uc124\uc815: IBM Plex Sans KR \uc801\uc6a9 *\/\n        body { font-family: \"IBM Plex Sans KR\", sans-serif; }\n    <\/style>\n<\/head>\n<body class=\"bg-[#121212] text-slate-200 min-h-screen\">\n\n    <div id=\"investment-app\" class=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6\">\n        \n        <!-- 1. Header -->\n        <header class=\"flex items-center justify-between mb-6 pb-4 border-b border-slate-700\">\n            <div class=\"flex items-center space-x-2\">\n                <!-- Layout Icon -->\n                <svg class=\"w-6 h-6 text-indigo-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"\/><path d=\"M3 9h18\"\/><path d=\"M9 21V9\"\/><\/svg>\n                <div id=\"ez-toc-container\" class=\"ez-toc-v2_0_71 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-black ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title ez-toc-toggle\" style=\"cursor:pointer\">[\ubaa9\ucc28]<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/saku-hika.azki.in\/?p=960\/#Investment_Insight\" title=\"Investment Insight\">Investment Insight<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/saku-hika.azki.in\/?p=960\/#Other_Analytics\" title=\"Other Analytics\">Other Analytics<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/saku-hika.azki.in\/?p=960\/#Market_Overview\" title=\"Market Overview\">Market Overview<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/saku-hika.azki.in\/?p=960\/#Economic_Calendar\" title=\"Economic Calendar\">Economic Calendar<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1 class=\"text-xl font-bold text-slate-100\"><span class=\"ez-toc-section\" id=\"Investment_Insight\"><\/span>Investment Insight<span class=\"ez-toc-section-end\"><\/span><\/h1>\n            <\/div>\n            <div class=\"flex items-center space-x-4\">\n                <span id=\"last-updated\" class=\"text-xs text-slate-500 hidden sm:inline\"><\/span>\n                <button onclick=\"app.refreshFeed()\" class=\"p-2 rounded-full hover:bg-slate-700 transition-colors\" title=\"\uc0c8\ub85c\uace0\uce68\">\n                    <!-- Refresh Icon -->\n                    <svg id=\"refresh-icon\" class=\"w-5 h-5 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"\/><path d=\"M21 3v5h-5\"\/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"\/><path d=\"M8 16H3v5\"\/><\/svg>\n                <\/button>\n            <\/div>\n        <\/header>\n\n        <!-- 2. Top Widget: Market Quotes (TradingView) -->\n        <div class=\"bg-[#1e1e1e] rounded-xl overflow-hidden shadow-lg border border-slate-700 mb-8\" style=\"height: 450px;\">\n            <div class=\"tradingview-widget-container\" style=\"height: 100%; width: 100%;\">\n                <div id=\"tv-quotes-container\" class=\"tradingview-widget-container__widget\" style=\"height:calc(100% - 32px); width: 100%\"><\/div>\n            <\/div>\n        <\/div>\n\n        <!-- 3. Quick Links -->\n        <section class=\"mb-8\">\n            <h2 class=\"text-sm font-semibold text-slate-400 uppercase tracking-wider mb-3 px-1\"><span class=\"ez-toc-section\" id=\"Other_Analytics\"><\/span>Other Analytics<span class=\"ez-toc-section-end\"><\/span><\/h2>\n            <div id=\"quick-links\" class=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n                <!-- Links will be injected by JS -->\n            <\/div>\n        <\/section>\n\n        <!-- 4. Filters -->\n        <div class=\"mb-6\">\n            <div class=\"flex items-center mb-2 px-1\">\n                <!-- Filter Icon -->\n                <svg class=\"w-4 h-4 text-slate-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"\/><\/svg>\n                <span class=\"text-sm font-semibold text-slate-500\">Filter Source<\/span>\n            <\/div>\n            <div id=\"filter-container\" class=\"flex space-x-2 overflow-x-auto pb-4 scrollbar-hide\">\n                <!-- Filter buttons injected by JS -->\n            <\/div>\n        <\/div>\n\n        <!-- 5. Feed Content (Changed to List Layout) -->\n        <!-- Header for List View -->\n        <div class=\"flex items-center px-4 py-2 text-xs font-semibold text-slate-500 uppercase tracking-wider border-b border-slate-800 mb-2\">\n            <div class=\"w-8\">Type<\/div>\n            <div class=\"flex-1\">Title<\/div>\n            <div class=\"w-24 text-right hidden sm:block\">Source<\/div>\n            <div class=\"w-20 text-right ml-4\">Date<\/div>\n        <\/div>\n        \n        <div id=\"feed-container\" class=\"flex flex-col space-y-1 mb-8\">\n            <!-- List items injected by JS -->\n        <\/div>\n\n        <!-- Loading Spinner -->\n        <div id=\"loading-spinner\" class=\"flex flex-col items-center justify-center py-20 text-slate-500\">\n            <svg class=\"w-10 h-10 animate-spin mb-4 text-indigo-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M21 12a9 9 0 1 1-6.219-8.56\"\/><\/svg>\n            <p>Fetching latest insights&#8230;<\/p>\n        <\/div>\n\n        <!-- No Data Message -->\n        <div id=\"no-data-msg\" class=\"hidden text-center py-20 bg-[#1e1e1e] rounded-xl border border-dashed border-slate-700 mb-12\">\n            <svg class=\"w-10 h-10 text-slate-600 mx-auto mb-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"\/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"\/><\/svg>\n            <p class=\"text-slate-500\">No articles found.<\/p>\n        <\/div>\n\n        <!-- 6. Expand Button -->\n        <div id=\"expand-btn-container\" class=\"flex justify-center mb-12 hidden\">\n            <button onclick=\"app.toggleExpand()\" id=\"expand-btn\" class=\"flex items-center space-x-2 px-6 py-3 bg-slate-800 hover:bg-slate-700 text-slate-200 rounded-full font-medium transition-all shadow-lg border border-slate-600\">\n                <!-- Icon and Text injected by JS -->\n            <\/button>\n        <\/div>\n\n        <!-- 7. Bottom Widget: Market Overview (TradingView) -->\n        <h2 class=\"text-sm font-semibold text-slate-400 uppercase tracking-wider mb-4 flex items-center\"><span class=\"ez-toc-section\" id=\"Market_Overview\"><\/span>\n            <svg class=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M3 3v18h18\"\/><path d=\"M18 17V9\"\/><path d=\"M13 17V5\"\/><path d=\"M8 17v-3\"\/><\/svg>\n            Market Overview\n        <span class=\"ez-toc-section-end\"><\/span><\/h2>\n        <div class=\"bg-[#1e1e1e] rounded-xl overflow-hidden shadow-lg border border-slate-700 mb-8\" style=\"height: 600px;\">\n            <div class=\"tradingview-widget-container\" style=\"height: 100%; width: 100%;\">\n                <div id=\"tv-overview-container\" class=\"tradingview-widget-container__widget\" style=\"height:calc(100% - 32px); width: 100%\"><\/div>\n            <\/div>\n        <\/div>\n\n        <!-- 8. Economic Calendar (Switched to TradingView for better WP compatibility) -->\n        <div class=\"bg-[#1e1e1e] rounded-xl shadow-lg border border-slate-700 p-4 mb-8\">\n            <h2 class=\"text-sm font-semibold text-slate-400 uppercase tracking-wider mb-4 flex items-center\"><span class=\"ez-toc-section\" id=\"Economic_Calendar\"><\/span>\n                <svg class=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" ry=\"2\"\/><line x1=\"16\" x2=\"16\" y1=\"2\" y2=\"6\"\/><line x1=\"8\" x2=\"8\" y1=\"2\" y2=\"6\"\/><line x1=\"3\" x2=\"21\" y1=\"10\" y2=\"10\"\/><\/svg>\n                Economic Calendar\n            <span class=\"ez-toc-section-end\"><\/span><\/h2>\n            <!-- White background removed, switched to TradingView widget container -->\n            <div class=\"w-full overflow-hidden rounded-lg border border-slate-800\" style=\"height: 600px;\">\n                <div class=\"tradingview-widget-container\" style=\"height: 100%; width: 100%;\">\n                    <div id=\"tv-calendar-container\" class=\"tradingview-widget-container__widget\" style=\"height:100%; width: 100%\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n    <\/div>\n\n    <!-- Main Logic Script -->\n    <script>\n    (function() {\n        \/\/ --- Configuration ---\n        const SOURCES = [\n            \/\/ Priority\n            { id: 'rafiki', name: 'Rafiki Research', url: 'https:\/\/rafikiresearch.blogspot.com\/', rssUrl: 'https:\/\/rafikiresearch.blogspot.com\/feeds\/posts\/default?alt=rss', type: 'blogspot' },\n            { id: 'worldforsale', name: '\uc5d0\ub4dc\ubabd\ub2f9\ud14c\uc2a4', url: 'https:\/\/blog.naver.com\/worldforsale', rssUrl: 'https:\/\/rss.blog.naver.com\/worldforsale.xml', type: 'naver' },\n            { id: 'hugin', name: 'Miscellaneous', url: 'https:\/\/hugin00munin.blogspot.com\/', rssUrl: 'https:\/\/hugin00munin.blogspot.com\/feeds\/posts\/default?alt=rss', type: 'blogspot' },\n            \/\/ General\n            { id: 'mer', name: '\ubc14\uc774\uc624\ud14d', url: 'https:\/\/biotechnology.tistory.com\/', rssUrl: 'https:\/\/biotechnology.tistory.com\/rss', type: 'tistory' },\n            { id: 'jakojako', name: 'Jakojako (Naver)', url: 'https:\/\/blog.naver.com\/jakojako', rssUrl: 'https:\/\/rss.blog.naver.com\/jakojako.xml', type: 'naver' },\n            { id: 'hameln3', name: '\ud558\uba5c\ub978', url: 'https:\/\/blog.naver.com\/hameln3', rssUrl: 'https:\/\/rss.blog.naver.com\/hameln3.xml', type: 'naver' },\n            { id: 'ranto28', name: 'Ranto28 (Naver)', url: 'https:\/\/blog.naver.com\/ranto28', rssUrl: 'https:\/\/rss.blog.naver.com\/ranto28.xml', type: 'naver' },\n            { id: 'pyjlawyer', name: '\ubc15\uc601\uc9c4 \ubcc0\ud638\uc0ac', url: 'https:\/\/blog.naver.com\/pyjlawyer', rssUrl: 'https:\/\/rss.blog.naver.com\/pyjlawyer.xml', type: 'naver' },\n            { id: 'mjselz', name: 'MJ Selz', url: 'https:\/\/mjselz.blogspot.com\/', rssUrl: 'https:\/\/mjselz.blogspot.com\/feeds\/posts\/default?alt=rss', type: 'blogspot' },\n            { id: 'nostalgia9', name: '\uc774\uc815\uc6d0 \uad50\uc218\ub2d8', url: 'https:\/\/brunch.co.kr\/@nostalgia9', rssUrl: 'https:\/\/brunch.co.kr\/rss\/@@nostalgia9', type: 'brunch' },\n            { id: 'pillion21', name: '\uc54c\ubc14\ud2b8\ub85c\uc2a4', url: 'https:\/\/blog.naver.com\/pillion21', rssUrl: 'https:\/\/rss.blog.naver.com\/pillion21.xml', type: 'naver' },\n            { id: 'shuder', name: '\ubcf4\uceec', url: 'https:\/\/blog.naver.com\/shuder', rssUrl: 'https:\/\/rss.blog.naver.com\/shuder.xml', type: 'naver' },\n            \/\/ Direct Links\n            { id: 'currency', name: 'Currency Strength', url: 'https:\/\/currency-strength.com\/', type: 'finance' },\n            { id: 'cnn', name: 'Fear & Greed', url: 'https:\/\/money.cnn.com\/data\/fear-and-greed\/', type: 'finance' }\n        ];\n\n        const PRIORITY_ORDER = ['rafiki', 'worldforsale', 'hugin'];\n\n        \/\/ --- State ---\n        const state = {\n            items: [],\n            activeTab: 'all',\n            isExpanded: false,\n            loading: true\n        };\n\n        \/\/ --- Helpers ---\n        function getIconSvg(type) {\n            const icons = {\n                youtube: '<svg class=\"w-4 h-4 text-red-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17\"\/><path d=\"m10 15 5-3-5-3z\"\/><\/svg>',\n                naver: '<span class=\"text-xs font-bold text-green-400\">N<\/span>',\n                tistory: '<span class=\"text-xs font-bold text-orange-400\">T<\/span>',\n                finance: '<svg class=\"w-4 h-4 text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"\/><polyline points=\"17 6 23 6 23 12\"\/><\/svg>',\n                brunch: '<span class=\"text-xs font-serif font-bold text-gray-300\">b<\/span>',\n                default: '<svg class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"\/><path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"\/><\/svg>'\n            };\n            return icons[type] || icons.default;\n        }\n\n        function formatDate(dateString) {\n            try {\n                const date = new Date(dateString);\n                const now = new Date();\n                const diffTime = Math.abs(now.getTime() - date.getTime());\n                const diffDays = Math.ceil(diffTime \/ (1000 * 60 * 60 * 24));\n                if (diffDays <= 1) return '\uc624\ub298';\n                if (diffDays <= 2) return '\uc5b4\uc81c';\n                return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n            } catch (e) { return dateString; }\n        }\n\n        \/\/ --- Logic ---\n        async function fetchFeeds() {\n            setLoading(true);\n            const feedSources = SOURCES.filter(s => s.rssUrl);\n            const promises = feedSources.map(async s => {\n                try {\n                    const res = await fetch(`https:\/\/api.rss2json.com\/v1\/api.json?rss_url=${encodeURIComponent(s.rssUrl)}`);\n                    const data = await res.json();\n                    if (data.status === 'ok') {\n                        return data.items.map(item => ({\n                            title: item.title,\n                            link: item.link,\n                            pubDate: item.pubDate,\n                            author: s.name,\n                            sourceType: s.type === 'youtube' ? 'youtube' : 'blog',\n                            sourceId: s.id\n                        }));\n                    }\n                } catch (e) { console.error('Fetch error:', s.name); }\n                return [];\n            });\n\n            const results = await Promise.all(promises);\n            const allItems = results.flat().sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));\n            state.items = allItems;\n            \n            document.getElementById('last-updated').innerText = 'Last update: ' + new Date().toLocaleTimeString();\n            setLoading(false);\n            renderFeed();\n            renderExpandButton();\n        }\n\n        function setLoading(isLoading) {\n            state.loading = isLoading;\n            const spinner = document.getElementById('loading-spinner');\n            const refreshIcon = document.getElementById('refresh-icon');\n            if (isLoading) {\n                spinner.classList.remove('hidden');\n                refreshIcon.classList.add('animate-spin');\n            } else {\n                spinner.classList.add('hidden');\n                refreshIcon.classList.remove('animate-spin');\n            }\n        }\n\n        function renderQuickLinks() {\n            const container = document.getElementById('quick-links');\n            const directLinks = SOURCES.filter(s => !s.rssUrl);\n            container.innerHTML = directLinks.map(site => `\n                <a href=\"${site.url}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"flex items-center p-4 bg-[#1e1e1e] rounded-xl shadow-md border border-slate-700 hover:border-indigo-500 hover:shadow-lg transition-all group\">\n                    <div class=\"p-2 bg-indigo-900\/30 rounded-lg mr-3 group-hover:bg-indigo-900\/50 transition-colors\">\n                        ${getIconSvg(site.type)}\n                    <\/div>\n                    <div class=\"truncate\">\n                        <div class=\"font-medium text-slate-200 text-sm truncate\">${site.name}<\/div>\n                        <div class=\"text-xs text-slate-500 flex items-center mt-1\">Open Site <svg class=\"w-3 h-3 ml-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><polyline points=\"15 3 21 3 21 9\"\/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"\/><\/svg><\/div>\n                    <\/div>\n                <\/a>\n            `).join('');\n        }\n\n        function renderFilters() {\n            const container = document.getElementById('filter-container');\n            const feedSources = SOURCES.filter(s => s.rssUrl);\n            \n            let html = `<button onclick=\"app.setTab('all')\" class=\"flex-shrink-0 px-4 py-2 rounded-full text-sm font-medium transition-colors whitespace-nowrap ${state.activeTab === 'all' ? 'bg-indigo-600 text-white shadow-md' : 'bg-[#1e1e1e] text-slate-400 border border-slate-700 hover:bg-slate-800'}\">\uc804\uccb4 \ubcf4\uae30<\/button>`;\n            \n            feedSources.forEach(s => {\n                const isPriority = PRIORITY_ORDER.includes(s.id);\n                let btnClass = `flex-shrink-0 px-4 py-2 rounded-full text-sm font-medium transition-colors whitespace-nowrap border `;\n                if (state.activeTab === s.id) {\n                    btnClass += 'bg-emerald-600 text-white border-emerald-600 shadow-md';\n                } else if (isPriority) {\n                    btnClass += 'bg-[#1e1e1e] text-indigo-300 border-indigo-900\/50 hover:bg-slate-800';\n                } else {\n                    btnClass += 'bg-[#1e1e1e] text-slate-400 border-slate-700 hover:bg-slate-800';\n                }\n\n                html += `<button onclick=\"app.setTab('${s.id}')\" class=\"${btnClass}\">\n                    ${s.name} ${isPriority ? '<svg class=\"w-3 h-3 ml-1 inline-block opacity-70\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M16 12V6a4 4 0 0 0-8 0v6l-2 2v1h12v-1l-2-2z\"\/><\/svg>' : ''}\n                <\/button>`;\n            });\n            container.innerHTML = html;\n        }\n\n        function renderFeed() {\n            const container = document.getElementById('feed-container');\n            let displayList = [];\n\n            if (state.activeTab !== 'all') {\n                displayList = state.items.filter(item => item.sourceId === state.activeTab);\n            } else {\n                if (!state.isExpanded) {\n                    const itemsBySource = {};\n                    state.items.forEach(item => {\n                        if (!itemsBySource[item.sourceId]) itemsBySource[item.sourceId] = [];\n                        itemsBySource[item.sourceId].push(item);\n                    });\n                    Object.keys(itemsBySource).forEach(sourceId => {\n                        displayList.push(itemsBySource[sourceId][0]); \n                    });\n                } else {\n                    displayList = [...state.items];\n                }\n\n                displayList.sort((a, b) => {\n                    const pA = PRIORITY_ORDER.indexOf(a.sourceId);\n                    const pB = PRIORITY_ORDER.indexOf(b.sourceId);\n                    if (pA !== -1 && pB !== -1) return pA - pB;\n                    if (pA !== -1) return -1;\n                    if (pB !== -1) return 1;\n                    return new Date(b.pubDate) - new Date(a.pubDate);\n                });\n            }\n\n            if (displayList.length === 0 && !state.loading) {\n                document.getElementById('no-data-msg').classList.remove('hidden');\n            } else {\n                document.getElementById('no-data-msg').classList.add('hidden');\n            }\n\n            container.innerHTML = displayList.map(item => {\n                const isPriority = PRIORITY_ORDER.includes(item.sourceId);\n                const bgClass = isPriority ? 'bg-[#252525]' : 'bg-[#1e1e1e]';\n                const borderClass = isPriority ? 'border-indigo-900\/50' : 'border-slate-800';\n                \n                return `\n                <a href=\"${item.link}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"group flex items-center justify-between p-3 rounded-md border ${borderClass} ${bgClass} hover:bg-slate-800 hover:border-slate-600 transition-all\">\n                    <div class=\"flex items-center min-w-0 flex-1 mr-4\">\n                        <div class=\"flex-shrink-0 mr-3 w-8 flex justify-center opacity-70 group-hover:opacity-100 transition-opacity\">\n                            ${getIconSvg(item.sourceType)}\n                        <\/div>\n                        <div class=\"truncate text-sm sm:text-base font-medium text-slate-300 group-hover:text-indigo-400 transition-colors\">\n                            ${item.title}\n                        <\/div>\n                    <\/div>\n                    <div class=\"flex items-center space-x-6 text-xs sm:text-sm text-slate-500 flex-shrink-0\">\n                        <span class=\"hidden sm:inline-block w-24 text-right truncate group-hover:text-slate-400 transition-colors\">\n                            ${item.author}\n                        <\/span>\n                        <span class=\"w-16 text-right font-mono group-hover:text-slate-400 transition-colors\">\n                            ${formatDate(item.pubDate)}\n                        <\/span>\n                    <\/div>\n                <\/a>`;\n            }).join('');\n        }\n\n        function renderExpandButton() {\n            const container = document.getElementById('expand-btn-container');\n            const btn = document.getElementById('expand-btn');\n            \n            if (state.activeTab === 'all' && state.items.length > 0) {\n                container.classList.remove('hidden');\n                if (state.isExpanded) {\n                    btn.innerHTML = `<svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><polyline points=\"18 15 12 9 6 15\"\/><\/svg><span>\uac04\ub7b5\ud788 \ubcf4\uae30 (\ucd5c\uc2e0\uae00\ub9cc)<\/span>`;\n                } else {\n                    btn.innerHTML = `<svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><polyline points=\"6 9 12 15 18 9\"\/><\/svg><span>\uc804\uccb4 \uae00 \ud3bc\uccd0\ubcf4\uae30<\/span>`;\n                }\n            } else {\n                container.classList.add('hidden');\n            }\n        }\n\n        \/\/ --- TradingView Injection ---\n        function injectTradingView() {\n            \/\/ Top: Market Quotes\n            const topContainer = document.getElementById('tv-quotes-container');\n            if(topContainer) {\n                topContainer.innerHTML = '';\n                const script1 = document.createElement('script');\n                script1.src = 'https:\/\/s3.tradingview.com\/external-embedding\/embed-widget-market-quotes.js';\n                script1.async = true;\n                script1.innerHTML = JSON.stringify({\n                    \"colorTheme\": \"dark\", \"locale\": \"kr\", \"isTransparent\": false, \"showSymbolLogo\": true, \"backgroundColor\": \"#1e1e1e\", \"width\": \"100%\", \"height\": \"100%\",\n                    \"symbolsGroups\": [\n                        { \"name\": \"FX\", \"symbols\": [{ \"name\": \"FX:USDJPY\" }, { \"name\": \"FX_IDC:JPYKRW\" }, { \"name\": \"FX_IDC:USDKRW\" }] },\n                        { \"name\": \"Indices\", \"symbols\": [{ \"name\": \"FOREXCOM:SPXUSD\" }, { \"name\": \"FOREXCOM:NSXUSD\" }, { \"name\": \"FOREXCOM:DJI\" }, { \"name\": \"INDEX:NKY\" }, { \"name\": \"KRX:KOSPI200\" }, { \"name\": \"KRX:KOSDAQ150\" }, { \"name\": \"KRX:KOSPI\" }] },\n                        { \"name\": \"Futures\", \"symbols\": [{ \"name\": \"CMCMARKETS:GOLD\" }, { \"name\": \"PYTH:WTI3!\" }] },\n                        { \"name\": \"\ucf54\uc778\", \"symbols\": [{ \"name\": \"UPBIT:BTCKRW\" }, { \"name\": \"UPBIT:XRPKRW\" }, { \"name\": \"BINANCE:BTCUSD\" }, { \"name\": \"UPBIT:ETHKRW\" }] }\n                    ]\n                });\n                topContainer.appendChild(script1);\n            }\n\n            \/\/ Bottom: Market Overview\n            const bottomContainer = document.getElementById('tv-overview-container');\n            if(bottomContainer) {\n                bottomContainer.innerHTML = '';\n                const script2 = document.createElement('script');\n                script2.src = 'https:\/\/s3.tradingview.com\/external-embedding\/embed-widget-market-overview.js';\n                script2.async = true;\n                script2.innerHTML = JSON.stringify({\n                    \"colorTheme\": \"dark\", \"dateRange\": \"1D\", \"showChart\": true, \"locale\": \"kr\", \"isTransparent\": false, \"width\": \"100%\", \"height\": \"100%\",\n                    \"plotLineColorGrowing\": \"rgba(255, 255, 255, 1)\", \"plotLineColorFalling\": \"rgba(255, 0, 0, 1)\", \"gridLineColor\": \"rgba(42, 46, 57, 0)\", \"scaleFontColor\": \"rgba(134, 137, 147, 1)\", \"symbolActiveColor\": \"rgba(41, 98, 255, 0.12)\",\n                    \"tabs\": [\n                        { \"title\": \"\uc678\ud658\", \"symbols\": [{ \"s\": \"FX:EURUSD\" }, { \"s\": \"FX:USDJPY\" }, { \"s\": \"FX_IDC:USDKRW\" }] },\n                        { \"title\": \"\uc9c0\uc218\", \"symbols\": [{ \"s\": \"FOREXCOM:SPXUSD\" }, { \"s\": \"FOREXCOM:NSXUSD\" }, { \"s\": \"FOREXCOM:DJI\" }, { \"s\": \"INDEX:NKY\" }, { \"s\": \"INDEX:DEU40\" }] },\n                        { \"title\": \"\uc120\ubb3c\", \"symbols\": [{ \"s\": \"CME_MINI:ES1!\" }, { \"s\": \"CME:6E1!\" }, { \"s\": \"COMEX:GC1!\" }, { \"s\": \"NYMEX:CL1!\" }] }\n                    ]\n                });\n                bottomContainer.appendChild(script2);\n            }\n\n            \/\/ Bottom: Economic Calendar (Newly added to replace iframe)\n            const calendarContainer = document.getElementById('tv-calendar-container');\n            if(calendarContainer) {\n                calendarContainer.innerHTML = '';\n                const script3 = document.createElement('script');\n                script3.src = 'https:\/\/s3.tradingview.com\/external-embedding\/embed-widget-events.js';\n                script3.async = true;\n                script3.innerHTML = JSON.stringify({\n                    \"colorTheme\": \"dark\",\n                    \"isTransparent\": false,\n                    \"width\": \"100%\",\n                    \"height\": \"100%\",\n                    \"locale\": \"kr\",\n                    \"importanceFilter\": \"0,1\",\n                    \"currencyFilter\": \"USD,KRW,EUR,JPY,GBP,CNY\"\n                });\n                calendarContainer.appendChild(script3);\n            }\n        }\n\n        \/\/ --- Global Access for Buttons ---\n        window.app = {\n            refreshFeed: fetchFeeds,\n            setTab: (tabId) => {\n                state.activeTab = tabId;\n                renderFilters();\n                renderFeed();\n                renderExpandButton();\n            },\n            toggleExpand: () => {\n                state.isExpanded = !state.isExpanded;\n                renderFeed();\n                renderExpandButton();\n            }\n        };\n\n        \/\/ --- Init ---\n        renderQuickLinks();\n        renderFilters();\n        fetchFeeds();\n        injectTradingView();\n\n    })();\n    <\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Investment Dashboard Investment Insight Other Analytics Filter Source Type Title Source Date Fetching latest insights&#8230; No articles found. Market Overview Economic Calendar<\/p>\n","protected":false},"author":1,"featured_media":3635,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-960","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-1"],"_links":{"self":[{"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=\/wp\/v2\/posts\/960","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=960"}],"version-history":[{"count":35,"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=\/wp\/v2\/posts\/960\/revisions"}],"predecessor-version":[{"id":4147,"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=\/wp\/v2\/posts\/960\/revisions\/4147"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=\/wp\/v2\/media\/3635"}],"wp:attachment":[{"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=960"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=960"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/saku-hika.azki.in\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}