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ắt Nhịp “Trend Nội Thất 2026”: Biến Ngôi Nhà Thành Bản Tuyên Ngôn Nghệ Thuật

Cảm thấy căn hộ hiện tại đã bắt đầu nhàm chán, bạn muốn tìm kiếm...

Sàn SPC: Điểm Chạm Vượt Trội Của Không Gian Sống Cao Cấp

Bạn yêu thích vẻ ấm cúng của gỗ nhưng ám ảnh cảnh sàn cong vênh...

Bảng màu Japandi 2026: màu – vật liệu – ánh sáng đi cùng nhau

Japandi đẹp nhất khi bạn bước vào nhà và thấy mọi thứ “tĩnh” lại: không...

Bảng màu nội thất 2026: chọn màu theo mood và tỷ lệ phối

Bảng màu nội thất 2026 — Chọn đúng tone, nhà tự “đẹp lên” Bạn có...

Organic Modern: “Hiện đại” vừa đủ, “tự nhiên” có chủ đích — để nhà đẹp mà vẫn dễ thở

Nếu bạn từng đứng trong một không gian quá lạnh vì tối giản, hoặc quá...

Warm Minimalism – Khi không gian sống trở thành nền tảng của chất lượng sống

Không gian sống không còn chỉ để ở Trong nhịp sống hiện đại, con người...

Japandi 2026: Kỷ Nguyên Của “Quiet Luxury” và Nghệ Thuật Chữa Lành Trong Không Gian Sống Việt

Trong dòng chảy hối hả của cuộc sống hiện đại, ngôi nhà không còn đơn...

5 xu hướng “Quiet Luxury” để sửa nhà đón Tết Bính Ngọ 2026 sang trọng và tinh tế

Sửa Nhà Đón Tết Bính Ngọ 2026: Đánh Thức Không Gian “Healing” Giữa Lòng Phố...

Xu Hướng Nội Thất 2026: Khi “Sang Trọng Thầm Lặng” Gặp Gỡ Kiến Trúc Chữa Lành

Trong suốt 8 năm làm nghề, chứng kiến sự thay đổi từ những trào lưu...

Màu Pantone 2026 – Sắc Trắng Ngà Sáng Cho Phòng Khách

Trong định hướng màu sắc mới, Màu Pantone 2026 được khắc họa như một tông...

Đẹp Từ Hình Thức Đến “Nội Tâm”: Triết Lý Thi Công Của Décor

Một ngôi nhà đẹp không chỉ nằm ở bề mặt — đá, gỗ hay màu...

Đảo bếp đá/quartzite 2025: chọn vật liệu – phối màu – bảo trì

Bạn muốn đảo bếp đẹp – bền – dễ sống, chứ không chỉ “đắt”. Với...

(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); })();