Tin tức

Décor chia sẽ những kiến thức sâu rộng, trong từng vấn đề công việc, chia sẽ quá trình thực hiện thi công, chia sẽ chuyên sâu những công việc thực hiện tới khách hàng.

DÉCOR YOUR REFLECTION

Bí quyết thiết kế không gian sống lý tưởng: Từ ý tưởng đến hiện thực

Không gian sống không chỉ là nơi bạn sinh hoạt, mà còn phản ánh cá...

Phong Cách Japandi 2025: Tối Giản & Ấm Áp Với Giải Pháp Trọn Gói Từ Décor Interior

  Japandi – sự kết hợp hoàn hảo giữa phong cách tối giản Bắc Âu...

Cách Kết Hợp Văn Hóa Việt Vào Thiết Kế Nội Thất Hiện Đại 2025

Trong bối cảnh toàn cầu hóa, việc giữ gìn bản sắc văn hóa dân tộc...

Phối Màu Nội Thất Theo Dự Báo 2025: Từ Pastel Đến Neon

🎨 Màu Sắc 2025: Sự Kết Hòa Giữa Dịu Dàng Và Năng Động Năm 2025...

Thiết Kế Nội Thất Hiện Đại Năm 2025: 5 Xu Hướng “Lên Ngôi” Dành Cho Không Gian Sống

Bạn có bao giờ tự hỏi: “Không gian sống của mình sẽ thay đổi ra...

Biophilic Design Nội Thất 2025: Kết Nối Thiên Nhiên Để Kiến Tạo Không Gian Sống “Xanh” Đẳng Cấp

Biophilic Design Nội Thất 2025: Kết Nối Với Thiên Nhiên Trong bối cảnh biến đổi...

Nội Thất Tối Giản Màu Trung Tính: Sự Kết Hợp Hoàn Hảo Giữa Thẩm Mỹ Và Tiện Nghi

Khám Phá Xu Hướng Thiết Kế Đang “Làm Mưa Làm Gió” Năm 2025 Giới Thiệu...

MÀU MOCHA MOUSSE TRONG NỘI THẤT: XU HƯỚNG THIẾT KẾ ẤM ÁP VÀ TINH TẾ CHO NĂM 2025

MÀU MOCHA MOUSSE TRONG NỘI THẤT NĂM 2025 Năm 2025 đánh dấu sự lên ngôi...

Thiết Kế Nội Thất Net Zero: Xu Hướng Bền Vững Cho Không Gian Sống 2025

Thiết Kế Nội Thất Net Zero: Xu Hướng Bền Vững Cho Không Gian Sống 2025...

Phong Cách Thiết Kế Nội Thất Sẽ Được Ưa Chuộng Tại TP.HCM Năm 2025

Dự Báo Xu Hướng Thiết Kế Từ Góc Nhìn Chuyên Gia Thành phố Hồ Chí...

Thiết Kế Quán Coffee Wabi Sabi

Quán Coffee Mang Phong Cách Wabi Sabi: Nghệ Thuật Tìm Thấy Vẻ Đẹp Trong Sự...

Xu Hướng Thiết Kế Không Gian Sống ” Hot ” – 2024

Không Gian Sống Hiện Đại – 2024 Xu hướng thiết kế không gian sống Năm...

(function () { function initDecorFloatingToc() { const holder = document.getElementById("decorFloatingToc"); const panel = document.getElementById("decorFloatingTocPanel"); const inner = document.getElementById("decorFloatingTocInner"); const fill = document.getElementById("decorFloatingTocFill"); const thumb = document.getElementById("decorFloatingTocThumb"); const article = document.getElementById("decorArticleMain"); const links = Array.from(document.querySelectorAll(".decor-floating-toc__item")); if (!holder || !panel || !inner || !fill || !thumb || !article || !links.length) return; const items = links.map(link => { const href = link.getAttribute("href"); const target = href ? document.querySelector(href) : null; return { link, target }; }).filter(item => item.target); if (!items.length) return; function syncHolderHeight() { if (window.innerWidth <= 991) { holder.style.minHeight = "0px"; return; } holder.style.minHeight = Math.max(article.offsetHeight, panel.offsetHeight) + "px"; } function moveIndicator(link) { const innerRect = inner.getBoundingClientRect(); const linkRect = link.getBoundingClientRect(); const center = (linkRect.top - innerRect.top) + (linkRect.height / 2); thumb.style.top = center + "px"; fill.style.height = center + "px"; } function setActive(item) { links.forEach(link => link.classList.remove("active")); item.link.classList.add("active"); moveIndicator(item.link); } function getCurrentItem() { const triggerY = window.innerHeight * 0.42; let current = items[0]; for (const item of items) { const rect = item.target.getBoundingClientRect(); if (rect.top <= triggerY) { current = item; } else { break; } } return current; } function updateFloatingPosition() { if (window.innerWidth <= 991) { panel.style.position = "relative"; panel.style.top = "auto"; panel.style.left = "auto"; panel.style.width = "100%"; return; } const holderRect = holder.getBoundingClientRect(); const holderTopDoc = window.scrollY + holderRect.top; const holderBottomDoc = holderTopDoc + holder.offsetHeight; const panelHeight = panel.offsetHeight; const viewportPadding = 28; const preferredTop = (window.innerHeight - panelHeight) / 2; const fixedTop = Math.max( viewportPadding, Math.min(preferredTop, window.innerHeight - panelHeight - viewportPadding) ); const desiredTopDoc = window.scrollY + fixedTop; const maxTopDoc = holderBottomDoc - panelHeight; if (desiredTopDoc <= holderTopDoc) { panel.style.position = "absolute"; panel.style.top = "0px"; panel.style.left = "0px"; panel.style.width = "100%"; } else if (desiredTopDoc >= maxTopDoc) { panel.style.position = "absolute"; panel.style.top = Math.max(0, holder.offsetHeight - panelHeight) + "px"; panel.style.left = "0px"; panel.style.width = "100%"; } else { panel.style.position = "fixed"; panel.style.top = fixedTop + "px"; panel.style.left = holderRect.left + "px"; panel.style.width = holderRect.width + "px"; } } let ticking = false; function updateAll() { syncHolderHeight(); updateFloatingPosition(); setActive(getCurrentItem()); ticking = false; } function requestUpdate() { if (!ticking) { window.requestAnimationFrame(updateAll); ticking = true; } } if (!holder.dataset.decorInit) { window.addEventListener("scroll", requestUpdate, { passive: true }); window.addEventListener("resize", requestUpdate); window.addEventListener("load", requestUpdate); links.forEach(link => { link.addEventListener("click", function () { setTimeout(requestUpdate, 180); }); }); if (document.fonts && document.fonts.ready) { document.fonts.ready.then(requestUpdate); } holder.dataset.decorInit = "true"; } requestUpdate(); } document.addEventListener("DOMContentLoaded", initDecorFloatingToc); document.body.addEventListener("experimental-flatsome-pjax-request-done", initDecorFloatingToc); })();