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

Phong Cách Thiết Kế Retro Mix Modern: Sự Kết Hợp Hoàn Hảo Giữa Cổ Điển và Hiện Đại

Sự Kết Hợp Giữa Nét Hiện Đại Trong Không Gian Cổ Điển Trong thế giới...

5 Ý tưởng trang trí phòng khách nhỏ đẹp và ấn tượng

Biến Hóa Phòng Khách Nhỏ Thành Không Gian Ấn Tượng: Bí Quyết Từ Những Chuyên...

Thiết Kế Sân Thượng: Nơi Tái Tạo Năng Lượng và Thư Giãn

Giữa nhịp sống hối hả của đô thị, sân thượng không chỉ là nơi phơi...

Thời Trang Giữa Không Gian Nội Thất: Walk In Closet

Tạo Không Gian Cá Nhân Hoàn Hảo với Walk In Closet Giới Thiệu Trong thế...

Cách Tạo Không Gian Thư Giãn Ở Nhà Xịn Xò Như Ở Spa

Sáng Tạo Không Gian Thư Giản Ở Nhà Xịn Xò Như Ở Spa Trong cuộc...

Phong Cách Quiet Luxury: Định Nghĩa Mới Của Sang Trọng

Phong cách Quiet Luxury: Sự Sang Trọng Trong Đường Nét Tinh Tế Trong thế giới...

Phòng Giải Trí: Tâm Điểm Của Không Gian Sống Hiện Đại

Phòng Giải Trí: Tâm Điểm Của Không Gian Sống Hiện Đại Trong thế giới hối...

Màu Taupe: Sắc Màu Của Sự Sang Trọng và Tinh Tế Trong Thiết Kế Đương Đại

Sắc Thái Màu Taupe Màu taupe là sự kết hợp hoàn hảo giữa màu nâu...

Những Yếu Tố Tạo Nên Một Không Gian Sống Sang Trọng

Khi bước chân vào một không gian sang trọng, điều đầu tiên ta cảm nhận...

Phong Cách Industrial: Sự Giao Thoa Giữa Cổ Điển và Hiện Đại

Phong Cách Industrial: Sự Giao Thoa Giữa Cổ Điển và Hiện Đại Trong thế giới...

Phong cách Contemporary trong Thiết Kế Nội Thất: Hiện Đại và Tinh Tế

Phong cách Contemporary trong Thiết Kế Nội Thất: Hiện Đại và Tinh Tế Phong cách...

Sáng Tạo Không Gian Sống: Biến Ý Tưởng Độc Đáo Thành Hiện Thực

Sáng Tạo Không gian Sống Từ Ý Tưởng  Sáng tạo không gian sống hiện đạ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); })();