{"id":743,"date":"2026-02-26T17:32:04","date_gmt":"2026-02-26T06:32:04","guid":{"rendered":"https:\/\/www.hashmicro.com\/au\/blog\/?p=743"},"modified":"2026-05-20T13:27:04","modified_gmt":"2026-05-20T03:27:04","slug":"predictive-maintenance","status":"publish","type":"post","link":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/","title":{"rendered":"What Is Predictive Maintenance in the Australian Industry?"},"content":{"rendered":"<p data-pm-slice=\"1 1 []\">Australian businesses operating mines, factories, and large facilities face growing pressure to reduce downtime and keep equipment running reliably. In remote operations, even one unexpected failure can disrupt production and increase repair costs.<\/p>\n<p>To reduce these risks, many companies are moving from reactive maintenance to predictive maintenance supported by real-time monitoring and analytics. Modern sensors and machine learning help teams identify early signs of equipment failure before breakdowns occur.<\/p>\n<p>When implemented properly, predictive maintenance improves asset reliability, reduces unnecessary maintenance work, and supports stable operations. This article explains how predictive maintenance works, where it delivers value, and how businesses can implement it effectively.<\/p>\n<style>\r\n\t.takeaways-container {\r\n\t\tmargin: 20px 0;\r\n\t\tfont-family: sans-serif;\r\n\t}\r\n\t.box-content {\r\n\t\tbackground-color: #fffacd;\r\n\t\tbox-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\r\n\t\tborder-radius: 25px;\r\n\t\tpadding: 25px;\r\n\t}\r\n\t.title {\r\n\t\tmargin-bottom: 20px;\r\n\t}\r\n\t.title p {\r\n\t\tdisplay: inline-block;\r\n\t\tbackground-color: #8A0E19;\r\n\t\tcolor: #ffffff;\r\n\t\tpadding: 8px 15px;\r\n\t\tborder-radius: 8px;\r\n\t\tfont-size: 22px;\r\n\t\tfont-weight: bold;\r\n\t\tmargin: 0;\r\n\t}\r\n\t.item {\r\n\t\tdisplay: flex;\r\n\t\talign-items: flex-start;\r\n\t\tmargin-bottom: 12px;\r\n\t}\r\n\t.item .circle {\r\n\t\twidth: 8px;\r\n\t\theight: 8px;\r\n\t\tbackground-color: #000000;\r\n\t\tborder-radius: 50%;\r\n\t\tmargin-right: 12px;\r\n\t\tflex-shrink: 0;\r\n\t\tmargin-top: 8px;\r\n\t}\r\n\t.item p {\r\n\t\tmargin: 0;\r\n\t\tfont-size: 16px;\r\n\t\tline-height: 1.6;\r\n\t}\r\n\t.item p a {\r\n\t\tcolor: #8A0E19;\r\n\t\tfont-weight: normal;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.item p a:hover {\r\n\t\ttext-decoration: underline;\r\n\t}\r\n\t.button-wrapper {\r\n\t\tmargin-top: 25px;\r\n\t}\r\n\t.submit-button {\r\n\t\tbackground-color: #8a0e19;\r\n\t\tcolor: #fff !important;\r\n\t\ttransition: all .3s ease;\r\n\t\tpadding: 12px 28px;\r\n\t\tdisplay: inline-block;\r\n\t\tborder-radius: 12px;\r\n\t\tfont-size: 16px;\r\n\t\tfont-weight: bold;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.submit-button:hover {\r\n\t\tbackground-color: #991b26;\r\n\t}\r\n\t@media (max-width: 767px) {\r\n\t\t.takeaways-container {\r\n\t\t\theight: auto;\r\n\t\t\tpadding: 0;\r\n\t\t}\r\n\t\t.box-content {\r\n\t\t\tpadding: 24px;\r\n\t\t}\r\n\t\t.content,\r\n\t\t.main-content,\r\n\t\t.list-item {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t}\r\n<\/style>\r\n\r\n<div class=\"takeaways-container\">\r\n\t<div class=\"box-content\">\r\n\t\t<div class=\"content\">\r\n\t\t\t<div class=\"title\">\r\n\t\t\t\t<p>Key Takeaways<\/p>\r\n\t\t\t<\/div>\r\n\t\t\t<div class=\"main-content\">\r\n\t\t\t\t<div class=\"list-item\">\r\n\t\t\t\t\t<div class=\"item\">    <div class=\"circle\"><\/div>    <p>Understanding how <a href=\"#understanding-predictive-maintenance\">predictive maintenance works<\/a> helps businesses use real time monitoring to anticipate equipment failures more accurately.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p>The <a href=\"#key-benefits-of-predictive-maintenance\">key advantages of predictive maintenance<\/a> include reduced downtime, lower operating costs, and improved asset reliability across operations.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p>Following the right <a href=\"#how-to-implement-predictive-maintenance-successfully\">steps to implement predictive maintenance<\/a> helps businesses transition from reactive maintenance to a proactive, data driven approach.<\/p><\/div><div class=\"item\">    <div class=\"circle\"><\/div>    <p>A <a href=\"#predictive-maintenance-implementation-framework\">structured predictive maintenance framework<\/a> ensures sensors, analytics, and maintenance workflows remain aligned for long term operational performance.<\/p><\/div>\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t<\/div>\r\n<\/div>\n<p><span data-sheets-root=\"1\">\r\n    <div class=\"adjustable-banner-wrap\">\r\n        <a href=\"https:\/\/www.hashmicro.com\/au\/inventory?medium=moneysite-banner\" target=\"_blank\">\r\n            <img decoding=\"async\" loading=\"lazy\"\r\n                 src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/inventory_desktop_3.webp\"\r\n                 data-desktop-src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/inventory_desktop_3.webp\"\r\n                 data-mobile-src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/03\/inventory_mobile_3.webp\"\r\n                 alt=\"Inventory3\"\r\n                 class=\"responsive-image-banner\">\r\n\r\n            \r\n            <div class=\"adjustable-banner-overlay\" style=\"width: 58%\">\r\n                <p class=\"adjustable-banner-text\"><span class=\"adjustable-highlight\">Need an<\/span> expert to improve <span class=\"adjustable-highlight\">asset monitoring and maintenance efficiency<\/span>?<\/p>\r\n                <div class=\"adjustable-banner-btn\">Free Demo<\/div>\r\n            <\/div>\r\n\r\n        <\/a>\r\n    <\/div>\r\n<script>\r\n    \/\/ check which image to use based on screensize\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        function updateImageSource() {\r\n            var images = document.querySelectorAll('.responsive-image-banner');\r\n            var screenWidth = window.innerWidth;\r\n\r\n            images.forEach(function(img) {\r\n                var mobileSrc = img.getAttribute('data-mobile-src');\r\n                var desktopSrc = img.getAttribute('data-desktop-src');\r\n\r\n                if (screenWidth < 576 && mobileSrc) {\r\n                    img.setAttribute('src', mobileSrc);\r\n                } else {\r\n                    img.setAttribute('src', desktopSrc);\r\n                }\r\n            });\r\n        }\r\n\r\n        \/\/ Initial check\r\n        updateImageSource();\r\n\r\n        \/\/ Update on resize\r\n        window.addEventListener('resize', updateImageSource);\r\n    });\r\n<\/script> <!-- <div id=\"toc_group_article\" style=''>\r\n\t<p style='font-size:25px;font-weight:bold; margin-bottom:0px'>\r\n\t\tTable of Content:\r\n\t<\/p>\r\n\t<ul id=\"list_toc\" class='list_toc'><\/ul>\r\n<\/div> -->\r\n\r\n<!-- <div class=\"dropdown-fixed-top\" id=\"dropdown-fixed-top\">\r\n\t<div class=\"row\">\r\n\t\t<p id=\"pilihDaftarIsi\">Table of Content<\/p>\r\n\t\t<p><i class=\"td-icon-menu-down\"><\/i><\/p>\r\n\t<\/div>\r\n\t\r\n\t<div>\r\n\t\t<ul id=\"list_toc_top\" class='list_toc'><\/ul>\r\n\t<\/div>\r\n<\/div> -->\r\n\r\n<div id=\"placeholder-toc\"><\/div>\r\n<div id=\"toc\">\r\n    <div class=\"header\">\r\n\t<span class=\"toc-title\" id=\"toc-title\">Table of Content<\/span>\t\r\n\t <i class=\"toc-icon\">\r\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"30\" height=\"30\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"header-icon\">\r\n          <path d=\"m6 9 6 6 6-6\" \/>\r\n        <\/svg>\r\n      <\/i>\r\n\t<\/div>\r\n    <div class=\"list\">\r\n      <ul id=\"toc-list\"><\/ul>\r\n    <\/div>\r\n <\/div>\r\n\r\n<style>\r\n\t@media (max-width: 992px) {\r\n\t\t#toc_group_article {\r\n\t\t\tpadding-top: 24px;\r\n\t\t}\r\n\t}\r\n\t\r\n\t#list_toc_float {\r\n\t\tmax-height: calc(100vh - 250px);\r\n\t\toverflow-y: auto;\r\n\t}\r\n\t\r\n\t#list_toc_top {\r\n\t\tdisplay: none;\r\n\t\tbackground: #fff;\r\n\t\tmargin-bottom: 4px;\r\n\t}\r\n\t\r\n\t#list_toc_top li {\r\n\t\tdisplay: block;\r\n\t\tmargin-left: 0;\r\n\t\tlist-style: none;\r\n\t}\r\n\t\r\n\t#list_toc_top a {\r\n\t\tpadding: 5px;\r\n\t\tdisplay: block;\r\n\t}\r\n\t\r\n\t#list_toc_top.show {\r\n\t\tdisplay: block;\r\n\t}\r\n\r\n\t#list_toc_top a {\r\n\t\tcolor: #434343;\r\n\t\tborder-bottom: 1px solid #bbb;\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top {\r\n\t\tposition: fixed;\r\n\t\ttop: 59px;\r\n\t\twidth: 100%;\r\n\t\tz-index: 99;\r\n\t\tborder-bottom: 2px solid #9c171e;\r\n\t\tpadding: 12px;\r\n\t\tbackground: #fff;\r\n\t\twidth: 100%;\r\n\t\tcursor: pointer;\r\n\t\tdisplay: none;\r\n\t\tleft: 0;\r\n\t\tbox-shadow: 0 -2px 7px 6px rgba(0, 0, 0, 0.17);\r\n\t}\r\n\t\r\n\t#dropdown-fixed-top.show {\r\n\t\tanimation: showAnim 0.5s ease;\r\n\t\tdisplay: block;\r\n\t\topacity: 1;\r\n\t}\r\n\t\r\n\t@keyframes showAnim {\r\n\t\tfrom {\r\n\t\t\tdisplay: none;\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t\tto {\r\n\t\t\tdisplay: block;\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top #list_toc_top {\r\n\t\tmax-height: calc(50vh - 110px);\r\n\t\toverflow-y: scroll;\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top .row {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between\r\n\t}\r\n\t\r\n\t.dropdown-fixed-top .row p {\r\n\t\tmargin-bottom: 0;\r\n\t}\r\n\t\r\n\t#pilihDaftarIsi {\r\n\t\tmax-width: 100%;\r\n\t\toverflow: hidden;\r\n\t\twhite-space: nowrap;\r\n\t}\r\n\t\r\n\t@media (min-width: 1018px) {\r\n\t\t.dropdown-fixed-top {\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\t\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc > li > ul {padding-left: 20px;margin-bottom: 0;}\r\n\t#list_toc{height:max-content;transition:ease-in-out}\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc_float li.active > a {color:#b1252d;background: #ffe1e3;}\r\n\t#list_toc_top li.active > a {color:#b1252d;background: #ffe1e3;}\r\n\t#list_toc_float li a {padding:3px 7px}\r\n\t#list_toc_float li a {\r\n\t\tdisplay: block;\r\n\t\tcolor: #000;\r\n\t\tmargin-bottom: 6px;\r\n\t\tpadding-top: 2px;\r\n\t\tpadding-bottom: 2px;\r\n\t\ttransition: all 0.2s ease-in-out;\r\n\t\tfont-size: 15px;\r\n\t\tline-height: 18px;\r\n\t}\r\n\t#list_toc_float li{list-style:none;list-style-position:inside; margin-left:0;}\r\n\t#list_toc_float a:hover{color:#b1252d;}\r\n\t\r\n\t#toc_group_float{\r\n\t\tline-height: 24px;\r\n\t\tmax-height: calc(100vh - 100px);\r\n\t\toverflow: auto;\r\n\t\tz-index: 99;\r\n\t\tdisplay:none!important;\r\n\t\tbackground:#fff;\r\n\t\ttransition:all 0.5s linear\r\n\t}\r\n\t\r\n\t@media (min-width:1019px){\r\n\t\t#toc_group_float {\r\n\t\t\tdisplay:block!important;\r\n\t\t\t}\r\n\t\t\t\t#toc_group_article {\r\n\t\t\tdisplay:none;\r\n\t\t}\r\n\t}\r\n\r\n<\/style>\r\n\r\n<!-- ToC styling  -->\r\n<style>\r\n\t\/* Simple styling for the TOC *\/\r\n\t\r\n\t#toc ul li:last-child {\r\n    padding-bottom: 16px; \/* Adjust the value as needed *\/\r\n}\r\n\r\n.td-fix-index {\r\n\t transform: unset !important;\r\n     -webkit-transform: unset !important; \r\n}\r\n.footer-contact .td-fix-index {\r\n\t transform: translateZ(0) !important;\r\n     -webkit-transform: translateZ(0) !important; \r\n}\r\n\t.tdb_single_content .tdb-block-inner.td-fix-index{\r\n\t\tposition: static;\r\n\t}\r\n\t\r\n\r\n\t\r\n#toc {\r\n  background-color: #FFF;\r\n\tpadding: 17px 24px 0px 24px !important;\r\n  margin-bottom: 20px;\r\n\/*   border: 1px solid #9C171E; *\/\r\n  border-radius: 6px;\r\n\tdisplay: none;\r\n  max-width: 100%;\r\n  transition: .4s ease height;\r\n\tmargin-left: 0;\r\n\toverflow: hidden;\r\n}\r\n\r\n#toc .header{\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n\tbackground-color: transparent;\r\n}\r\n\t\r\n\t#toc.sticky .header{\r\n\t\tpadding: 4px 0;\r\n\t}\r\n\t\r\n.header p{\r\n  font-size: 18px !important;\r\n  font-weight: 600 !important;\r\n  color: #393939;\r\n   margin-bottom: 0;\r\n  \/* margin-top: 20px; *\/\r\n}\r\n\r\n.toc-icon{\r\n  float: right;\r\n\/*   visibility: hidden; *\/\r\n}\r\n\r\n\t.toc-title{\r\n\t\tmargin-right: auto;\r\n\/* \t\tpadding-left: 20px; *\/\r\n\t\tfont-weight: 600;\r\n\t\talign-self: center;\t}\t\r\n\r\n#toc ul {\r\n  list-style-type: none;\r\n  padding-left: 0;\r\n}\r\n\t\r\n#toc.sticky ul{\r\n\toverflow-y: auto;\r\n\tmax-height: 250px;\r\n\tmargin-top: 0px;\r\n\tpadding-top: 20px;\r\n\/* \tborder-top: 1px solid #d3d3d3; *\/\r\n}\r\n\t\r\n#toc ul li {\r\n\/*   margin-bottom: 10px; *\/\r\n  margin-bottom: 10px;\r\n\tmargin-left: 0;\r\n\ttransition: .2s ease;\r\n\tcursor: pointer;\r\n}\r\n\t\r\n\t#toc.sticky ul li {\r\n\t  margin-right: 10px;\r\n\t}\r\n\t\r\n.td-post-content #toc-list li a:hover, .td-post-content #toc-list a.active{\r\n\tbackground-color: #FFF;\r\n\/* \tpadding: 8px 16px 8px 16px; *\/\r\n\tpadding: 4px 16px 4px 16px;\r\n\tborder-radius: 6px;\r\n\tcolor: #9c171e !important;\r\n\tfont-weight: 600 !important;\r\n}\r\n\t\r\n\t.td-post-content #toc-list li:hover a, .td-post-content #toc-list a.active{\r\n\t\tcolor: #9C171E !important;\r\n\t\tfont-weight: 600 !important;\r\n\t}\r\n\t\r\n.td-post-content #toc-list a.active{\r\n\tfont-weight: bold !important;\r\n\tcolor: #9C171E !important;\r\n}\r\n\t\r\n#toc a, .td-post-content #toc-list a {\r\n  text-decoration: none;\r\n  color: #ea1717 !important;\r\n  transition: .2s ease;\r\n\tfont-weight: 400 !important;\r\n\tdisplay: block;\r\n\t\r\n\tpadding: 4px 16px 4px 0;\r\n}\r\n\r\n#toc.sticky {\r\n  position: fixed;\r\n\/*   top: 73px; *\/\r\n\tbottom: 0;\r\n  z-index: 100; \r\n  box-shadow: 0 2px 5px rgba(0,0,0,0.1); \r\n\twidth: 100%; \r\n\tbackground-color: #FFF;\r\n\/* \tbackground-color: #FFF1F1; *\/\r\n\tborder-bottom: 1px solid #ea1717;\r\n\/*   border: 1px solid #393939; *\/\r\n  box-shadow: 0px 0px 14px 0px #00000040;\r\n  cursor: pointer;\r\n\tanimation: fadein .3s ease;\r\n\tpadding: 12px 16px !important;\r\n}\r\n\t\r\n\t.fadein{\r\n\t\tanimation: fadein .3s ease;\r\n\t}\r\n\t\r\n\t.fadeout{\r\n\t\tanimation: fadeout .3s ease;\r\n\t}\r\n\t\r\n\t\r\n\t@keyframes fadein{\r\n\t\t0% {\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@keyframes fadeout{\r\n\t\t0% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n#toc.sticky .header p{\r\n\tmargin-bottom: 10px;\r\n\tmargin-top: 10px;\r\n}\r\n\r\n#toc.sticky .toc-icon{\r\n  visibility: visible;\r\n\/* \ttransition: 0.4s ease; *\/\r\n}\r\n\t\r\n\t.toc-icon{\r\n\t\talign-items: center;\r\n    \tdisplay: flex;\r\n\t}\r\n\t\r\n\tsvg.header-icon{\r\n\/* \t\tbackground-color: #9c171e; *\/\r\n\t\tbackground-color: #FFF;\r\n\t\tborder-radius: 30px;\r\n\t\tpadding: 5px;\r\n\t}\r\n\r\n#toc.sticky .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\t\r\n\t#toc .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\r\n#toc .header.active .toc-icon{\r\n\ttransform: rotate(0deg); \r\n\topacity: 1;\r\n}\r\n\r\n\t#toc .header.active + .list {\r\n\t  max-height: 200px; \/* Adjust this value as needed *\/\r\n\t  opacity: 1;\r\n\t}\r\n\t\r\n\t#placeholder-toc{\r\n\/* \t\tdisplay: none; *\/\r\n\t}\r\n\t\r\n\t@media (min-width: 768px) and (max-width: 991px){\r\n\t\t#toc.sticky{\r\n\/* \t\t\ttop: 104px; *\/\r\n\t\t\tbottom: 0px;\r\n\t\t}\r\n\t\t\r\n\t\t#toc{\r\n\t\t\twidth: unset !important;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@media (max-width: 767px){\r\n\t\t#toc{\r\n\t\t\twidth: 100% !important;\r\n\t\t\tdisplay: inline-block;\r\n\t\t}\r\n\t\t\r\n\t\t#toc.sticky{\r\n\t\t\twidth: 90% !important;\r\n\/* \t\t\ttop: 81px; *\/\r\n\t\t\tbottom: 60px;\r\n\t\t\tmargin-left: auto;\r\n\t\t\tmargin-right: auto;\r\n\t\t\tpadding: 0 16px;\r\n\t\t\tright: 5%;\r\n\t\t}\r\n\t}\r\n\t\r\n\t<\/style>\r\n\r\n<!-- ToC List for mobile -->\r\n<script>\r\n \/\/ Generate TOC based on headings\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  \/\/ Get the element that will contain the TOC\r\n  const tocList = document.getElementById('toc-list');\r\n\r\n  \/\/ Get the element with the ID 'article-left'\r\n  const article = document.querySelector('.td-post-content');\r\n\r\n  \/\/ Find all h2 elements within 'myarticle'\r\n  const headers = article.getElementsByTagName('h2');\r\n\r\n  \/\/ Loop through the h2 elements and create a list item for each one\r\n  for (let i = 0; i < headers.length; i++) {\r\n    const header = headers[i];\r\n    const headerText = header.textContent;\r\n\/\/     const headerId = 'header-' + i;\r\n    const headerId = headerText\r\n    .toLowerCase()\r\n    .trim()\r\n    .replace(\/[^\\w\\s-]\/g, '')  \/\/ hapus tanda baca\r\n    .replace(\/\\s+\/g, '-'); \/\/ ganti spasi jadi \"-\"\r\n\r\n    \/\/ Set an ID for the header if it doesn't have one\r\n    header.setAttribute('id', headerId);\r\n\r\n    \/\/ Create a list item for the TOC\r\n    const listItem = document.createElement('li');\r\n\r\n    \/\/ Create a link for the list item\r\n    const link = document.createElement('a');\r\n    link.setAttribute('href', '#' + headerId);\r\n    link.textContent = headerText;\r\n\r\n    \/\/ Append the link to the list item\r\n    listItem.appendChild(link);\r\n\r\n    \/\/ Append the list item to the TOC list\r\n    tocList.appendChild(listItem);\r\n  }\r\n});\r\n\r\n\/\/ Keep height and placement of content using placeholder in place of TOC\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const placeholderToc = document.querySelector('#placeholder-toc');\r\n\r\n  function setPlaceholderHeight() {\r\n    placeholderToc.style.height = `${toc.offsetHeight}px`;\r\n  }\r\n\r\n  \/\/ Set the initial height of the placeholder\r\n  setPlaceholderHeight();\r\n\r\n  \/\/ Update the height on window resize\r\n  window.addEventListener('resize', setPlaceholderHeight);\r\n});\r\n  const tocTitle = document.querySelector('#toc-title'); \/\/ Assuming header-faq is the element for TOC title\r\n\r\n\/\/ Sticky TOC and update heading\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const footer = document.querySelector('.td-footer-template-wrap');\r\n  const tocParent = toc.parentElement;\r\n  const divTop = tocParent.getBoundingClientRect().top + window.pageYOffset;\r\n  const tocHeight = toc.offsetHeight;\r\n  const triggerPoint = divTop + tocHeight + 700;\r\n  const footerHeight = footer.offsetHeight;\r\n  const triggerFooterPoint = footer.getBoundingClientRect().top + window.pageYOffset - footerHeight - footerHeight - footerHeight;\r\n  const phtoc = document.querySelector('#placeholder-toc');\r\n  const headers = document.querySelectorAll('.td-post-content h2');\r\n  const navLinks = document.querySelectorAll('#toc-list a');\r\n\t\r\n\tconst panel2 = document.querySelector(\"#toc .list\");\r\n\tvar icon = document.querySelector(\".toc-icon\");\r\n\r\n  let activeLink = null; \/\/ Declare activeLink outside the loop\r\n\t\r\n  \/\/ Function to handle scroll and add\/remove .sticky class\r\n  function handleScroll() {\r\n    const windowTop = window.pageYOffset || document.documentElement.scrollTop;\r\n    let currentHeader = '';\r\n\r\n    \/\/ Highlight user progress as the heading comes\r\n    headers.forEach(header => {\r\n\t\tconst headerTop = header.offsetTop;\r\n\t\tconst headerHeight = header.clientHeight;\r\n\t\tif (window.scrollY >= (headerTop - headerHeight + 700)) {\r\n\t\t\tconst currentHeaderId = header.getAttribute('id');\r\n\t\t\tconst currentHeaderText = document.getElementById(currentHeaderId).textContent;\r\n\/\/ \t\t\tconsole.log(\"current header text:\", currentHeaderText);\r\n\t\t\ttocTitle.textContent = currentHeaderText;\r\n\t\t\tcurrentHeader = currentHeaderId;\r\n\t\t\t\r\n\t\t\tif(window.innerWidth < 767){\r\n\t\t\t\ttocTitle.textContent = 'Table of Content';\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n    navLinks.forEach(link => {\r\n      link.classList.remove('active');\r\n      if(currentHeader != '') {\r\n\t\t  if (link.getAttribute('href').includes(currentHeader)) {\r\n\t\t\t  link.classList.add('active');\r\n\t\t  }\r\n\t  }\r\n    });\r\n\/\/     if (windowTop < triggerFooterPoint) {\r\n\/\/         toc.style.display = 'block';\r\n\/\/ \t}else{\r\n\/\/         toc.style.display = 'none';\r\n\/\/ \t}\r\n    \/\/ Update TOC title if sticky\r\n    if (windowTop > triggerPoint) {\r\n      if (!toc.classList.contains('sticky')) {\r\n        phtoc.style.display = \"block\";\r\n        toc.classList.add('sticky');\r\n        toc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n        toc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n        toc.style.backgroundColor = \"#FFF\";\r\n\t\tpanel2.style.height = '0px';\r\n\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\t\t  if(window.innerWidth < 767){\r\n\/\/ \t\t\t  const tocs = document.querySelector('#toc.sticky');\r\n\t\t\t  tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n       \t\t  toc.style.width = '150px'; \/\/ Set width to match the parent element\r\n\t\t  }\r\n      }\r\n      if (currentHeader) {\r\n\/\/         console.log(\"activeLink:\", activeLink);\r\n        if (activeLink) {\r\n\/\/           tocTitle.textContent = activeLink.textContent; \/\/ Update TOC title\r\n          tocTitle.textContent = activeLink ? activeLink.textContent : \"\"; \/\/ Update title only if activeLink exists\r\n        }\r\n      }\r\n    } else {\r\n      toc.classList.remove('sticky');\r\n      phtoc.style.display = \"none\";\r\n      toc.style.width = 'unset'; \/\/ Reset to original width\r\n      toc.style.backgroundColor = \"#FFF\";\r\n      tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n\t\tpanel2.style.height = panel2.scrollHeight + \"px\";\r\n\t\ticon.style.transform = \"rotate(180deg)\";\r\n    }\r\n  }\r\n\r\n    \/\/ Attach the scroll event listener to the window\r\n    window.addEventListener('scroll', handleScroll);\r\n\r\n    \/\/ Initial call to handleScroll to set the correct state on load\r\n    handleScroll();\r\n});\r\n\t\r\n\t\/\/ Open toggle TOC\r\n\t  document.addEventListener(\"DOMContentLoaded\", function() {\r\n\t\tvar tocHeader = document.querySelector(\"#toc .header\");\r\n\t\tvar toc = document.querySelector(\"#toc\");\r\n\t\tvar icon = document.querySelector(\".toc-icon\");\r\n\t\tconst tocTitle = document.querySelector('#toc-title');\r\n\t\tconst tocs = document.querySelector('#toc.sticky');\r\n \t\tconst tocParent = toc.parentElement;\t\t  \r\n\r\n\t\t  tocHeader.addEventListener(\"click\", function() {\r\n\t\t\tvar panel = this.nextElementSibling;\r\n\t\t\tif (panel.style.height !== '0px') { \/\/ Check if height is not 0px\r\n\t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\/\/ \t\t\t\ttoc.style.paddingBottom = '6px'; \r\n\t\t\t\tif(window.innerWidth > 768){\r\n\t\t\t\t\tif(!toc.classList.contains('sticky')){\r\n\t\t\t\t\t\ttoc.style.width = \"unset\";\r\n\/\/ \t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (toc.classList.contains('sticky')){\r\n\t\t\t\t\t\ttoc.style.width = '${tocParent.offsetWidth}px';\r\n\t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(window.innerWidth < 767){\r\n\t\t\t\t\ttoc.style.width = \"unset\"; \/\/ Reset width\r\n\t\t\t\t}\r\n\t\t\t\ttoc.style.backgroundColor = \"#FFF1F1\";\r\n\t\t\t} else {\r\n\t\t\t  panel.style.height = panel.scrollHeight + \"px\";\r\n\t\t\t  icon.style.transform = \"rotate(0deg)\";\r\n\t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\t\t\t  tocTitle.textContent = 'Table of Content'; \/\/ Reset title\r\n\t\t\t\ttoc.style.paddingBottom = '24px';\r\n\t\t\t \tif(window.innerWidth < 767){\r\n\t\t\t\t\ttoc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t  });\r\n\r\n\t\t  \/\/ Close TOC when a link inside it is clicked\r\n\t\t  var tocLinks = document.querySelectorAll(\"#toc .list a\");\r\n\t\t  tocLinks.forEach(function(link) {\r\n\t\t\tlink.addEventListener(\"click\", function() {\r\n\t\t\t  var panel = document.querySelector(\"#toc .list\");\r\n\t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\t\t\t});\r\n\t\t  });\r\n\t\t});\r\n\r\n\r\n\r\n\t\r\n\/\/ \tmake the heading at the center of the viewport\r\n\/\/ \tdocument.addEventListener('DOMContentLoaded', function() {\r\n\/\/     \/\/ Add click event listener to all links in the TOC list\r\n\/\/     document.querySelectorAll('#toc-list a').forEach(anchor => {\r\n\/\/         anchor.addEventListener('click', function (e) {\r\n\/\/             e.preventDefault(); \/\/ Prevent the default behavior of jumping to the anchor\r\n\/\/ \/\/ \t\t\tconsole.log(\"prevent default\");\r\n\/\/             const targetId = this.getAttribute('href').substring(1); \/\/ Get the ID of the target element\r\n\/\/             const targetElement = document.getElementById(targetId); \/\/ Get the target element\r\n\r\n\/\/             if (targetElement) {\r\n\/\/                 const headerHeight = document.querySelector('#toc .header').offsetHeight; \/\/ Get the height of the fixed header\r\n\/\/                 const windowHeight = window.innerHeight; \/\/ Get the height of the viewport\r\n\/\/                 const targetOffset = targetElement.offsetTop; \/\/ Get the top offset of the target element\r\n\/\/                 const scrollTo = targetOffset + (windowHeight \/ 2) + (headerHeight); \/\/ Calculate the scroll position to center the target element\r\n\r\n\/\/                 \/\/ Scroll to the calculated position smoothly\r\n\/\/                 window.scrollTo({\r\n\/\/                     top: scrollTo,\r\n\/\/                     behavior: 'smooth'\r\n\/\/                 });\r\n\/\/             }\r\n\/\/         });\r\n\/\/     });\r\n\/\/ });\r\n<\/script>\r\n\r\n<!-- START script lama -->\r\n<!-- <script>\r\n\/\/ \tvar pilihDaftarIsi = document.getElementById('pilihDaftarIsi');\r\n\t\r\n\/\/ \tdocument.addEventListener('DOMContentLoaded', function() {\r\n\/\/ \t\tvar dropdownFixedTop = document.querySelector('.dropdown-fixed-top');\r\n\r\n\/\/ \t\tdropdownFixedTop.addEventListener('click', function() {\r\n\/\/ \t\t\tvar dropdownContent = this.querySelector('.list_toc');\r\n\/\/ \t\t\tdropdownContent.classList.toggle('show');\r\n\/\/ \t\t});\r\n\r\n\/\/ \t\twindow.addEventListener('click', function(event) {\r\n\/\/ \t\t\tvar listTocTop = document.getElementById('list_toc_top');\r\n\r\n\/\/ \t\t\tif (!dropdownFixedTop.contains(event.target)) {\r\n\/\/ \t\t\t\tlistTocTop.classList.remove('show');\r\n\/\/ \t\t\t}\r\n\/\/ \t\t});\r\n\/\/ \t});\r\n\t\r\n\/\/ \tvar daftarIsiContainer = document.getElementById('toc_group_article');\r\n\/\/ \tvar dropdownFixedTop = document.getElementById('dropdown-fixed-top');\r\n\/\/     var triggered = false; \/\/ Flag to keep track of whether the function has been triggered\r\n\r\n\/\/     window.addEventListener('scroll', function() {\r\n\/\/         if (!triggered && isCompletelyScrolledPast(daftarIsiContainer)) {\r\n\/\/             showSectionDropdownFixedTop(false);\r\n\/\/             triggered = true;\r\n\/\/         } else if (triggered && !isCompletelyScrolledPast(daftarIsiContainer)) {\r\n\/\/             showSectionDropdownFixedTop(true);\r\n\/\/             triggered = false;\r\n\/\/         }\r\n\/\/     });\r\n\r\n\/\/     function isCompletelyScrolledPast(element) {\r\n\/\/         var elementTop = element.getBoundingClientRect().top;\r\n\/\/         var elementBottom = element.getBoundingClientRect().bottom;\r\n\/\/         return elementTop < 0 && elementBottom < 0;\r\n\/\/     }\r\n\r\n\/\/     function showSectionDropdownFixedTop(show) {\r\n\/\/ \t\tif (show) {\r\n\/\/ \t\t\tdropdownFixedTop.classList.remove(\"show\");\r\n\/\/ \t\t} else {\r\n\/\/ \t\t\tdropdownFixedTop.classList.add(\"show\");\r\n\/\/ \t\t}\r\n\/\/     }\r\n<\/script> -->\r\n<!-- <script>\r\n    \/\/ Scrollspy function to highlight the active TOC item based on the scroll position\r\n  function scrollSpy(tocClass) {\r\n    const scrollPosition = window.scrollY;\r\n\r\n    \/\/ Find the active h2 and h3 headings based on their position in the corresponding TOC\r\n    let activeH2 = null;\r\n    let activeH3 = null;\r\n\r\n    const tocItems = document.querySelectorAll(`.${tocClass} li`);\r\n    tocItems.forEach(item => {\r\n      const a = item.querySelector('a');\r\n      if (!a) return;\r\n      const href = a.getAttribute('href');\r\n      const targetId = href.substring(1); \/\/ Remove the '#' from the href to get the target ID\r\n      const targetElement = document.getElementById(targetId);\r\n      if (!targetElement) return;\r\n\r\n      const targetTop = targetElement.getBoundingClientRect().top + scrollPosition;\r\n      const nextItem = item.nextElementSibling;\r\n      const nextTop = nextItem ? nextItem.getBoundingClientRect().top + scrollPosition : Infinity;\r\n\r\n      if (targetTop <= scrollPosition + 150) {\r\n        if (a.parentElement.parentElement === tocItems) {\r\n          \/\/ The h2 heading is at the root level of the TOC\r\n          activeH2 = { id: targetId, level: 'h2' };\r\n        } else {\r\n          \/\/ The h3 heading is nested under an h2 heading\r\n          const parentH2 = a.parentElement.parentElement.previousElementSibling;\r\n          if (parentH2) {\r\n            const h2Link = parentH2.querySelector('a');\r\n            if (h2Link) {\r\n              const h2Href = h2Link.getAttribute('href');\r\n              const h2Id = h2Href.substring(1);\r\n              activeH2 = { id: h2Id, level: 'h2' };\r\n            }\r\n          }\r\n          activeH3 = { id: targetId, level: 'h3' };\r\n        }\r\n      }\r\n\r\n      if (targetTop > scrollPosition + 150 && nextTop > scrollPosition + 150 && !activeH3) {\r\n        \/\/ Reset the activeH2 when there are no more active h3 headings\r\n        activeH2 = null;\r\n      }\r\n    });\r\n\r\n    \/\/ Update the active state for the TOC items\r\n    tocItems.forEach(item => {\r\n      item.classList.remove('active');\r\n      const a = item.querySelector('a');\r\n      if (a) {\r\n        const href = a.getAttribute('href');\r\n        const targetId = href.substring(1);\r\n        if ((activeH2 && activeH2.id === targetId) || (activeH3 && activeH3.id === targetId)) {\r\n          item.classList.add('active');\r\n\t\t  pilihDaftarIsi.innerHTML = a.textContent;\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Call scrollSpy for each TOC on window scroll\r\n  const tocClasses = ['list_toc', 'list_toc_float', 'list_toc_top']; \/\/ Add other TOC class names here if you have more than two instances\r\n  tocClasses.forEach(tocClass => {\r\n    window.addEventListener('scroll', () => scrollSpy(tocClass));\r\n  });\r\n<\/script> -->\r\n<!-- END script lama -->\r\n\t\r\n<script>\r\n    \/\/ Scrollspy function to highlight the active TOC item based on the scroll position\r\n  function scrollSpy(tocClass) {\r\n    const scrollPosition = window.scrollY;\r\n\r\n    \/\/ Find the active h2 and h3 headings based on their position in the corresponding TOC\r\n    let activeH2 = null;\r\n    let activeH3 = null;\r\n\r\n    const tocItems = document.querySelectorAll(`.${tocClass} li`);\r\n    tocItems.forEach(item => {\r\n      const a = item.querySelector('a');\r\n      if (!a) return;\r\n      const href = a.getAttribute('href');\r\n      const targetId = href.substring(1); \/\/ Remove the '#' from the href to get the target ID\r\n      const targetElement = document.getElementById(targetId);\r\n      if (!targetElement) return;\r\n\r\n      const targetTop = targetElement.getBoundingClientRect().top + scrollPosition;\r\n      const nextItem = item.nextElementSibling;\r\n      const nextTop = nextItem ? nextItem.getBoundingClientRect().top + scrollPosition : Infinity;\r\n\r\n      if (targetTop <= scrollPosition + 150) {\r\n        if (a.parentElement.parentElement === tocItems) {\r\n          \/\/ The h2 heading is at the root level of the TOC\r\n          activeH2 = { id: targetId, level: 'h2' };\r\n        } else {\r\n          \/\/ The h3 heading is nested under an h2 heading\r\n          const parentH2 = a.parentElement.parentElement.previousElementSibling;\r\n          if (parentH2) {\r\n            const h2Link = parentH2.querySelector('a');\r\n            if (h2Link) {\r\n              const h2Href = h2Link.getAttribute('href');\r\n              const h2Id = h2Href.substring(1);\r\n              activeH2 = { id: h2Id, level: 'h2' };\r\n            }\r\n          }\r\n          activeH3 = { id: targetId, level: 'h3' };\r\n        }\r\n      }\r\n\r\n      if (targetTop > scrollPosition + 150 && nextTop > scrollPosition + 150 && !activeH3) {\r\n        \/\/ Reset the activeH2 when there are no more active h3 headings\r\n        activeH2 = null;\r\n      }\r\n    });\r\n\r\n    \/\/ Update the active state for the TOC items\r\n    tocItems.forEach(item => {\r\n      item.classList.remove('active');\r\n      const a = item.querySelector('a');\r\n      if (a) {\r\n        const href = a.getAttribute('href');\r\n        const targetId = href.substring(1);\r\n        if ((activeH2 && activeH2.id === targetId) || (activeH3 && activeH3.id === targetId)) {\r\n          item.classList.add('active');\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Call scrollSpy for each TOC on window scroll\r\n  const tocClasses = ['list_toc', 'list_toc_float']; \/\/ Add other TOC class names here if you have more than two instances\r\n  tocClasses.forEach(tocClass => {\r\n    window.addEventListener('scroll', () => scrollSpy(tocClass));\r\n  });\r\n<\/script>\r\n\t\r\n\r\n<!-- ToC List for desktop side bar, diganti jadi inject by php, di code snippet \"Sidebar Accordion\" -->\r\n<!--  <script>\r\n\tdocument.addEventListener(\"DOMContentLoaded\", function() {\r\nToC List for desktop side bar, diganti jadi inject by php, di code snippet \"Sidebar Accordion\"\r\n        Fungsi untuk mengubah teks menjadi format id\r\n        function formatId(text) {\r\n            return text.trim().replace(\/[^\\w\\d]+\/g, '_');\r\n        }\r\n\r\n        \/\/ Fungsi untuk membuat nested list\r\n        function createNestedList(parentNode, children) {\r\n            if (children.length === 0) return;\r\n\r\n            const nestedUl = document.createElement('ul');\r\n            children.forEach(child => {\r\n                const nestedLi = document.createElement('li');\r\n                const nestedA = document.createElement('a');\r\n                nestedA.textContent = child.title;\r\n                nestedA.href = `#${child.id}`;\r\n                nestedLi.appendChild(nestedA);\r\n                nestedUl.appendChild(nestedLi);\r\n\r\n                if (child.children.length > 0) {\r\n                    createNestedList(nestedLi, child.children);\r\n                }\r\n            });\r\n\r\n            parentNode.appendChild(nestedUl);\r\n        }\r\n\r\n        \/\/ Membuat objek untuk menyimpan daftar h2 dan h3 beserta judulnya\r\n        const headings = [];\r\n\r\n           \/\/ Mengambil semua elemen h2 dan h3\r\n        const elements = document.querySelectorAll('.td-post-content h2');\r\n\t\t\t\/\/, .td-post-content h3\r\n\r\n        elements.forEach(element => {\r\n            if (element.tagName === 'H2') {\r\n                const id = formatId(element.textContent);\r\n                element.id = id;\r\n\t\t\t\tif (element.textContent.toLowerCase() === \"key takeaways\") {return;} \/\/ Kalau Key Takeaways, jangan dimasukin\r\n                headings.push({ level: 'h2', id: id, title: element.textContent, children: [] });\r\n            } else if (element.tagName === 'H3') {\r\n                const id = formatId(element.textContent);\r\n                element.id = id;\r\n                if (headings.length > 0) {\r\n                    headings[headings.length - 1].children.push({ level: 'h3', id: id, title: element.textContent, children: [] });\r\n                }\r\n            }\r\n        });\r\n\r\n        \/\/ Membuat list HTML dari objek headings\r\n        const ul = document.getElementById('list_toc');\r\n        let currentUl = ul;\r\n        headings.forEach(heading => {\r\n            const li = document.createElement('li');\r\n            const a = document.createElement('a');\r\n            a.textContent = heading.title;\r\n            a.href = `#${heading.id}`;\r\n            li.appendChild(a);\r\n\r\n            if (heading.level === 'h2') {\r\n                \/\/ Menyimpan ul saat ini untuk menambahkan nested ul\r\n                currentUl = li;\r\n                ul.appendChild(li);\r\n            } else if (heading.level === 'h3') {\r\n                if (!currentUl.lastElementChild || currentUl.lastElementChild.tagName !== 'UL') {\r\n                    \/\/ Jika belum ada nested ul, buat satu\r\n                    const nestedUl = document.createElement('ul');\r\n                    currentUl.appendChild(nestedUl);\r\n                    currentUl = nestedUl;\r\n                }\r\n                currentUl.appendChild(li);\r\n            }\r\n\r\n            createNestedList(li, heading.children);\r\n        });\r\n\t\tDapatkan elemen ul dengan id 'list_toc_float'\r\nconst ulFloat = document.getElementById('list_toc');\r\nconst ulJourney = document.getElementById('list_journey');\r\n\r\nDapatkan isi (child elements) dari ul dengan id 'list_toc_float'\r\n\tif (ulFloat !== null) {\r\n\t\tconst clonedChildren = ulFloat.cloneNode(true).children;\r\n\t\tconst ulToc = document.getElementById('list_toc_float');\r\n\t\tconst ulTocTop = document.getElementById('list_toc_top');\r\n\t\tif ((ulToc !== null || ulToc !== undefined) && window.innerWidth > 1018){\r\n\t\t\tulToc.append(...clonedChildren);\r\n\t\t} else {\r\n\t\t\tulTocTop.append(...clonedChildren);\r\n\t\t}\r\n\t} \r\n\r\n\tif (ulJourney !== null) {\r\n\t\tconst clonedChildrenJourney = ulJourney.cloneNode(true).children;\r\n\t\tconst ulTocJourney = document.getElementById('list_toc_journey');\r\n\t\tulTocJourney.append(...clonedChildrenJourney);\r\n\t} \r\n\t\r\n        Fungsi untuk mengambil tinggi navbar\r\n        function getNavbarHeight() {\r\n            const navbar = document.getElementById('tdi_34');\r\n            return navbar ? navbar.offsetHeight : 0;\r\n        }\r\n\r\n        \/\/ Fungsi untuk menambahkan offset posisi scroll\r\n        function scrollToElementWithOffset(elementId) {\r\n            const element = document.getElementById(elementId);\r\n            if (element) {\r\n                const offset = getNavbarHeight();\r\n                const elementPosition = element.getBoundingClientRect().top;\r\n                const offsetPosition = elementPosition - offset-40;\r\n\r\n                window.scrollBy({\r\n                    top: offsetPosition,\r\n                    behavior: 'smooth'\r\n                });\r\n            }\r\n        }\r\n\r\n        \/\/ Fungsi untuk menangani klik pada tautan judul\r\n        function handleTitleClick(event) {\r\n            event.preventDefault();\r\n            const href = event.target.getAttribute('href').substr(1);\r\n            scrollToElementWithOffset(href);\r\n        }\r\n\r\n        \/\/ Tambahkan event listener untuk semua tautan judul\r\n        const titleLinks = document.querySelectorAll('a[href^=\"#\"]');\r\n        titleLinks.forEach(link => {\r\n            link.addEventListener('click', handleTitleClick);\r\n        });\r\n\t});\r\n    <\/script> -->\r\n<\/span><\/p>\n<h2 id=\"what-is-predictive-maintenance\"><strong>Understanding Predictive Maintenance<\/strong><\/h2>\n<p data-pm-slice=\"1 1 []\">Predictive maintenance is a maintenance approach that uses continuous condition monitoring to identify early signs of equipment failure. IoT sensors collect real-time data from assets, helping teams respond before breakdowns happen.<\/p>\n<p>Unlike preventive maintenance, which follows fixed schedules, predictive maintenance is based on actual equipment condition. This gives maintenance teams better timing for repairs and helps reduce unnecessary servicing.<\/p>\n<p>Artificial Intelligence and machine learning improve accuracy by analysing historical asset data and detecting abnormal equipment behaviour earlier. Some systems can also estimate Remaining Useful Life (RUL) for critical components.<\/p>\n<p>For asset-intensive industries operating in remote or high-risk environments, predictive maintenance helps reduce mechanical risk and improve maintenance planning. With clearer visibility into equipment condition, maintenance teams can respond earlier and avoid unnecessary operational disruptions.<\/p>\n<h2 id=\"key-benefits-of-predictive-maintenance\"><strong>Key Benefits of Predictive Maintenance<\/strong><\/h2>\n<p data-start=\"0\" data-end=\"249\">Predictive maintenance can improve both operational performance and maintenance cost control when supported by reliable monitoring and asset data. The benefits below are among the most common reasons businesses adopt predictive maintenance programs.<\/p>\n<ul>\n<li><strong data-start=\"415\" data-end=\"445\">Reduced unplanned downtime<\/strong><br data-start=\"445\" data-end=\"448\" \/>Continuous monitoring helps maintenance teams detect abnormal equipment behaviour before failures interrupt production. Earlier intervention also reduces the likelihood of sudden breakdowns during critical operations.<\/li>\n<li data-start=\"602\" data-end=\"797\">\n<p data-start=\"604\" data-end=\"797\"><strong data-start=\"604\" data-end=\"645\">Lower maintenance and operating costs<\/strong><br data-start=\"645\" data-end=\"648\" \/>Predictive maintenance reduces unnecessary servicing and helps businesses avoid costly emergency repairs. Many companies also spend less on overtime labour and urgent spare part purchases.<\/p>\n<\/li>\n<li data-start=\"799\" data-end=\"1003\">\n<p data-start=\"801\" data-end=\"1003\"><strong data-start=\"801\" data-end=\"828\">Extended asset lifespan<\/strong><br data-start=\"828\" data-end=\"831\" \/>Issues such as overheating, vibration, or poor lubrication can be identified earlier before they cause severe equipment damage. This helps businesses improve <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/asset-lifecycle-management\/\" target=\"_blank\" rel=\"noopener\">asset lifecycle control<\/a> and keep critical equipment operating more reliably over longer periods.<\/p>\n<\/li>\n<li data-start=\"1005\" data-end=\"1198\">\n<p data-start=\"1007\" data-end=\"1198\"><strong data-start=\"1007\" data-end=\"1036\">Improved workplace safety<\/strong><br data-start=\"1036\" data-end=\"1039\" \/>Unexpected equipment failures can create serious safety risks in industrial environments. Predictive alerts allow maintenance teams to plan repairs more safely and under controlled conditions.<\/p>\n<\/li>\n<li data-start=\"1200\" data-end=\"1420\">\n<p data-start=\"1202\" data-end=\"1420\"><strong data-start=\"1202\" data-end=\"1247\">Better spare parts and inventory planning<\/strong><br data-start=\"1247\" data-end=\"1250\" \/>Advance warning of potential failures gives procurement and maintenance teams more time to prepare spare parts. This reduces excess inventory while improving parts availability when repairs are needed.<\/p>\n<\/li>\n<li data-start=\"1422\" data-end=\"1635\">\n<p data-start=\"1424\" data-end=\"1635\"><strong data-start=\"1424\" data-end=\"1481\">Higher production reliability and service consistency<\/strong><br data-start=\"1481\" data-end=\"1484\" \/>More reliable equipment performance makes production schedules easier to maintain and reduces unexpected interruptions on the floor. Consistent output also supports delivery reliability and customer expectations.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"how-to-implement-predictive-maintenance-successfully\"><strong>How to Implement Predictive Maintenance Successfully<\/strong><\/h2>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-837\" src=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625.webp\" alt=\"Predictive maintenance implementation framework for industrial operations\" width=\"1280\" height=\"634\" srcset=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625.webp 1280w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-300x149.webp 300w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-1024x507.webp 1024w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-768x380.webp 768w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-848x420.webp 848w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-150x74.webp 150w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-696x345.webp 696w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-1068x529.webp 1068w, https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-implementation-framework-e1772087502625-324x160.webp 324w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/p>\n<p data-start=\"3861\" data-end=\"4030\">Implementing predictive maintenance involves more than simply installing sensors. Businesses also need reliable data, clear asset priorities, and maintenance processes that support long-term adoption.<\/p>\n<p>Most companies begin with a small pilot before expanding across larger operations. This phased rollout helps teams validate data quality, adjust alert settings, and build confidence in the system.<\/p>\n<h3><strong>1. Assess readiness and prioritise critical assets<\/strong><\/h3>\n<p>The first step is assessing maintenance maturity, available asset data, and existing IT infrastructure. Instead of monitoring every asset immediately, businesses usually prioritise equipment based on production impact, safety risk, and failure cost.<\/p>\n<p>Critical or failure-prone equipment is often selected for the initial rollout. Clear KPIs such as reducing downtime or improving MTBF should also be defined early in the process.<\/p>\n<h3><strong>2. Deploy sensors and integrate data sources<\/strong><\/h3>\n<p>After identifying priority assets, businesses can install IIoT sensors such as vibration, thermal, or ultrasonic devices at key monitoring points. Sensor placement matters because poor positioning can create inaccurate readings.<\/p>\n<p>Sensor data should connect directly with CMMS or EAM platforms to centralise monitoring and maintenance records. Some businesses also use edge computing to process data locally in remote environments.<\/p>\n\r\n    <div class=\"hashy-banner-wrap\" data-catimg=\"Inventory\">\r\n        <a class=\"hashy-banner-link\" href=\"https:\/\/www.hashmicro.com\/au\/free-product-tour\/?medium=moneysite-banner&promocampaign=hashy-ai\" target=\"_blank\" rel=\"noopener\" aria-label=\"See It Live\">\r\n        <div class=\"hashy-banner-frame\">\r\n            <div class=\"hashy-banner-stage\">\r\n                <!-- Background stack -->\r\n                <div class=\"hashy-card-bg\" aria-hidden=\"true\">\r\n                    <span class=\"hashy-card-bg-fill\"><\/span>\r\n                    <img decoding=\"async\" class=\"hashy-card-bg-stars\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/banner-bg-texture.webp\" alt=\"\" loading=\"lazy\" aria-hidden=\"true\">\r\n                    <img decoding=\"async\" class=\"hashy-card-bg-light\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/banner-light-beam-787912.webp\" alt=\"\" loading=\"lazy\" aria-hidden=\"true\">\r\n                    <span class=\"hashy-card-bg-glow\"><\/span>\r\n                <\/div>\r\n\r\n                <!-- Sparkle decorations -->\r\n                <span class=\"hashy-card-deco hashy-card-deco-1\" aria-hidden=\"true\">\r\n                    <svg viewBox=\"0 0 121 35\" preserveAspectRatio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\r\n                        <g opacity=\".48\" filter=\"url(#hcd1)\"><rect width=\"102\" height=\"24\" transform=\"matrix(-1.006 0 0 1.006 115.66 5.34)\" fill=\"url(#hcd1g)\"\/><\/g>\r\n                        <path d=\"M15.27 9.03 13.35 4.34l-1.92 4.69a13.2 13.2 0 0 1-6.77 6.61L0 17.56l4.66 1.88a13.2 13.2 0 0 1 6.77 6.81l1.92 4.66 1.92-4.66a13.2 13.2 0 0 1 6.77-6.81l4.66-1.88-4.66-1.92a13.2 13.2 0 0 1-6.77-6.61z\" fill=\"#fff\"\/>\r\n                        <defs>\r\n                            <filter id=\"hcd1\" x=\"7.7\" y=\"0\" width=\"113.27\" height=\"34.82\" filterUnits=\"userSpaceOnUse\"><feGaussianBlur stdDeviation=\"2.66\"\/><\/filter>\r\n                            <linearGradient id=\"hcd1g\" x1=\"175.31\" y1=\"12\" x2=\"0\" y2=\"12\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#fff\"\/><stop offset=\"1\" stop-color=\"#0B0B0F\"\/><\/linearGradient>\r\n                        <\/defs>\r\n                    <\/svg>\r\n                <\/span>\r\n                <span class=\"hashy-card-deco hashy-card-deco-2\" aria-hidden=\"true\">\r\n                    <svg viewBox=\"0 0 121 35\" preserveAspectRatio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\r\n                        <g opacity=\".48\" filter=\"url(#hcd2)\"><rect x=\"5.34\" y=\"5.34\" width=\"102.59\" height=\"24.14\" fill=\"url(#hcd2g)\"\/><\/g>\r\n                        <path d=\"M105.73 9.03 107.65 4.34l1.92 4.69a13.2 13.2 0 0 0 6.77 6.61L121 17.56l-4.66 1.88a13.2 13.2 0 0 0-6.77 6.81l-1.92 4.66-1.92-4.66a13.2 13.2 0 0 0-6.77-6.81l-4.66-1.88 4.66-1.92a13.2 13.2 0 0 0 6.77-6.61z\" fill=\"#fff\"\/>\r\n                        <defs>\r\n                            <filter id=\"hcd2\" x=\"0\" y=\"0\" width=\"113.27\" height=\"34.82\" filterUnits=\"userSpaceOnUse\"><feGaussianBlur stdDeviation=\"2.66\"\/><\/filter>\r\n                            <linearGradient id=\"hcd2g\" x1=\"181.66\" y1=\"17.47\" x2=\"5.34\" y2=\"17.47\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#fff\"\/><stop offset=\"1\" stop-color=\"#232126\"\/><\/linearGradient>\r\n                        <\/defs>\r\n                    <\/svg>\r\n                <\/span>\r\n                <span class=\"hashy-card-deco hashy-card-deco-3\" aria-hidden=\"true\">\r\n                    <svg viewBox=\"0 0 35 95\" preserveAspectRatio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\r\n                        <g opacity=\".48\" filter=\"url(#hcd3)\"><rect x=\"29.52\" y=\"5.35\" width=\"76.56\" height=\"24.18\" transform=\"rotate(90 29.52 5.35)\" fill=\"url(#hcd3g)\"\/><\/g>\r\n                        <path d=\"M26.26 79.7 30.96 81.63 26.26 83.55a8.7 8.7 0 0 0-6.62 6.78L17.72 95l-1.89-4.67a8.7 8.7 0 0 0-4.72-4.62L4.34 81.63 9.01 79.7a8.7 8.7 0 0 0 4.72-4.62l1.89-4.67 1.92 4.67a8.7 8.7 0 0 0 6.62 6.78z\" fill=\"#fff\"\/>\r\n                        <defs>\r\n                            <filter id=\"hcd3\" x=\"0\" y=\"0\" width=\"34.88\" height=\"87.26\" filterUnits=\"userSpaceOnUse\"><feGaussianBlur stdDeviation=\"2.66\"\/><\/filter>\r\n                            <linearGradient id=\"hcd3g\" x1=\"161.1\" y1=\"17.5\" x2=\"29.52\" y2=\"17.5\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#fff\"\/><stop offset=\"1\" stop-color=\"#232126\"\/><\/linearGradient>\r\n                        <\/defs>\r\n                    <\/svg>\r\n                <\/span>\r\n\r\n                <div class=\"hashy-card-inner\">\r\n                    <!-- Left column: logo + headline + CTA -->\r\n                    <div class=\"hashy-card-left\">\r\n                        <img decoding=\"async\" class=\"hashy-card-logo\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/hashmicro-logo-f0090c.webp\" alt=\"HashMicro\" width=\"240\" height=\"32\" loading=\"lazy\">\r\n                        <div class=\"hashy-card-text-block\">\r\n                            <p class=\"hashy-card-title\"><span class=\"hashy-fg-grad\">Hashy AI<\/span> reorders the right stock before you even notice<\/p>\r\n                            <span class=\"hashy-card-cta\">\r\n                                <span class=\"hashy-card-cta-label\">See It Live<\/span>\r\n                                <span class=\"hashy-card-cta-spark\" aria-hidden=\"true\">\r\n                                    <svg viewBox=\"0 0 20 21\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"21\">\r\n                                        <path d=\"M6.87 6.43 8.02 3.62l1.14 2.81a7 7 0 0 0 4.07 4.07l2.8 1.14-2.8 1.14a7 7 0 0 0-4.07 4.07l-1.14 2.81-1.14-2.81A7 7 0 0 0 2.8 12.78L0 11.64l2.8-1.14a7 7 0 0 0 4.07-4.07z\" fill=\"#fff\"\/>\r\n                                        <path d=\"m15.1 1.5.61-1.5.61 1.5a3.7 3.7 0 0 0 2.07 2.18l1.5.61-1.5.61a3.7 3.7 0 0 0-2.07 2.18l-.61 1.5-.61-1.5a3.7 3.7 0 0 0-2.07-2.18l-1.5-.61 1.5-.61A3.7 3.7 0 0 0 15.1 1.5z\" fill=\"#fff\"\/>\r\n                                        <path d=\"m14.66 15.76.4-.98.4.98a2.4 2.4 0 0 0 1.42 1.42l.98.4-.98.4a2.4 2.4 0 0 0-1.42 1.42l-.4.98-.4-.98a2.4 2.4 0 0 0-1.42-1.42l-.98-.4.98-.4a2.4 2.4 0 0 0 1.42-1.42z\" fill=\"#fff\"\/>\r\n                                    <\/svg>\r\n                                <\/span>\r\n                            <\/span>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <!-- Right column: mascot + chat window -->\r\n                    <div class=\"hashy-card-right\" aria-hidden=\"true\">\r\n                        <img decoding=\"async\" class=\"hashy-card-mascot\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/hashy-mascot-af02ad.webp\" alt=\"\" width=\"128\" height=\"194\" loading=\"lazy\">\r\n                        <div class=\"hashy-card-chat-window\">\r\n                            <div class=\"hashy-card-chat-header\">\r\n                                <div class=\"hashy-card-chat-id\">\r\n                                    <div class=\"hashy-card-chat-avatar\">\r\n                                        <img decoding=\"async\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hashy.webp\" alt=\"\" width=\"36\" height=\"36\" loading=\"lazy\">\r\n                                    <\/div>\r\n                                    <div class=\"hashy-card-chat-meta\">\r\n                                        <p class=\"hashy-card-chat-name\">Hashy AI<\/p>\r\n                                        <p class=\"hashy-card-chat-role\">Your AI Assistant<\/p>\r\n                                    <\/div>\r\n                                <\/div>\r\n                                <div class=\"hashy-card-chat-dots\" aria-hidden=\"true\">\r\n                                    <span><\/span><span><\/span><span><\/span>\r\n                                <\/div>\r\n                            <\/div>\r\n                            <div class=\"hashy-card-chat-body\">\r\n                                <div class=\"hashy-card-chat-stream\"\r\n                                     data-avatar-hashy=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hashy.webp\"\r\n                                     data-avatar-user=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hannah.webp\">\r\n                                <!-- 1. Hashy: Low Stock Warning card (Light Switch W324) -->\r\n                                <div class=\"hashy-msg is-incoming\" data-step=\"1\">\r\n                                    <img decoding=\"async\" class=\"hashy-msg-avatar\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hashy.webp\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\r\n                                    <div class=\"hashy-bubble hashy-bubble-white hashy-bubble-card\">\r\n                                        <div class=\"hashy-stock-card\">\r\n                                            <div class=\"hashy-stock-head\">\r\n                                                <span>Low Stock Warning<\/span>\r\n                                                <svg class=\"hashy-warn-icon\" viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.43 8.97C6.86 4.66 8.07 2.5 10 2.5s3.14 2.16 5.57 6.47l.3.54c2.02 3.58 3.03 5.37 2.12 6.68-.91 1.31-3.17 1.31-7.69 1.31H9.7c-4.52 0-6.78 0-7.69-1.31-.92-1.31.09-3.1 2.11-6.68l.3-.54zM10 6.04a.62.62 0 0 1 .62.63v4.16a.62.62 0 0 1-1.25 0V6.67a.62.62 0 0 1 .63-.63zm0 8.13a.83.83 0 1 0 0-1.67.83.83 0 0 0 0 1.67z\" fill=\"#BD1E2D\"\/><\/svg>\r\n                                            <\/div>\r\n                                            <div class=\"hashy-stock-divider\"><\/div>\r\n                                            <div class=\"hashy-stock-row\">\r\n                                                <div class=\"hashy-stock-thumb\">\r\n                                                    <img decoding=\"async\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/product-lightswitch.webp\" alt=\"\" loading=\"lazy\">\r\n                                                <\/div>\r\n                                                <div class=\"hashy-stock-info\">\r\n                                                    <p class=\"hashy-stock-name\">Light Switch W324<\/p>\r\n                                                    <p class=\"hashy-stock-sku\">LS-2852<\/p>\r\n                                                    <span class=\"hashy-stock-pill hashy-stock-pill-ok\">Last Updated: 2 Seconds Ago<\/span>\r\n                                                <\/div>\r\n                                            <\/div>\r\n                                            <div class=\"hashy-stock-progress\">\r\n                                                <div class=\"hashy-stock-bar\"><span style=\"width:20%\"><\/span><\/div>\r\n                                                <span class=\"hashy-stock-pill hashy-stock-pill-low\">92 pcs<\/span>\r\n                                            <\/div>\r\n                                        <\/div>\r\n                                    <\/div>\r\n                                <\/div>\r\n                                <!-- 2. Projection -->\r\n                                <div class=\"hashy-msg is-incoming hashy-msg-narrow\" data-step=\"2\">\r\n                                    <img decoding=\"async\" class=\"hashy-msg-avatar\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hashy.webp\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\r\n                                    <div class=\"hashy-bubble hashy-bubble-white\"><span class=\"hashy-text-purple\"><strong>Light Switch W324<\/strong><\/span> is projected to run out in 3 days.<\/div>\r\n                                <\/div>\r\n                                <!-- 3. PO draft prepared + document card -->\r\n                                <div class=\"hashy-msg is-incoming hashy-msg-narrow\" data-step=\"3\">\r\n                                    <img decoding=\"async\" class=\"hashy-msg-avatar\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hashy.webp\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\r\n                                    <div class=\"hashy-bubble hashy-bubble-white hashy-bubble-card hashy-bubble-doc\">\r\n                                        <div class=\"hashy-doc-tag\">\r\n                                            <svg viewBox=\"0 0 15 15\" width=\"15\" height=\"15\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 7.5A7.5 7.5 0 1 1 0 7.5a7.5 7.5 0 0 1 15 0zm-4.48-2.27a.55.55 0 0 1 0 .8L6.77 9.77a.55.55 0 0 1-.8 0l-1.5-1.5a.55.55 0 0 1 .8-.8l1.1 1.1 3.36-3.34a.55.55 0 0 1 .79 0z\" fill=\"#2FB71C\"\/><\/svg>\r\n                                            <p><span class=\"hashy-text-purple\"><strong>Purchase order<\/strong><\/span> draft prepared<\/p>\r\n                                        <\/div>\r\n                                        \r\n                                        <div class=\"hashy-doc-card\">\r\n                                            <div class=\"hashy-doc-preview\">\r\n                                                <div class=\"hashy-doc-head\">\r\n                                                    <div class=\"hashy-doc-head-text\">\r\n                                                        <p class=\"hashy-doc-title\">Purchase order<\/p>\r\n                                                        <p class=\"hashy-doc-num\">Purchase order Number #PO-3162-01<\/p>\r\n                                                    <\/div>\r\n                                                    <img decoding=\"async\" class=\"hashy-doc-logo\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/doc-logo-inventory.webp\" alt=\"\" loading=\"lazy\">\r\n                                                <\/div>\r\n                                                <div class=\"hashy-doc-divider\"><\/div>\r\n                                                <div class=\"hashy-doc-fromto\">\r\n                                                    <div>\r\n                                                        <p class=\"hashy-doc-label\">From:<\/p>\r\n                                                        <p class=\"hashy-doc-co\">TerraCore Materials<\/p>\r\n                                                        <p class=\"hashy-doc-addr\">789 Enterprise Avenue, Floor 2,<br>Metropolis, Stockholm<\/p>\r\n                                                    <\/div>\r\n                                                    <div>\r\n                                                        <p class=\"hashy-doc-label\">to:<\/p>\r\n                                                        <p class=\"hashy-doc-co\">Buildronix Materials<\/p>\r\n                                                        <p class=\"hashy-doc-addr\">45 Evergreen Lane, Suite 102,<br>Brookfield, NY, 11234<\/p>\r\n                                                    <\/div>\r\n                                                <\/div>\r\n                                            <\/div>\r\n                                            <div class=\"hashy-doc-attach\">\r\n                                                <span class=\"hashy-doc-pdf-badge\" aria-hidden=\"true\">\r\n                                                    <svg viewBox=\"0 0 20 25\" width=\"20\" height=\"25\"><path d=\"M2 0h12l4 5v18a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2z\" fill=\"#E5252A\"\/><path d=\"M14 0v5h4z\" fill=\"#FF5757\"\/><text x=\"4\" y=\"22\" font-family=\"Arial,sans-serif\" font-weight=\"700\" font-size=\"6\" fill=\"#fff\">PDF<\/text><\/svg>\r\n                                                <\/span>\r\n                                                <div class=\"hashy-doc-attach-meta\">\r\n                                                    <p class=\"hashy-doc-file\">Purchase order [21\/04\/2026].pdf<\/p>\r\n                                                    <p class=\"hashy-doc-size\">1MB, PDF File<\/p>\r\n                                                <\/div>\r\n                                            <\/div>\r\n                                            <span class=\"hashy-doc-cta\">View Document<\/span>\r\n                                        <\/div>\r\n                                    <\/div>\r\n                                <\/div>\r\n                                <!-- 4. User question (right) -->\r\n                                <div class=\"hashy-msg is-outgoing\" data-step=\"4\">\r\n                                    <div class=\"hashy-bubble hashy-bubble-purple\">Is the quantity <strong>already optimized?<\/strong><\/div>\r\n                                    <img decoding=\"async\" class=\"hashy-msg-avatar hashy-msg-avatar-bordered\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hannah.webp\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\r\n                                <\/div>\r\n                                <!-- 5. Hashy answer -->\r\n                                <div class=\"hashy-msg is-incoming hashy-msg-narrow\" data-step=\"5\">\r\n                                    <img decoding=\"async\" class=\"hashy-msg-avatar\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hashy.webp\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\r\n                                    <div class=\"hashy-bubble hashy-bubble-white\">Yes, based on <span class=\"hashy-text-purple\"><strong>demand trend &amp; lead time.<\/strong><\/span><\/div>\r\n                                <\/div>\r\n                                <!-- 6. User approval (right) -->\r\n                                <div class=\"hashy-msg is-outgoing\" data-step=\"6\">\r\n                                    <div class=\"hashy-bubble hashy-bubble-purple\">Approved. Please<strong> inform the supplier.<\/strong><\/div>\r\n                                    <img decoding=\"async\" class=\"hashy-msg-avatar hashy-msg-avatar-bordered\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hannah.webp\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\r\n                                <\/div>\r\n                                <!-- 7. RFQ confirmation -->\r\n                                <div class=\"hashy-msg is-incoming hashy-msg-narrow\" data-step=\"7\">\r\n                                    <img decoding=\"async\" class=\"hashy-msg-avatar\" src=\"https:\/\/www.hashmicro.com\/assets\/images\/hashy-ai-banner\/figma\/avatar-hashy.webp\" alt=\"\" width=\"40\" height=\"40\" loading=\"lazy\">\r\n                                    <div class=\"hashy-bubble hashy-bubble-white\">\r\n                                        <span class=\"hashy-inline-icon\">\r\n                                            <svg viewBox=\"0 0 18 18\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.5 9A7.5 7.5 0 1 1 1.5 9a7.5 7.5 0 0 1 15 0zm-4.48-2.27a.55.55 0 0 1 0 .8L8.27 11.27a.55.55 0 0 1-.8 0l-1.5-1.5a.55.55 0 0 1 .8-.8l1.1 1.1 3.4-3.34a.55.55 0 0 1 .76 0z\" fill=\"#2FB71C\"\/><\/svg>\r\n                                        <\/span>\r\n                                        Request for Quotation is <span class=\"hashy-text-purple\"><strong>sent to 15 vendors.<\/strong><\/span>\r\n                                    <\/div>\r\n                                <\/div><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n        <\/a>\r\n    <\/div>\r\n\r\n    <style>\r\n        \/* ============================================================\r\n         * Hashy banner \u2014 Figma 5181:2678 (1440 \u00d7 508). Stage rendered\r\n         * at exact Figma px values; outer wrapper scales it to fit any\r\n         * body-post container width via container queries.\r\n         * ============================================================ *\/\r\n        .hashy-banner-wrap {\r\n            container-type: inline-size !important;\r\n            container-name: hashybnr !important;\r\n            position: relative !important;\r\n            display: block !important;\r\n            width: 100% !important;\r\n            max-width: 860px !important;        \/* locks the banner at the \"wider\r\n                                        blog 860px\" preview proportions\r\n                                        regardless of body-post width *\/\r\n            margin: 16px auto !important;\r\n            font-family: Poppins, \"Helvetica Neue\", Arial, sans-serif !important;\r\n        }\r\n\r\n        \/* Whole-banner link \u2014 wraps the entire frame so any click on the\r\n           card (background, mascot, chat preview) routes to the CTA URL.\r\n           The inner CTA is now a non-anchor span styled as a button. *\/\r\n        .hashy-banner-link {\r\n            display: block !important;\r\n            color: inherit !important;\r\n            text-decoration: none !important;\r\n            cursor: pointer !important;\r\n        }\r\n\r\n        .hashy-banner-frame {\r\n            position: relative !important;\r\n            width: 100% !important;\r\n            aspect-ratio: 1440 \/ 508 !important;\r\n            border-radius: 16px !important;\r\n            overflow: hidden !important;\r\n            background: #111 !important;\r\n            box-shadow: 0 12px 40px rgba(0, 0, 0, .35) !important;\r\n        }\r\n\r\n        \/* The stage is rendered at the exact Figma frame size. The\r\n           transform: scale() shrinks it proportionally to fit the\r\n           container while preserving every pixel-level token.\r\n           tan(atan2(y, x)) is the standard CSS trig trick to turn the\r\n           length ratio (100cqw \/ 1440px) into a unitless number that\r\n           scale() will accept. *\/\r\n        .hashy-banner-stage {\r\n            position: absolute !important;\r\n            top: 0 !important; left: 0 !important;\r\n            width: 1440px !important;\r\n            height: 508px !important;\r\n            transform-origin: top left !important;\r\n            transform: scale(tan(atan2(100cqw, 1440px))) !important;\r\n        }\r\n        \/* Fallback for browsers without CSS Trig support (pre-2023): the\r\n           stage simply renders left-aligned at design size with overflow\r\n           clipped, which is still readable. *\/\r\n        @supports not (transform: scale(tan(atan2(1px, 1px)))) {\r\n            .hashy-banner-stage { transform: none !important; }\r\n        }\r\n        .hashy-banner-stage * { box-sizing: border-box !important; }\r\n        \/* Defensive overrides \u2014 Hashmicro WP theme rules like\r\n           `.tagdiv-type img { margin-bottom: 21px }` (specificity 0,1,1)\r\n           push our avatars \/ mascot \/ logo out of alignment. Selectors\r\n           below repeat the wrapper class so specificity is (0,2,1) and\r\n           wins regardless of theme load order. *\/\r\n        .hashy-banner-wrap.hashy-banner-wrap img,\r\n        .hashy-banner-stage.hashy-banner-stage img {\r\n            margin: 0 !important;\r\n            padding: 0 !important;\r\n            border: 0 !important;\r\n            max-width: none !important;\r\n            background: transparent !important;\r\n            vertical-align: middle !important;\r\n            box-shadow: none !important;\r\n        }\r\n        .hashy-banner-wrap.hashy-banner-wrap p,\r\n        .hashy-banner-wrap.hashy-banner-wrap h1, .hashy-banner-wrap.hashy-banner-wrap h2,\r\n        .hashy-banner-wrap.hashy-banner-wrap h3, .hashy-banner-wrap.hashy-banner-wrap h4,\r\n        .hashy-banner-wrap.hashy-banner-wrap h5, .hashy-banner-wrap.hashy-banner-wrap h6 {\r\n            margin: 0 !important;\r\n            padding: 0 !important;\r\n            text-indent: 0 !important;\r\n            background: transparent !important;\r\n        }\r\n        .hashy-banner-wrap.hashy-banner-wrap a { text-decoration: none !important; }\r\n\r\n        \/* \u2500\u2500 Background layers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        .hashy-card-bg {\r\n            position: absolute !important; inset: 0 !important;\r\n            border-radius: 16px !important;\r\n            overflow: hidden !important;\r\n            pointer-events: none !important;\r\n            z-index: 0 !important;\r\n        }\r\n        .hashy-card-bg-fill { position: absolute !important; inset: 0 !important; background: #111 !important; }\r\n        .hashy-card-bg-stars {\r\n            position: absolute !important; inset: 0 !important;\r\n            width: 100% !important; height: 100% !important;\r\n            object-fit: cover !important;\r\n            mix-blend-mode: screen !important;\r\n            opacity: .56 !important;\r\n        }\r\n        .hashy-card-bg-light {\r\n            position: absolute !important;\r\n            inset: -6px 0 auto 0 !important;\r\n            width: 100% !important;\r\n            height: calc(100% + 12px) !important;\r\n            object-fit: cover !important;\r\n            mix-blend-mode: plus-lighter !important;\r\n            opacity: .54 !important;\r\n            filter: blur(16px) !important;\r\n        }\r\n        .hashy-card-bg-glow {\r\n            position: absolute !important;\r\n            left: calc(50% - 480px) !important;\r\n            bottom: -110px !important;\r\n            width: 961px !important;\r\n            height: 222px !important;\r\n            border-radius: 50% !important;\r\n            background: radial-gradient(ellipse 480px 111px at center, rgba(160,102,242,1) 0%, rgba(77,77,77,0) 100%) !important;\r\n            filter: blur(80px) !important;\r\n            opacity: .8 !important;\r\n            pointer-events: none !important;\r\n        }\r\n\r\n        \/* \u2500\u2500 Sparkle decorations (Figma px positions) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        .hashy-card-deco {\r\n            position: absolute !important;\r\n            display: block !important;\r\n            pointer-events: none !important;\r\n            z-index: 1 !important;\r\n            animation: hashyDecoFloat 4s ease-in-out infinite !important;\r\n        }\r\n        .hashy-card-deco svg { width: 100% !important; height: 100% !important; display: block !important; }\r\n        .hashy-card-deco-1 { left: 334px !important; top: 399px !important; width: 121px !important; height: 35px !important; }\r\n        .hashy-card-deco-2 { left: 615px !important; top: 72px !important;  width: 121px !important; height: 35px !important; animation-delay: 1.3s !important; }\r\n        .hashy-card-deco-3 { right: 50.57px !important; top: -6px !important; width: 35px !important;  height: 95px !important; animation-delay: 2.4s !important; }\r\n        @keyframes hashyDecoFloat {\r\n            0%, 100% { transform: translateY(0)    scale(1);    opacity: .9; }\r\n            50%      { transform: translateY(-3px) scale(1.05); opacity: 1;  }\r\n        }\r\n\r\n        \/* \u2500\u2500 Inner row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        .hashy-card-inner {\r\n            position: relative !important;\r\n            z-index: 2 !important;\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            justify-content: space-between !important;\r\n            gap: 48px !important;\r\n            padding: 64px 70px !important;\r\n            height: 100% !important;\r\n        }\r\n\r\n        \/* \u2500\u2500 Left column \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        .hashy-card-left {\r\n            flex: 0 0 auto !important;\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            align-items: flex-start !important;\r\n            gap: 32px !important;             \/* logo\u2192text tightened from 64 *\/\r\n            max-width: 660px !important;      \/* fits the longer Accounting copy on 3 lines *\/\r\n        }\r\n        .hashy-card-logo {\r\n            display: block !important;\r\n            height: 31.28px !important;\r\n            width: auto !important;\r\n        }\r\n        .hashy-card-text-block {\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            align-items: flex-start !important;\r\n            gap: 32px !important;             \/* text\u2192button tightened from 56,\r\n                                                 brings CTA up + farther from\r\n                                                 banner bottom edge *\/\r\n        }\r\n        .hashy-card-title {\r\n            margin: 0 !important;\r\n            font-family: Poppins, \"Helvetica Neue\", Arial, sans-serif !important;\r\n            font-weight: 600 !important;\r\n            font-size: 46px !important;\r\n            line-height: 1.25 !important;\r\n            color: #fff !important;\r\n            letter-spacing: -0.005em !important;\r\n            max-width: 660px !important;      \/* match left-column widening *\/\r\n        }\r\n        .hashy-banner-stage .hashy-fg-grad {\r\n            display: inline-block !important;\r\n            background: linear-gradient(65deg, #8839E7 0%, #E391F4 74%, #8839E7 100%) !important;\r\n            -webkit-background-clip: text !important;\r\n            background-clip: text !important;\r\n            -webkit-text-fill-color: transparent !important;\r\n            color: transparent !important;\r\n            font-weight: 700 !important;\r\n        }\r\n\r\n        \/* CTA \u2014 bumped up from Figma (14\u00d748 \/ 20px) so it stays visually\r\n           prominent after the stage scale-down (~0.44\u00d7 at 628 container).\r\n           Now: padding 22\u00d772, font 30, gap 14, sparkle 28. *\/\r\n        .hashy-card-cta {\r\n            display: inline-flex !important;\r\n            align-items: center !important;\r\n            justify-content: center !important;\r\n            gap: 14px !important;\r\n            padding: 22px 72px !important;\r\n            background:\r\n                linear-gradient(#8839E7, #8839E7) padding-box,\r\n                linear-gradient(129deg, #fff 5%, rgba(255,255,255,0) 28%, rgba(255,255,255,0) 72%, #fff 94%) border-box !important;\r\n            border: 3px solid transparent !important;\r\n            border-radius: 99px !important;\r\n            color: #fff !important;\r\n            font-family: Poppins, \"Helvetica Neue\", Arial, sans-serif !important;\r\n            font-weight: 600 !important;\r\n            font-size: 30px !important;\r\n            line-height: 1.2 !important;\r\n            text-decoration: none !important;\r\n            box-shadow: 0 8px 28px rgba(136, 57, 231, .45) !important;\r\n            transition: transform .25s ease, box-shadow .25s ease, filter .25s ease !important;\r\n        }\r\n        .hashy-card-cta:hover {\r\n            transform: translateY(-2px) !important;\r\n            filter: brightness(1.08) !important;\r\n            color: #fff !important;\r\n            text-decoration: none !important;\r\n            box-shadow: 0 14px 36px rgba(136, 57, 231, .6) !important;\r\n        }\r\n        .hashy-card-cta-spark { display: inline-flex !important; }\r\n        .hashy-card-cta-spark svg { display: block !important; width: 28px !important; height: 29px !important; }\r\n\r\n        \/* \u2500\u2500 Right column (mascot + chat) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        .hashy-card-right {\r\n            position: relative !important;\r\n            flex: 0 0 auto !important;\r\n            width: 562px !important;\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            align-items: center !important;\r\n            padding-bottom: 24px !important;\r\n        }\r\n        .hashy-banner-wrap.hashy-banner-wrap img.hashy-card-mascot,\r\n        .hashy-banner-stage.hashy-banner-stage img.hashy-card-mascot,\r\n        .hashy-card-mascot {\r\n            display: block !important;\r\n            width: 128px !important;\r\n            height: 194.4px !important;\r\n            margin: 0 0 -28px !important;        \/* overlap chat-window by 28px *\/\r\n            position: relative !important;\r\n            z-index: 1 !important;               \/* sits BEHIND chat window so the\r\n                                         bottom edge is hidden, giving\r\n                                         the peek-from-behind effect *\/\r\n            animation: hashyMascotBounce 3.5s ease-in-out infinite !important;\r\n            filter: drop-shadow(0 8px 24px rgba(0,0,0,.45)) !important;\r\n        }\r\n        @keyframes hashyMascotBounce {\r\n            0%, 100% { transform: translateY(0)    rotate(-2deg); }\r\n            50%      { transform: translateY(-6px) rotate( 2deg); }\r\n        }\r\n\r\n        .hashy-card-chat-window {\r\n            position: relative !important;\r\n            z-index: 2 !important;               \/* on top of mascot so the bottom\r\n                                         edge of the mascot is hidden\r\n                                         behind it (peek-through effect) *\/\r\n            width: 100% !important;\r\n            height: 278px !important;\r\n            background: rgba(255, 255, 255, 0.24) !important;\r\n            border-radius: 12px !important;\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            gap: 20px !important;\r\n            padding: 0 0 10px !important;\r\n            overflow: hidden !important;\r\n            box-shadow:\r\n                0 0 24px rgba(255,255,255,0.08),\r\n                0 0 40px rgba(255,255,255,0.08) !important;\r\n            backdrop-filter: blur(4px) !important;\r\n            -webkit-backdrop-filter: blur(4px) !important;\r\n        }\r\n        .hashy-card-chat-window::before {\r\n            content: \"\" !important;\r\n            position: absolute !important; inset: 0 !important;\r\n            border-radius: inherit !important;\r\n            padding: 3px !important;\r\n            background: linear-gradient(134deg, #fff 0%, rgba(255,255,255,0.16) 26%, rgba(255,255,255,0.16) 77%, #fff 100%) !important;\r\n            -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0) !important;\r\n            -webkit-mask-composite: xor !important;\r\n                    mask-composite: exclude !important;\r\n            pointer-events: none !important;\r\n            z-index: 3 !important;\r\n        }\r\n\r\n        \/* Chat header \u2014 increased top\/bottom padding (10\u219216) to keep\r\n           the avatar visibly clear of the dark header edges. *\/\r\n        .hashy-card-chat-header {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            justify-content: space-between !important;\r\n            padding: 16px 20px !important;\r\n            background: #111 !important;\r\n            border-radius: 13.474px 13.474px 0 0 !important;\r\n            flex-shrink: 0 !important;\r\n            position: relative !important;\r\n            z-index: 1 !important;\r\n        }\r\n        .hashy-card-chat-id {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            gap: 11px !important;\r\n        }\r\n        .hashy-card-chat-avatar {\r\n            width: 40px !important; height: 40px !important;\r\n            border-radius: 50% !important;\r\n            display: block !important;\r\n            flex-shrink: 0 !important;\r\n            overflow: hidden !important;\r\n        }\r\n        .hashy-card-chat-avatar img {\r\n            display: block !important;\r\n            width: 100% !important; height: 100% !important;\r\n            border-radius: 50% !important;\r\n            object-fit: cover !important;\r\n        }\r\n        \/* Two-line meta block \u2014 height locked to avatar so flex-center\r\n           on the parent aligns avatar mid-Y with text mid-Y exactly. *\/\r\n        .hashy-card-chat-meta {\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            justify-content: center !important;\r\n            align-items: flex-start !important;\r\n            height: 40px !important;\r\n            text-align: left !important;\r\n            line-height: 1.15 !important;\r\n        }\r\n        .hashy-card-chat-name {\r\n            margin: 0 !important;\r\n            color: #fff !important;\r\n            font-weight: 500 !important;\r\n            font-size: 17px !important;\r\n            line-height: 1.2 !important;\r\n            text-align: left !important;\r\n        }\r\n        .hashy-card-chat-role {\r\n            margin: 2px 0 0 !important;\r\n            color: #fff !important;\r\n            font-weight: 400 !important;\r\n            font-size: 11.5px !important;\r\n            line-height: 1.2 !important;\r\n            text-align: left !important;\r\n            opacity: .85 !important;\r\n        }\r\n        .hashy-card-chat-dots { display: inline-flex !important; align-items: center !important; gap: 8px !important; padding: 0 4px !important; }\r\n        .hashy-card-chat-dots span { width: 10.12px !important; height: 10.12px !important; border-radius: 50% !important; background: #d9d9d9 !important; }\r\n\r\n        \/* Chat body \/ stream *\/\r\n        .hashy-card-chat-body { position: relative !important; flex: 1 1 auto !important; min-height: 0 !important; overflow: hidden !important; }\r\n        .hashy-card-chat-stream {\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            gap: 20px !important;\r\n            will-change: transform !important;\r\n            transition: transform .9s cubic-bezier(.2,.7,.2,1) !important;\r\n        }\r\n        .hashy-card-chat-stream.no-transition,\r\n        .hashy-card-chat-stream.no-transition .hashy-msg { transition: none !important; }\r\n\r\n        \/* Message rows \u2014 softened easing + longer transitions for a calmer\r\n           reveal cadence. Bubble drops in from -10px with fade. *\/\r\n        .hashy-msg {\r\n            display: flex !important;\r\n            align-items: flex-end !important;\r\n            gap: 18px !important;\r\n            padding: 0 28px !important;\r\n            opacity: 0 !important;\r\n            transform: translateY(-10px) !important;\r\n            transition: opacity .55s cubic-bezier(.16,.84,.32,1),\r\n                        transform .65s cubic-bezier(.18,.86,.34,1.04) !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-msg.is-revealed { opacity: 1 !important; transform: translateY(0) !important; }\r\n        .hashy-msg.is-incoming { justify-content: flex-start !important; }\r\n        .hashy-msg.is-outgoing { justify-content: flex-end !important; padding: 0 28px 0 0 !important; }\r\n        .hashy-msg.hashy-msg-narrow { padding: 0 24px !important; }\r\n\r\n        .hashy-msg-avatar {\r\n            display: block !important;\r\n            width: 40px !important; height: 40px !important;\r\n            border-radius: 50% !important;\r\n            object-fit: cover !important;\r\n            flex-shrink: 0 !important;\r\n            background: #fff !important;\r\n        }\r\n        .hashy-msg-avatar-bordered {\r\n            border: 1.82px solid #fff !important;\r\n            background: #8839E7 !important;\r\n        }\r\n\r\n        \/* Bubbles *\/\r\n        .hashy-bubble {\r\n            position: relative !important;\r\n            padding: 10px 14px !important;\r\n            border-radius: 5px !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 14.5px !important;\r\n            line-height: 1.4 !important;\r\n            box-shadow: 0 1px 2px rgba(0,0,0,.18) !important;\r\n            max-width: 320px !important;\r\n        }\r\n        .hashy-bubble strong { font-weight: 700 !important; }\r\n\r\n        .hashy-bubble-white { background: #fff !important; color: #353535 !important; }\r\n        .hashy-bubble-white::before {\r\n            content: \"\" !important;\r\n            position: absolute !important;\r\n            left: -7px !important; top: 0 !important;\r\n            width: 0 !important; height: 0 !important;\r\n            border-style: solid !important;\r\n            border-width: 0 17px 16px 0 !important;\r\n            border-color: transparent #fff transparent transparent !important;\r\n        }\r\n        .hashy-text-purple { color: #8839E7 !important; font-weight: 800 !important; }\r\n\r\n        .hashy-bubble-purple { background: #8839E7 !important; color: #fff !important; }\r\n        .hashy-bubble-purple::after {\r\n            content: \"\" !important;\r\n            position: absolute !important;\r\n            right: -7px !important; top: 0 !important;\r\n            width: 0 !important; height: 0 !important;\r\n            border-style: solid !important;\r\n            border-width: 0 0 16px 17px !important;\r\n            border-color: transparent transparent #8839E7 transparent !important;\r\n        }\r\n        .hashy-bubble-wide { width: 380px !important; max-width: 100% !important; }\r\n\r\n        .hashy-bubble-typing {\r\n            display: inline-flex !important;\r\n            align-items: center !important;\r\n            justify-content: center !important;\r\n            gap: 4px !important;\r\n            padding: 9px 14px !important;\r\n            min-width: 50px !important;\r\n        }\r\n        .hashy-bubble-typing .hashy-dot {\r\n            width: 6px !important; height: 6px !important;\r\n            border-radius: 50% !important;\r\n            background: #fff !important;\r\n            opacity: .9 !important;\r\n            animation: hashyDot 1.2s ease-in-out infinite !important;\r\n        }\r\n        \/* White bubble typing dots \u2014 purple to be visible on white bg *\/\r\n        .hashy-bubble-white.hashy-bubble-typing .hashy-dot {\r\n            background: #8839E7 !important;\r\n            opacity: .55 !important;\r\n        }\r\n        .hashy-bubble-typing .hashy-dot:nth-child(2) { animation-delay: .18s !important; }\r\n        .hashy-bubble-typing .hashy-dot:nth-child(3) { animation-delay: .36s !important; }\r\n        @keyframes hashyDot {\r\n            0%, 60%, 100% { transform: translateY(0);   opacity: .55; }\r\n            30%           { transform: translateY(-4px); opacity: 1;   }\r\n        }\r\n        \/* Typing rows are dynamically injected by JS before each real\r\n           message; remove them from the natural flow when fading out\r\n           (gives the impression the bubble morphs into the real text).\r\n           Center-align so the small typing bubble sits vertically\r\n           against the avatar instead of dropping to flex-end. *\/\r\n        .hashy-typing-row {\r\n            align-items: center !important;\r\n            transition: opacity .4s ease, transform .45s ease, max-height .45s ease !important;\r\n        }\r\n        .hashy-typing-row.is-fading {\r\n            opacity: 0 !important;\r\n            transform: translateY(-4px) !important;\r\n            max-height: 0 !important;\r\n            margin: 0 !important;\r\n            overflow: hidden !important;\r\n        }\r\n\r\n        .hashy-bubble-card { padding: 10px !important; }\r\n\r\n        \/* Sales: Bright Technology contact card *\/\r\n        .hashy-contact-card { display: flex !important; flex-direction: column !important; gap: 5px !important; width: 256px !important; }\r\n        .hashy-contact-row {\r\n            display: flex !important; align-items: center !important; gap: 8px !important;\r\n            border-bottom: 0.5px solid #d9d9d9 !important;\r\n            padding-bottom: 12px !important;\r\n            height: 57px !important;\r\n        }\r\n        .hashy-contact-logo {\r\n            width: 45px !important; height: 45px !important;\r\n            border-radius: 50% !important;\r\n            overflow: hidden !important;\r\n            flex-shrink: 0 !important;\r\n            background: #fff !important;\r\n            display: flex !important; align-items: center !important; justify-content: center !important;\r\n        }\r\n        .hashy-contact-logo img { display: block !important; width: 100% !important; height: 100% !important; object-fit: cover !important; }\r\n        .hashy-contact-meta {\r\n            flex: 1 1 auto !important;\r\n            min-width: 0 !important;\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            justify-content: center !important;\r\n        }\r\n        .hashy-contact-name {\r\n            margin: 0 !important;\r\n            font-weight: 600 !important;\r\n            font-size: 14px !important;\r\n            color: #353535 !important;\r\n            line-height: 20px !important;\r\n            white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important;\r\n        }\r\n        .hashy-contact-email {\r\n            margin: 0 !important;\r\n            font-weight: 400 !important;\r\n            font-size: 12px !important;\r\n            color: #353535 !important;\r\n            line-height: 20px !important;\r\n            white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important;\r\n        }\r\n        .hashy-contact-cog {\r\n            width: 16px !important; height: 16px !important;\r\n            display: inline-flex !important; align-items: center !important; justify-content: center !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-contact-actions { display: flex !important; gap: 8px !important; padding-top: 6px !important; }\r\n        .hashy-contact-actions span {\r\n            flex: 1 1 0 !important;\r\n            min-width: 0 !important;\r\n            height: 28px !important;\r\n            background: #f6f6f6 !important;\r\n            border-radius: 4px !important;\r\n            display: inline-flex !important; align-items: center !important; justify-content: center !important;\r\n        }\r\n        .hashy-contact-actions svg { display: block !important; }\r\n\r\n        \/* Inventory: Low Stock card \u2014 Figma 5311:1473 (171px content) *\/\r\n        .hashy-stock-card {\r\n            display: flex !important; flex-direction: column !important;\r\n            gap: 8px !important;\r\n            width: 171px !important;\r\n        }\r\n        .hashy-stock-head {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            justify-content: space-between !important;\r\n            gap: 11px !important;\r\n            font-weight: 600 !important;\r\n            font-size: 14px !important;\r\n            color: #353535 !important;\r\n        }\r\n        .hashy-warn-icon { flex-shrink: 0 !important; }\r\n        .hashy-stock-divider { height: 0.5px !important; background: #d9d9d9 !important; }\r\n        .hashy-stock-row {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            justify-content: center !important;\r\n            gap: 10px !important;\r\n        }\r\n        .hashy-stock-thumb {\r\n            width: 42px !important; height: 42px !important;\r\n            border-radius: 3px !important;\r\n            border: 0.8px solid #ddd !important;\r\n            overflow: hidden !important;\r\n            flex-shrink: 0 !important;\r\n            background: #fff !important;\r\n        }\r\n        .hashy-stock-thumb img { display: block !important; width: 100% !important; height: 100% !important; object-fit: contain !important; }\r\n        .hashy-stock-info { display: flex !important; flex-direction: column !important; gap: 3px !important; width: 119px !important; }\r\n        .hashy-stock-name {\r\n            margin: 0 !important; font-weight: 500 !important; font-size: 12.5px !important; color: #353535 !important; line-height: 1.25 !important;\r\n        }\r\n        .hashy-stock-sku {\r\n            margin: 0 !important; font-weight: 500 !important; font-size: 8px !important; color: #353535 !important; line-height: 1.4 !important;\r\n        }\r\n        .hashy-stock-progress {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            gap: 8px !important;\r\n            width: 100% !important;\r\n        }\r\n        .hashy-stock-bar {\r\n            flex: 1 1 auto !important;\r\n            min-width: 0 !important;\r\n            height: 7px !important;\r\n            border-radius: 24px !important;\r\n            background: rgba(196, 196, 196, .24) !important;\r\n            overflow: hidden !important;\r\n            position: relative !important;\r\n        }\r\n        .hashy-stock-bar span {\r\n            display: block !important;\r\n            height: 100% !important;\r\n            background: #BD1E2D !important;\r\n            border-radius: 24px !important;\r\n        }\r\n        .hashy-stock-pill {\r\n            display: inline-flex !important; align-items: center !important;\r\n            padding: 2px 4px !important;\r\n            border-radius: 2px !important;\r\n            font-weight: 500 !important;\r\n            font-size: 6px !important;\r\n            line-height: 1.4 !important;\r\n            white-space: nowrap !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-stock-pill-ok { background: #DDFCD4 !important; color: #1A8707 !important; }\r\n        .hashy-stock-pill-low {\r\n            background: #FFEBEB !important;\r\n            color: #90191C !important;\r\n            font-weight: 600 !important;\r\n            font-size: 7px !important;\r\n            padding: 1px 4px !important;\r\n        }\r\n\r\n        .hashy-check { vertical-align: -3px !important; margin-left: 3px !important; flex-shrink: 0 !important; }\r\n        .hashy-inline-icon { display: inline-flex !important; vertical-align: -3px !important; margin-right: 4px !important; }\r\n\r\n        \/* \u2500\u2500 Document card (Quotation\/Purchase order) \u2014 Figma 5298:2969\r\n           Sales \/ 5298:3099 Inventory. Bubble widened to 380px and\r\n           internal paddings\/gaps tightened so the full preview + From\/To\r\n           + attachment + CTA fit inside the 278px chat viewport\r\n           without the View Document button getting clipped. \u2500\u2500 *\/\r\n        .hashy-bubble-doc {\r\n            flex-direction: column !important;\r\n            align-items: stretch !important;\r\n            gap: 8px !important;\r\n            width: 380px !important;\r\n            padding: 9px 12px !important;\r\n        }\r\n        .hashy-doc-tag {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            gap: 4px !important;\r\n        }\r\n        .hashy-doc-tag p,\r\n        .hashy-doc-tag-text {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 13.5px !important;\r\n            line-height: 1.35 !important;\r\n            color: #353535 !important;\r\n        }\r\n        .hashy-doc-card {\r\n            background: #FAFAFA !important;\r\n            border-radius: 2.6px !important;\r\n            padding: 6px !important;\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            gap: 5px !important;\r\n            width: 100% !important;\r\n        }\r\n        .hashy-doc-preview {\r\n            background: #fff !important;\r\n            border: 0.7px solid rgba(0,0,0,.1) !important;\r\n            border-radius: 4.8px 4.8px 0 0 !important;\r\n            padding: 5px 6px !important;\r\n            overflow: hidden !important;\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            gap: 2.5px !important;\r\n        }\r\n        .hashy-doc-head {\r\n            display: flex !important;\r\n            align-items: flex-start !important;\r\n            justify-content: space-between !important;\r\n            gap: 6px !important;\r\n        }\r\n        .hashy-doc-head-text { display: flex !important; flex-direction: column !important; }\r\n        .hashy-doc-title {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 700 !important;\r\n            font-size: 10.9px !important;\r\n            line-height: 1.4 !important;\r\n            color: #353535 !important;\r\n        }\r\n        .hashy-doc-num {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 5.4px !important;\r\n            line-height: 1.2 !important;\r\n            color: #353535 !important;\r\n            opacity: .5 !important;\r\n        }\r\n        .hashy-doc-logo {\r\n            width: 20px !important;\r\n            height: 17px !important;\r\n            object-fit: contain !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-doc-divider {\r\n            height: 0.7px !important;\r\n            background: rgba(0,0,0,.1) !important;\r\n        }\r\n        .hashy-doc-fromto {\r\n            display: flex !important;\r\n            justify-content: space-between !important;\r\n            gap: 8px !important;\r\n        }\r\n        .hashy-doc-fromto > div {\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n        }\r\n        .hashy-doc-label {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 400 !important;\r\n            font-size: 5.4px !important;\r\n            line-height: 1.4 !important;\r\n            color: #353535 !important;\r\n            opacity: .5 !important;\r\n        }\r\n        .hashy-doc-co {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 700 !important;\r\n            font-size: 5.4px !important;\r\n            line-height: 1.4 !important;\r\n            color: #2C2C2C !important;\r\n        }\r\n        .hashy-doc-addr {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 5.4px !important;\r\n            line-height: 1.4 !important;\r\n            color: #2C2C2C !important;\r\n        }\r\n        .hashy-doc-attach {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            gap: 6px !important;\r\n            padding: 0 2px !important;\r\n        }\r\n        .hashy-doc-pdf-badge {\r\n            display: inline-flex !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-doc-pdf-badge svg { display: block !important; width: 20px !important; height: 25px !important; }\r\n        .hashy-doc-attach-meta { display: flex !important; flex-direction: column !important; min-width: 0 !important; }\r\n        .hashy-doc-file {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 10px !important;\r\n            line-height: 1.4 !important;\r\n            color: #353535 !important;\r\n            white-space: nowrap !important;\r\n            overflow: hidden !important;\r\n            text-overflow: ellipsis !important;\r\n        }\r\n        .hashy-doc-size {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 10px !important;\r\n            line-height: 1.4 !important;\r\n            color: #ABAAAA !important;\r\n        }\r\n        .hashy-doc-cta {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            justify-content: center !important;\r\n            background: #8839E7 !important;\r\n            color: #fff !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 600 !important;\r\n            font-size: 10px !important;\r\n            line-height: 1.4 !important;\r\n            padding: 5px 8px !important;\r\n            border-radius: 3.4px !important;\r\n        }\r\n\r\n        \/* \u2500\u2500 Accounting: XLSX Financial Report card \u2014 Figma 5316:1700 \u2500\u2500 *\/\r\n        .hashy-bubble-xlsx {\r\n            flex-direction: column !important;\r\n            align-items: stretch !important;\r\n            gap: 8px !important;\r\n            width: 280px !important;\r\n            padding: 10px !important;\r\n        }\r\n        .hashy-xlsx-row {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            gap: 10px !important;\r\n        }\r\n        .hashy-xlsx-icon {\r\n            display: inline-flex !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-xlsx-icon svg { display: block !important; width: 24px !important; height: 28px !important; }\r\n        .hashy-xlsx-meta { display: flex !important; flex-direction: column !important; min-width: 0 !important; }\r\n        .hashy-xlsx-name {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 600 !important;\r\n            font-size: 13px !important;\r\n            line-height: 1.3 !important;\r\n            color: #353535 !important;\r\n        }\r\n        .hashy-xlsx-size {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 10.5px !important;\r\n            line-height: 1.4 !important;\r\n            color: #888 !important;\r\n        }\r\n        .hashy-xlsx-actions { display: flex !important; gap: 8px !important; }\r\n        .hashy-xlsx-actions span {\r\n            flex: 1 1 0 !important;\r\n            display: inline-flex !important;\r\n            align-items: center !important;\r\n            justify-content: center !important;\r\n            background: #F1F1F1 !important;\r\n            color: #353535 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 12px !important;\r\n            padding: 6px 10px !important;\r\n            border-radius: 4px !important;\r\n        }\r\n\r\n        \/* \u2500\u2500 HR: Attendance Report card \u2014 Figma 5287:1171 \u2500\u2500 *\/\r\n        .hashy-bubble-attendance {\r\n            flex-direction: column !important;\r\n            align-items: stretch !important;\r\n            gap: 10px !important;\r\n            width: 270px !important;\r\n            padding: 10px 12px !important;\r\n        }\r\n        .hashy-att-head {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            justify-content: space-between !important;\r\n        }\r\n        .hashy-att-title {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 700 !important;\r\n            font-size: 13px !important;\r\n            color: #353535 !important;\r\n        }\r\n        .hashy-att-month {\r\n            display: inline-flex !important;\r\n            align-items: center !important;\r\n            gap: 4px !important;\r\n            background: #F1F1F1 !important;\r\n            color: #353535 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 10px !important;\r\n            padding: 3px 8px !important;\r\n            border-radius: 4px !important;\r\n        }\r\n        .hashy-att-month svg { display: inline-block !important; }\r\n        .hashy-att-body {\r\n            display: flex !important;\r\n            align-items: center !important;\r\n            gap: 12px !important;\r\n            padding: 4px 0 !important;\r\n        }\r\n        .hashy-donut {\r\n            position: relative !important;\r\n            width: 80px !important;\r\n            height: 80px !important;\r\n            border-radius: 50% !important;\r\n            background: conic-gradient(\r\n                #8839E7 0deg 315deg,        \/* 21\/24 = 87.5% = 315deg \u2014 Present *\/\r\n                #FEA110 315deg 345deg,      \/* 2\/24  = 8.3%  = 30deg  \u2014 Annual Leave *\/\r\n                #BD1E2D 345deg 360deg       \/* 1\/24  = 4.2%  = 15deg  \u2014 Sick Leave *\/\r\n            ) !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-donut::before {\r\n            content: \"\" !important;\r\n            position: absolute !important;\r\n            inset: 12px !important;\r\n            background: #fff !important;\r\n            border-radius: 50% !important;\r\n        }\r\n        .hashy-donut-center {\r\n            position: absolute !important;\r\n            inset: 0 !important;\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            align-items: center !important;\r\n            justify-content: center !important;\r\n            text-align: center !important;\r\n            z-index: 1 !important;\r\n        }\r\n        .hashy-donut-num {\r\n            margin: 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 700 !important;\r\n            font-size: 18px !important;\r\n            line-height: 1 !important;\r\n            color: #353535 !important;\r\n        }\r\n        .hashy-donut-label {\r\n            margin: 1px 0 0 !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-weight: 500 !important;\r\n            font-size: 7.5px !important;\r\n            line-height: 1.2 !important;\r\n            color: #888 !important;\r\n        }\r\n        .hashy-att-legend {\r\n            display: flex !important;\r\n            flex-direction: column !important;\r\n            gap: 6px !important;\r\n            font-family: Poppins, sans-serif !important;\r\n            font-size: 10.5px !important;\r\n            color: #353535 !important;\r\n        }\r\n        .hashy-att-legend > div {\r\n            display: flex !important;\r\n            align-items: flex-start !important;\r\n            gap: 6px !important;\r\n            line-height: 1.25 !important;\r\n        }\r\n        .hashy-att-legend strong { font-weight: 700 !important; font-size: 11px !important; }\r\n        .hashy-att-dot {\r\n            width: 10px !important; height: 10px !important;\r\n            border-radius: 2px !important;\r\n            margin-top: 2px !important;\r\n            flex-shrink: 0 !important;\r\n        }\r\n        .hashy-att-dot-1 { background: #8839E7 !important; }\r\n        .hashy-att-dot-2 { background: #FEA110 !important; }\r\n        .hashy-att-dot-3 { background: #BD1E2D !important; }\r\n\r\n        \/* \u2500\u2500 Mobile (< 480px container): unscale + stack vertically.\r\n           Layout order: text on TOP, chat card on BOTTOM. Text\/button\r\n           rendered center-aligned. Above 480 the desktop side-by-side\r\n           layout stays \u2014 it just scales down via transform. \u2500\u2500\u2500 *\/\r\n        @container hashybnr (max-width: 479.99px) {\r\n            .hashy-banner-frame {\r\n                aspect-ratio: auto !important;\r\n                border-radius: 14px !important;\r\n            }\r\n            .hashy-banner-stage {\r\n                position: static !important;\r\n                width: 100% !important;\r\n                height: auto !important;\r\n                transform: none !important;\r\n            }\r\n            .hashy-card-deco-1, .hashy-card-deco-2 { display: none !important; }\r\n            .hashy-card-deco-3 { right: 12px !important; top: 0 !important; width: 24px !important; height: 70px !important; }\r\n            .hashy-card-bg-glow { left: 50% !important; transform: translateX(-50%) !important; width: 90% !important; }\r\n\r\n            .hashy-card-inner {\r\n                flex-direction: column !important;        \/* text first, card second *\/\r\n                align-items: center !important;\r\n                text-align: center !important;\r\n                gap: 28px !important;\r\n                padding: 32px 22px !important;\r\n                height: auto !important;\r\n            }\r\n            .hashy-card-left {\r\n                width: 100% !important;\r\n                max-width: 460px !important;\r\n                gap: 24px !important;\r\n                align-items: center !important;           \/* center logo, title, CTA *\/\r\n                text-align: center !important;\r\n            }\r\n            .hashy-card-logo { height: 24px !important; }\r\n            .hashy-card-text-block {\r\n                gap: 20px !important;\r\n                align-items: center !important;\r\n                text-align: center !important;\r\n                width: 100% !important;\r\n            }\r\n            .hashy-card-title { font-size: 22px !important; line-height: 1.3 !important; text-align: center !important; }\r\n            .hashy-card-cta { font-size: 15px !important; padding: 11px 28px !important; align-self: center !important; }\r\n            .hashy-card-cta-spark svg { width: 16px !important; height: 17px !important; }\r\n\r\n            .hashy-card-right {\r\n                width: 100% !important;\r\n                max-width: 420px !important;\r\n                padding-bottom: 0 !important;\r\n                text-align: left !important;     \/* reset center inheritance\r\n                                                    so chat content stays\r\n                                                    left-aligned on mobile *\/\r\n            }\r\n            .hashy-card-chat-meta,\r\n            .hashy-card-chat-name,\r\n            .hashy-card-chat-role,\r\n            .hashy-bubble,\r\n            .hashy-stock-card,\r\n            .hashy-contact-card,\r\n            .hashy-doc-card { text-align: left !important; }\r\n            .hashy-banner-wrap.hashy-banner-wrap img.hashy-card-mascot,\r\n            .hashy-banner-stage.hashy-banner-stage img.hashy-card-mascot,\r\n            .hashy-card-mascot { width: 96px !important; height: auto !important; margin: 0 0 -22px !important; }\r\n            .hashy-card-chat-window { height: 232px !important; }\r\n            .hashy-card-chat-name { font-size: 14px !important; }\r\n            .hashy-card-chat-role { font-size: 10.5px !important; }\r\n            .hashy-card-chat-avatar { width: 32px !important; height: 32px !important; }\r\n            .hashy-card-chat-avatar img { width: 28px !important; height: 28px !important; }\r\n            .hashy-bubble { font-size: 12.5px !important; padding: 8px 10px !important; max-width: 240px !important; }\r\n            .hashy-bubble-wide { width: auto !important; max-width: 260px !important; }\r\n            .hashy-bubble-doc { width: auto !important; max-width: 280px !important; padding: 8px 10px !important; }\r\n            .hashy-bubble-xlsx { width: auto !important; max-width: 260px !important; }\r\n            .hashy-bubble-attendance { width: auto !important; max-width: 260px !important; }\r\n            .hashy-msg-avatar { width: 30px !important; height: 30px !important; }\r\n            .hashy-msg, .hashy-msg.is-outgoing { padding-left: 14px !important; padding-right: 14px !important; }\r\n            .hashy-card-chat-stream { gap: 14px !important; }\r\n            .hashy-card-chat-dots span { width: 8px !important; height: 8px !important; }\r\n            .hashy-contact-card { width: 220px !important; }\r\n            .hashy-stock-card { width: 210px !important; }\r\n        }\r\n\r\n        @media (prefers-reduced-motion: reduce) {\r\n            .hashy-card-deco,\r\n            .hashy-card-mascot,\r\n            .hashy-bubble-typing .hashy-dot { animation: none !important; }\r\n            .hashy-card-cta:hover { transform: none !important; filter: none !important; }\r\n            .hashy-msg, .hashy-card-chat-stream { transition: opacity .2s ease !important; transform: none !important; }\r\n        }\r\n    <\/style>\r\n\r\n    <script>\r\n        \/* Sequential message reveal with chat-loading indicator.\r\n           For each real message the JS injects a temporary typing bubble\r\n           in the matching side, animates it for ~1100ms, then fades it\r\n           out and reveals the actual bubble. The stream glides upward\r\n           when the new content would push past the visible body. *\/\r\n        (function () {\r\n            var TYPING_MS = 1100;   \/\/ how long the dots pulse before bubble appears\r\n            var FADE_MS   = 320;    \/\/ typing-row collapse duration\r\n            var GAP_MS    = 1700;   \/\/ pause after bubble is shown, before next typing\r\n            var LOOP_PAUSE = 2500;  \/\/ pause at end of conversation before restart loop\r\n\r\n            function startHashyChat(stream) {\r\n                if (!stream || stream.dataset.hashyChatStarted === \"1\") return;\r\n                stream.dataset.hashyChatStarted = \"1\";\r\n                var body = stream.parentElement;\r\n                var msgs = Array.prototype.slice.call(stream.querySelectorAll(\".hashy-msg\"));\r\n                if (!msgs.length) return;\r\n\r\n                var avatarHashy = stream.dataset.avatarHashy || \"\";\r\n                var avatarUser  = stream.dataset.avatarUser  || \"\";\r\n\r\n                function makeTyping(isIncoming) {\r\n                    var row = document.createElement(\"div\");\r\n                    row.className = \"hashy-msg hashy-typing-row \" + (isIncoming ? \"is-incoming\" : \"is-outgoing\");\r\n                    var bubble =\r\n                        '<div class=\"hashy-bubble hashy-bubble-typing ' +\r\n                        (isIncoming ? 'hashy-bubble-white' : 'hashy-bubble-purple') +\r\n                        '\"><span class=\"hashy-dot\"><\/span><span class=\"hashy-dot\"><\/span><span class=\"hashy-dot\"><\/span><\/div>';\r\n                    var avatar = isIncoming\r\n                        ? '<img decoding=\"async\" class=\"hashy-msg-avatar\" src=\"' + avatarHashy + '\" alt=\"\" width=\"40\" height=\"40\">'\r\n                        : '<img decoding=\"async\" class=\"hashy-msg-avatar hashy-msg-avatar-bordered\" src=\"' + avatarUser + '\" alt=\"\" width=\"40\" height=\"40\">';\r\n                    row.innerHTML = isIncoming ? avatar + bubble : bubble + avatar;\r\n                    return row;\r\n                }\r\n\r\n                function scrollIntoView(node) {\r\n                    requestAnimationFrame(function () {\r\n                        requestAnimationFrame(function () {\r\n                            var viewportH = body.clientHeight;\r\n                            var nodeBottom = node.offsetTop + node.offsetHeight;\r\n                            var currentY = parseFloat(\r\n                                (stream.style.transform.match(\/-?\\d+(?:\\.\\d+)?\/) || [0])[0]\r\n                            );\r\n                            var visibleBottom = -currentY + viewportH;\r\n                            if (nodeBottom > visibleBottom) {\r\n                                stream.style.transform = \"translateY(\" + (-node.offsetTop) + \"px)\";\r\n                            }\r\n                        });\r\n                    });\r\n                }\r\n\r\n                function reset() {\r\n                    stream.classList.add(\"no-transition\");\r\n                    msgs.forEach(function (m) { m.classList.remove(\"is-revealed\"); });\r\n                    Array.prototype.slice.call(stream.querySelectorAll(\".hashy-typing-row\")).forEach(function (n) {\r\n                        if (n.parentNode) n.parentNode.removeChild(n);\r\n                    });\r\n                    stream.style.transform = \"translateY(0)\";\r\n                    void stream.offsetWidth;\r\n                    stream.classList.remove(\"no-transition\");\r\n                }\r\n\r\n                var i = 0;\r\n                reset();\r\n\r\n                function tick() {\r\n                    if (i >= msgs.length) {\r\n                        setTimeout(function () { reset(); i = 0; setTimeout(tick, 800); }, LOOP_PAUSE);\r\n                        return;\r\n                    }\r\n                    var msg = msgs[i];\r\n                    var isIncoming = msg.classList.contains(\"is-incoming\");\r\n                    var typing = makeTyping(isIncoming);\r\n                    msg.parentNode.insertBefore(typing, msg);\r\n\r\n                    \/\/ Reveal typing on next frame for smooth fade-in\r\n                    requestAnimationFrame(function () {\r\n                        requestAnimationFrame(function () {\r\n                            typing.classList.add(\"is-revealed\");\r\n                            scrollIntoView(typing);\r\n                        });\r\n                    });\r\n\r\n                    setTimeout(function () {\r\n                        \/\/ Fade typing out, then reveal real message in its slot\r\n                        typing.classList.add(\"is-fading\");\r\n                        setTimeout(function () {\r\n                            if (typing.parentNode) typing.parentNode.removeChild(typing);\r\n                            msg.classList.add(\"is-revealed\");\r\n                            scrollIntoView(msg);\r\n                            i++;\r\n                            setTimeout(tick, GAP_MS);\r\n                        }, FADE_MS);\r\n                    }, TYPING_MS);\r\n                }\r\n\r\n                tick();\r\n            }\r\n\r\n            document.addEventListener(\"DOMContentLoaded\", function () {\r\n                document.querySelectorAll(\".hashy-card-chat-stream\").forEach(startHashyChat);\r\n            });\r\n        })();\r\n    <\/script>\n<h3><strong>3. Build baselines and train predictive models<\/strong><\/h3>\n<p>During the early monitoring phase, the system learns normal equipment behaviour and establishes baseline performance patterns. Machine learning models then compare live and historical data to identify abnormal conditions earlier.<\/p>\n<p>Some advanced systems also estimate Remaining Useful Life (RUL) for critical components. Models typically improve over time as more operational data becomes available.<\/p>\n<h3><strong>4. Connect insights to maintenance workflows<\/strong><\/h3>\n<p>Predictive alerts only deliver value when they lead to action. Integration with CMMS platforms allows businesses to automate work orders, maintenance scheduling, and spare parts preparation.<\/p>\n<p>This helps maintenance teams respond faster while giving procurement and planning teams earlier visibility into upcoming repair requirements.<\/p>\n<h3><strong>5. Train teams and scale gradually<\/strong><\/h3>\n<p>Technology alone is rarely enough for successful predictive maintenance adoption. Maintenance teams also need training to interpret alerts and understand how predictive recommendations support daily operations.<\/p>\n<p>Many businesses start with a pilot project, document early results, and expand gradually using standardised deployment processes. This approach helps reduce resistance and improves long-term adoption.<\/p>\n<h2><strong>Essential KPIs for Predictive Maintenance Success<\/strong><\/h2>\n<p>Tracking the right KPIs helps businesses measure whether predictive maintenance programs are improving reliability and reducing operational risk.<\/p>\n<ul>\n<li><strong>Mean Time Between Failures (MTBF):<\/strong> Measures how often equipment failures occur over time.<\/li>\n<li><strong>Mean Time to Repair (MTTR):<\/strong> Tracks how quickly maintenance teams resolve issues after failures or alerts.<\/li>\n<li><strong>Overall Equipment Effectiveness (OEE):<\/strong> Measures availability, performance, and production quality.<\/li>\n<li><strong>Planned Maintenance Percentage (PMP):<\/strong> Indicates how much maintenance work is proactive instead of reactive.<\/li>\n<\/ul>\n<p>Tracking these KPIs consistently helps teams fine-tune maintenance schedules, improve alert accuracy, and spot reliability trends earlier.<\/p>\n<p data-start=\"3861\" data-end=\"4030\"><style>\r\n    #custom-quote {\r\n        background-color: #f0f0f0;\r\n        padding: 20px;\r\n        border-radius: 12px;\r\n        margin: 20px;\r\n        display: flex;\r\n        flex-direction: column;\r\n    }\r\n\r\n    #custom-quote .quote-body {\r\n        display: flex;\r\n        flex-direction: row;\r\n        align-items: flex-start;\r\n        gap: 15px;\r\n        font-size: 16px;\r\n        line-height: 1.5;\r\n        font-style: italic;\r\n    }\r\n\r\n    #custom-quote .quote-icon {\r\n        width: 40px;\r\n        height: 40px;\r\n        flex-shrink: 0;\r\n    }\r\n\r\n    #custom-quote .quote-author-wrapper {\r\n        margin-top: 15px;\r\n        align-self: flex-start;\r\n        margin-left: 55px; \r\n\t\tmargin-bottom: 0px;\r\n    }\r\n\r\n    #custom-quote em {\r\n        font-family: 'Roboto Serif', serif !important;\r\n        font-size: 12px;\r\n        font-weight: bold;\r\n        font-style: normal;\r\n    }\r\n\r\n    @media screen and (max-width: 768px) {\r\n        #custom-quote {\r\n            margin: 15px 0;\r\n            padding: 15px;\r\n        }\r\n        \r\n        #custom-quote .quote-body {\r\n            gap: 12px;\r\n        }\r\n\r\n        #custom-quote .quote-author-wrapper {\r\n            margin-left: 52px;\r\n        }\r\n    }\r\n\r\n    @media screen and (max-width: 480px) {\r\n        #custom-quote {\r\n            margin: 10px 0;\r\n            padding: 12px;\r\n        }\r\n\r\n        #custom-quote .quote-body {\r\n            font-size: 14px;\r\n            gap: 10px;\r\n        }\r\n\r\n        #custom-quote .quote-icon {\r\n            width: 32px;\r\n            height: 32px;\r\n        }\r\n\r\n        #custom-quote .quote-author-wrapper {\r\n            margin-top: 10px;\r\n            margin-left: 42px;\r\n        }\r\n    }\r\n<\/style>\r\n\r\n<div id=\"custom-quote\">\r\n    <div class=\"quote-body\">\r\n        <img decoding=\"async\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/12\/quote.webp\" alt=\"Quote Icon\" class=\"quote-icon\">\r\n        <div>\r\n            Predictive maintenance helps businesses prevent equipment failures by using real-time data and analytics. With better visibility and planning, businesses can reduce downtime, extend asset lifespan, and keep operations running smoothly.        <\/div>\r\n    <\/div>\r\n    <p class=\"quote-author-wrapper\">\r\n        <em>Kaia Lockwood, Senior Product Manager<\/em>\r\n    <\/p>\r\n<\/div><\/p>\n<h2 data-start=\"116\" data-end=\"173\"><strong data-start=\"116\" data-end=\"173\">Industry Specific Use Cases of Predictive Maintenance<\/strong><\/h2>\n<p data-start=\"0\" data-end=\"174\">Although the core principles are similar, predictive maintenance is applied differently across industries depending on asset risk, automation levels, and operational demands.<\/p>\n<h3 data-section-id=\"12yaf2f\" data-start=\"176\" data-end=\"205\"><strong>1. Advanced Manufacturing<\/strong><\/h3>\n<p data-start=\"207\" data-end=\"546\">In advanced manufacturing environments, predictive maintenance supports <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/smart-manufacturing\/\">Industry 4.0<\/a> operations where production lines rely on robotics, CNC machines, and conveyor systems running continuously. Even a small component failure can interrupt output.<\/p>\n<p data-start=\"548\" data-end=\"806\">By monitoring motors, spindles, and other critical equipment with vibration or thermal sensors, manufacturers can identify wear earlier and schedule repairs during planned downtime. This helps reduce stoppages and maintain more stable production performance.<\/p>\n<h3 data-section-id=\"x0vfpc\" data-start=\"808\" data-end=\"847\"><strong>2. Retail and E commerce Fulfilment<\/strong><\/h3>\n<p data-start=\"849\" data-end=\"1071\">Predictive maintenance is becoming more common in automated fulfilment centres handling large order volumes. Facilities often depend on AS\/RS systems, conveyor networks, and autonomous robots that operate around the clock.<\/p>\n<p data-start=\"1073\" data-end=\"1295\">Monitoring conveyor motors, refrigeration systems, and drive components helps operators detect issues before peak periods are affected. Catching issues earlier helps fulfilment centres avoid delivery delays and costly last-minute repairs.<\/p>\n<h3 data-section-id=\"1bsbfyx\" data-start=\"1297\" data-end=\"1330\"><strong>3. Distribution and Logistics<\/strong><\/h3>\n<p data-start=\"1332\" data-end=\"1605\">In distribution and logistics environments, predictive maintenance is widely used to improve fleet reliability and material handling uptime within an integrated <a href=\"https:\/\/www.hashmicro.com\/au\/blog\/best-asset-management-software\/\">asset handling system<\/a>. Telemetry data from vehicles and equipment can reveal early signs of mechanical problems.<\/p>\n<p data-start=\"1607\" data-end=\"1843\" data-is-last-node=\"\" data-is-only-node=\"\">Instead of relying only on fixed servicing schedules, operators can perform maintenance based on actual equipment condition. This helps reduce unnecessary servicing while improving equipment availability across large logistics networks.<\/p>\n<h2 data-start=\"198\" data-end=\"248\"><strong>Predictive Maintenance Implementation Framework<\/strong><\/h2>\n<p data-start=\"0\" data-end=\"253\">Moving from reactive maintenance to predictive maintenance usually requires a phased rollout rather than a full deployment at once. Businesses need reliable asset data, the right monitoring setup, and clear maintenance priorities before scaling further.<\/p>\n<p data-start=\"255\" data-end=\"396\">A structured rollout also helps teams reduce unnecessary alerts and build confidence in the system over time.<\/p>\n<h3 data-section-id=\"bt1wpc\" data-start=\"398\" data-end=\"439\"><strong>1. Conduct asset criticality analysis<\/strong><\/h3>\n<p data-start=\"441\" data-end=\"682\">Businesses should avoid monitoring every asset from the beginning. Most predictive maintenance projects start with an asset criticality assessment based on production impact, safety exposure, environmental risk, and historical failure costs.<\/p>\n<p data-start=\"684\" data-end=\"858\">High-risk or high-value equipment is usually prioritised during the pilot phase. This helps businesses focus sensor investment on assets with the greatest operational impact.<\/p>\n<h3 data-section-id=\"102kdmp\" data-start=\"860\" data-end=\"908\"><strong>2. Deploy iIoT sensors and integrate systems<\/strong><\/h3>\n<p data-start=\"910\" data-end=\"1142\">Once priority assets are identified, IIoT sensors such as vibration, thermal, or ultrasonic devices can be installed at key monitoring points. Accurate sensor placement is important because poor readings can affect analysis quality.<\/p>\n<p data-start=\"1144\" data-end=\"1279\">Sensor outputs should also connect with CMMS or EAM platforms to centralise maintenance data and support automated work order creation.<\/p>\n<h3 data-section-id=\"d89ipn\" data-start=\"1281\" data-end=\"1328\"><strong>3. Establish baselines and train algorithms<\/strong><\/h3>\n<p data-start=\"1330\" data-end=\"1531\">During the early stages, the system collects operational data to establish normal equipment behaviour. Machine learning models then compare live and historical data to detect abnormal patterns earlier.<\/p>\n<p data-start=\"1533\" data-end=\"1686\" data-is-last-node=\"\" data-is-only-node=\"\">More advanced systems can estimate Remaining Useful Life (RUL), helping maintenance teams schedule repairs before equipment performance starts declining.<\/p>\n<h2 data-section-id=\"1tbc01d\" data-start=\"47\" data-end=\"147\"><strong>How Asset Management Software Enhances Predictive Maintenance in Australia&#8217;s Manufacturing Sector<\/strong><\/h2>\n<p data-start=\"0\" data-end=\"397\">According to <a href=\"https:\/\/www.imarcgroup.com\/australia-predictive-maintenance-market\">IMARC Group<\/a>, the Australian predictive maintenance market is projected to grow from USD 312.1 million in 2025 to USD 1,829.8 million by 2034. The growth shows how quickly Australian businesses are investing in predictive maintenance to reduce downtime and improve asset reliability.<\/p>\n<p data-start=\"399\" data-end=\"666\">To support this shift, manufacturers such as BlueScope are adopting asset management software combined with predictive maintenance technologies. Below are several ways asset management systems support predictive maintenance across Australian manufacturing operations.<\/p>\n<p data-section-id=\"m3h1hj\" data-start=\"668\" data-end=\"701\"><strong data-start=\"460\" data-end=\"490\">1. Real-Time Asset Monitoring<br data-start=\"490\" data-end=\"493\" \/><\/strong>Asset management software can connect with IoT sensors to monitor equipment performance continuously. This helps maintenance teams detect abnormal conditions earlier before failures disrupt production.<\/p>\n<p data-section-id=\"1qm64pk\" data-start=\"906\" data-end=\"947\"><strong>2. Data-Driven Maintenance Scheduling<br data-start=\"490\" data-end=\"493\" \/><\/strong>Instead of relying only on fixed servicing schedules, maintenance activities can be planned based on actual equipment condition and performance data. This approach helps reduce unnecessary maintenance work.<\/p>\n<p data-section-id=\"1p3z9w8\" data-start=\"1157\" data-end=\"1193\"><strong>3. Failure Prediction and Alerts<br data-start=\"490\" data-end=\"493\" \/><\/strong>Advanced analytics tools can identify unusual operating patterns and trigger alerts when equipment behaviour changes. Earlier warnings give maintenance teams more time to investigate potential issues.<\/p>\n<p data-section-id=\"1xav4r5\" data-start=\"1397\" data-end=\"1447\"><strong>4. Reduced Downtime and Production Disruptions<br data-start=\"490\" data-end=\"493\" \/><\/strong>Addressing maintenance issues earlier helps manufacturers reduce unexpected downtime and avoid sudden production interruptions. More stable equipment performance also supports smoother daily operations.<\/p>\n<p data-section-id=\"weufdp\" data-start=\"1653\" data-end=\"1706\"><strong>5. Optimised Asset Lifespan and Maintenance Costs<br data-start=\"1274\" data-end=\"1277\" \/><\/strong>Predictive maintenance ensures assets are serviced only when needed, reducing unnecessary maintenance while extending equipment lifespan.<\/p>\n<h2 data-start=\"307\" data-end=\"377\"><strong>Challenges in Predictive Maintenance and How to Solve It<\/strong><\/h2>\n<p data-start=\"0\" data-end=\"203\">Even well-funded predictive maintenance programs can struggle without strong execution. Reliable data, team adoption, and system integration often matter just as much as the monitoring technology itself.<\/p>\n<p data-start=\"205\" data-end=\"340\">Addressing these challenges early makes predictive maintenance programs easier to scale and maintain over time.<\/p>\n<h3 data-section-id=\"1gho5l\" data-start=\"342\" data-end=\"380\"><strong>1. Data overload and alert fatigue<\/strong><\/h3>\n<p data-start=\"382\" data-end=\"569\">Large sensor deployments can generate overwhelming amounts of data and notifications. When teams receive too many low-priority alerts, important warnings are more likely to be overlooked.<\/p>\n<p data-start=\"571\" data-end=\"697\"><strong data-start=\"571\" data-end=\"586\">Mitigation:<\/strong> Use edge processing and alert filtering to reduce unnecessary notifications and prioritise critical anomalies.<\/p>\n<h3 data-section-id=\"l4xds3\" data-start=\"699\" data-end=\"745\"><strong>2. Cultural resistance and capability gaps<\/strong><\/h3>\n<p data-start=\"747\" data-end=\"931\">Predictive maintenance changes how maintenance teams make decisions. Some technicians may hesitate to rely on system-generated insights, especially during the early stages of adoption.<\/p>\n<p data-start=\"933\" data-end=\"1068\"><strong data-start=\"933\" data-end=\"948\">Mitigation:<\/strong> Involve frontline teams early, provide practical training, and highlight early operational improvements to build trust.<\/p>\n<h3 data-section-id=\"1bo1vdf\" data-start=\"1070\" data-end=\"1118\"><strong>3. Poor data quality and network instability<\/strong><\/h3>\n<p data-start=\"1120\" data-end=\"1314\">Predictive models depend heavily on accurate and stable sensor data. In industrial environments, signal interference, poor calibration, or unreliable connectivity can reduce monitoring accuracy.<\/p>\n<p data-start=\"1316\" data-end=\"1454\" data-is-last-node=\"\" data-is-only-node=\"\"><strong data-start=\"1316\" data-end=\"1331\">Mitigation:<\/strong> Maintain regular sensor calibration schedules and invest in network infrastructure that supports stable data transmission.<\/p>\n<h2 data-start=\"2257\" data-end=\"2304\"><strong>Advanced Best Practices for Future Proofing<\/strong><\/h2>\n<p data-start=\"0\" data-end=\"167\">As predictive maintenance programs mature, many businesses shift their focus from basic monitoring toward improving long-term performance and operational coordination.<\/p>\n<h3 data-section-id=\"wc7y62\" data-start=\"169\" data-end=\"200\"><strong>1. Leveraging digital twins<\/strong><\/h3>\n<p data-start=\"202\" data-end=\"419\">Digital twins create virtual versions of physical assets using real-time operational data. Engineers can test scenarios, monitor performance changes, and predict degradation without interrupting production activities.<\/p>\n<h3 data-section-id=\"7sujzb\" data-start=\"421\" data-end=\"479\"><strong>2. Deep Asset Management Software and CMMS Integration<\/strong><\/h3>\n<p data-start=\"481\" data-end=\"799\">Predictive insights become more useful when connected with an <a href=\"https:\/\/www.hashmicro.com\/au\/smart-asset-solution\">asset maintenance solution<\/a> and CMMS platform. Alerts can automatically trigger work orders, spare parts checks, and maintenance scheduling workflows.<\/p>\n<h3 data-section-id=\"1ma5zp4\" data-start=\"801\" data-end=\"835\"><strong>3. Continuous model refinement<\/strong><\/h3>\n<p data-start=\"837\" data-end=\"1054\" data-is-last-node=\"\" data-is-only-node=\"\">Machine learning models need regular refinement as operating conditions change over time. Many businesses also use technician feedback after inspections or repairs to improve alert accuracy and reduce false positives.<\/p>\n<h2><strong>Conclusion<\/strong><\/h2>\n<p data-start=\"0\" data-end=\"298\">Predictive maintenance helps businesses reduce downtime, improve equipment reliability, and make maintenance planning more proactive. As equipment networks grow larger and more connected, many businesses are relying on real-time monitoring to stay ahead of maintenance issues.<\/p>\n<p data-start=\"300\" data-end=\"621\">Successful implementation depends on more than sensors alone. Businesses also need reliable data, practical workflows, and systems that can scale alongside operational growth.<\/p>\n<p data-start=\"300\" data-end=\"621\">Taking a structured approach helps businesses avoid fragmented deployments and improve long-term maintenance performance. If you want help evaluating the right solution, <a href=\"https:\/\/www.hashmicro.com\/au\/free-product-tour\/\">get expert advice without cost.<\/a><\/p>\n<p data-start=\"623\" data-end=\"908\" data-is-last-node=\"\" data-is-only-node=\"\"><span data-sheets-root=\"1\"><a href=\"https:\/\/www.hashmicro.com\/au\/hash-manufacturing-software?medium=moneysite-banner\" target=\"_blank\"><img decoding=\"async\" loading=\"lazy\" width=\"712\" src=\"https:\/\/www.hashmicro.com\/blog\/wp-content\/uploads\/2025\/06\/Manufacturing.webp\" alt=\"Hash Manufacturing Automation\"><\/a><\/span><\/p>\n<h2><strong>Frequently Asked Questions About Predictive Maintenance<\/strong><\/h2>\n<ul class=\"bottom_faq\">\n<li>\n<details>\n<summary><strong>What is predictive maintenance and how does it work?<\/strong><\/summary>\n<p>Predictive maintenance is a data driven strategy that uses IoT sensors and analytics to monitor equipment condition in real time. By detecting early signs of wear or anomalies, businesses can perform maintenance at the optimal time before failures occur.<\/p>\n<\/details>\n<\/li>\n<li>\n<details>\n<summary><strong>How does predictive maintenance improve equipment reliability?<\/strong><\/summary>\n<p>Predictive maintenance improves reliability by helping maintenance teams catch problems before equipment fails unexpectedly. This reduces unexpected breakdowns, stabilises production performance, and extends overall asset lifespan.<\/p>\n<\/details>\n<\/li>\n<li>\n<details>\n<summary><strong>What KPIs should be tracked in a predictive maintenance program?<\/strong><\/summary>\n<p>Key KPIs typically include Mean Time Between Failures (MTBF), Mean Time to Repair (MTTR), Overall Equipment Effectiveness (OEE), and Planned Maintenance Percentage (PMP). Monitoring these metrics helps businesses measure reliability improvements and program ROI.<\/p>\n<\/details>\n<\/li>\n<li>\n<details>\n<summary><strong>Can predictive maintenance be integrated with CMMS or ERP systems?<\/strong><\/summary>\n<p>Yes. Modern predictive maintenance platforms are commonly integrated with CMMS or ERP systems to automate work orders, check spare parts availability, and synchronise maintenance planning. This integration ensures predictive insights translate into timely operational action.<\/p>\n<\/details>\n<\/li>\n<\/ul>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [{\n    \"@type\": \"Question\",\n    \"name\": \"What is predictive maintenance and how does it work?\",\n    \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Predictive maintenance is a data-driven strategy that uses IoT sensors and analytics to monitor equipment condition in real time. By detecting early signs of wear or anomalies, organisations can perform maintenance at the optimal time before failures occur.\"\n    }\n  },{\n    \"@type\": \"Question\",\n    \"name\": \"How does predictive maintenance improve equipment reliability?\",\n    \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Predictive maintenance improves reliability by identifying potential failures early and enabling planned interventions. This reduces unexpected breakdowns, stabilises production performance, and extends overall asset lifespan.\"\n    }\n  },{\n    \"@type\": \"Question\",\n    \"name\": \"What KPIs should be tracked in a predictive maintenance program?\",\n    \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Key KPIs typically include Mean Time Between Failures (MTBF), Mean Time to Repair (MTTR), Overall Equipment Effectiveness (OEE), and Planned Maintenance Percentage (PMP). Monitoring these metrics helps organisations measure reliability improvements and program ROI.\"\n    }\n  },{\n    \"@type\": \"Question\",\n    \"name\": \"Can predictive maintenance be integrated with CMMS or ERP systems?\",\n    \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Yes. Modern predictive maintenance platforms are commonly integrated with CMMS or ERP systems to automate work orders, check spare parts availability, and synchronise maintenance planning. This integration ensures predictive insights translate into timely operational action.\"\n    }\n  }]\n}\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Australian businesses operating mines, factories, and large facilities face growing pressure to reduce downtime and keep equipment running reliably. In remote operations, even one unexpected failure can disrupt production and increase repair costs. To reduce these risks, many companies are moving from reactive maintenance to predictive maintenance supported by real-time monitoring and analytics. Modern sensors [&hellip;]<\/p>\n","protected":false},"author":53,"featured_media":835,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[86],"tags":[],"class_list":{"0":"post-743","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-asset-2"},"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.6 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>What Is Predictive Maintenance in the Australian Industry?<\/title>\n<meta name=\"description\" content=\"Predictive maintenance uses real-time data and analytics to reduce downtime, extend asset lifespan, and improve operational efficiency.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What Is Predictive Maintenance in the Australian Industry?\" \/>\n<meta property=\"og:description\" content=\"Predictive maintenance uses real-time data and analytics to reduce downtime, extend asset lifespan, and improve operational efficiency.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/\" \/>\n<meta property=\"og:site_name\" content=\"HashMicro Australia\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-26T06:32:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-20T03:27:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-hashmicro.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"974\" \/>\n\t<meta property=\"og:image:height\" content=\"549\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Mirella Vaughan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mirella Vaughan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/\"},\"author\":{\"name\":\"Mirella Vaughan\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/15ce60c4d68eef9682ff25b1c4aac5b4\"},\"headline\":\"What Is Predictive Maintenance in the Australian Industry?\",\"datePublished\":\"2026-02-26T06:32:04+00:00\",\"dateModified\":\"2026-05-20T03:27:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/\"},\"wordCount\":2355,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/predictive-maintenance-hashmicro.jpg\",\"articleSection\":[\"Asset\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/\",\"name\":\"What Is Predictive Maintenance in the Australian Industry?\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/predictive-maintenance-hashmicro.jpg\",\"datePublished\":\"2026-02-26T06:32:04+00:00\",\"dateModified\":\"2026-05-20T03:27:04+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/15ce60c4d68eef9682ff25b1c4aac5b4\"},\"description\":\"Predictive maintenance uses real-time data and analytics to reduce downtime, extend asset lifespan, and improve operational efficiency.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/predictive-maintenance-hashmicro.jpg\",\"contentUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/predictive-maintenance-hashmicro.jpg\",\"width\":974,\"height\":549,\"caption\":\"predictive maintenance for industrial equipment using real time monitoring\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/predictive-maintenance\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"What Is Predictive Maintenance in the Australian Industry?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/\",\"name\":\"HashMicro Australia\",\"description\":\"Business Management Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/#\\\/schema\\\/person\\\/15ce60c4d68eef9682ff25b1c4aac5b4\",\"name\":\"Mirella Vaughan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Mirella-Vaughan-96x96.webp\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Mirella-Vaughan-96x96.webp\",\"contentUrl\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/cropped-Mirella-Vaughan-96x96.webp\",\"caption\":\"Mirella Vaughan\"},\"description\":\"As a Maintenance &amp; Asset Records Coordinator, I write asset management content that turns asset lifecycle concepts into practical processes teams can apply across finance and operations.\",\"url\":\"https:\\\/\\\/www.hashmicro.com\\\/au\\\/blog\\\/author\\\/mirella-vaughan\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"What Is Predictive Maintenance in the Australian Industry?","description":"Predictive maintenance uses real-time data and analytics to reduce downtime, extend asset lifespan, and improve operational efficiency.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/","og_locale":"en_US","og_type":"article","og_title":"What Is Predictive Maintenance in the Australian Industry?","og_description":"Predictive maintenance uses real-time data and analytics to reduce downtime, extend asset lifespan, and improve operational efficiency.","og_url":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/","og_site_name":"HashMicro Australia","article_published_time":"2026-02-26T06:32:04+00:00","article_modified_time":"2026-05-20T03:27:04+00:00","og_image":[{"width":974,"height":549,"url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-hashmicro.jpg","type":"image\/jpeg"}],"author":"Mirella Vaughan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Mirella Vaughan","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#article","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/"},"author":{"name":"Mirella Vaughan","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/15ce60c4d68eef9682ff25b1c4aac5b4"},"headline":"What Is Predictive Maintenance in the Australian Industry?","datePublished":"2026-02-26T06:32:04+00:00","dateModified":"2026-05-20T03:27:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/"},"wordCount":2355,"commentCount":0,"image":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-hashmicro.jpg","articleSection":["Asset"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/","url":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/","name":"What Is Predictive Maintenance in the Australian Industry?","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#primaryimage"},"image":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-hashmicro.jpg","datePublished":"2026-02-26T06:32:04+00:00","dateModified":"2026-05-20T03:27:04+00:00","author":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/15ce60c4d68eef9682ff25b1c4aac5b4"},"description":"Predictive maintenance uses real-time data and analytics to reduce downtime, extend asset lifespan, and improve operational efficiency.","breadcrumb":{"@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#primaryimage","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-hashmicro.jpg","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/predictive-maintenance-hashmicro.jpg","width":974,"height":549,"caption":"predictive maintenance for industrial equipment using real time monitoring"},{"@type":"BreadcrumbList","@id":"https:\/\/www.hashmicro.com\/au\/blog\/predictive-maintenance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.hashmicro.com\/au\/blog\/"},{"@type":"ListItem","position":2,"name":"What Is Predictive Maintenance in the Australian Industry?"}]},{"@type":"WebSite","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#website","url":"https:\/\/www.hashmicro.com\/au\/blog\/","name":"HashMicro Australia","description":"Business Management Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.hashmicro.com\/au\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.hashmicro.com\/au\/blog\/#\/schema\/person\/15ce60c4d68eef9682ff25b1c4aac5b4","name":"Mirella Vaughan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Mirella-Vaughan-96x96.webp","url":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Mirella-Vaughan-96x96.webp","contentUrl":"https:\/\/www.hashmicro.com\/au\/blog\/wp-content\/uploads\/2026\/02\/cropped-Mirella-Vaughan-96x96.webp","caption":"Mirella Vaughan"},"description":"As a Maintenance &amp; Asset Records Coordinator, I write asset management content that turns asset lifecycle concepts into practical processes teams can apply across finance and operations.","url":"https:\/\/www.hashmicro.com\/au\/blog\/author\/mirella-vaughan\/"}]}},"_links":{"self":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/comments?post=743"}],"version-history":[{"count":30,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/743\/revisions"}],"predecessor-version":[{"id":4594,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/posts\/743\/revisions\/4594"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media\/835"}],"wp:attachment":[{"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/media?parent=743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/categories?post=743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hashmicro.com\/au\/blog\/wp-json\/wp\/v2\/tags?post=743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}