{"id":9848,"date":"2026-07-31T08:55:39","date_gmt":"2026-07-31T08:55:39","guid":{"rendered":"https:\/\/tradegoai.app\/?post_type=tools&#038;p=9848"},"modified":"2026-07-31T08:55:39","modified_gmt":"2026-07-31T08:55:39","slug":"cong-cu-tinh-xep-hang-len-pallet","status":"publish","type":"tools","link":"https:\/\/tradegoai.app\/vi\/tools\/pallet-loading-calculator\/","title":{"rendered":"C\u00f4ng c\u1ee5 t\u00ednh x\u1ebfp h\u00e0ng l\u00ean pallet"},"content":{"rendered":"    <main\n        id=\"tga-pallet-loading-1\"\n        class=\"tga-pallet-tool\"\n        aria-labelledby=\"tga-pallet-loading-1-title\"\n    >\n        <style>\n            #tga-pallet-loading-1 {\n                --tga-tool-navy: #0f1831;\n                --tga-tool-purple: #6528f7;\n                --tga-tool-purple-dark: #501bd8;\n                --tga-tool-lilac: #f2efff;\n                --tga-tool-muted: #64748b;\n                --tga-tool-line: #e2e8f0;\n                --tga-tool-white: #ffffff;\n                --tga-tool-success: #047857;\n                --tga-tool-warning: #a16207;\n                --tga-tool-danger: #b91c1c;\n                width: 100%;\n                max-width: 1180px;\n                margin: 44px auto 72px;\n                padding: 0 22px;\n                color: var(--tga-tool-navy);\n                font-family: inherit;\n                box-sizing: border-box;\n            }\n            #tga-pallet-loading-1 *,\n            #tga-pallet-loading-1 *::before,\n            #tga-pallet-loading-1 *::after {\n                box-sizing: border-box;\n            }\n            #tga-pallet-loading-1 .tga-pallet-hero {\n                position: relative;\n                overflow: hidden;\n                padding: 46px 48px;\n                border-radius: 22px;\n                background:\n                    radial-gradient(circle at 88% 18%, rgba(101, 40, 247, .78), transparent 34%),\n                    linear-gradient(135deg, #081127 0%, #131d42 100%);\n                color: var(--tga-tool-white);\n            }\n            #tga-pallet-loading-1 .tga-pallet-hero::after {\n                position: absolute;\n                right: -78px;\n                bottom: -118px;\n                width: 320px;\n                height: 320px;\n                border: 1px solid rgba(255, 255, 255, .16);\n                border-radius: 50%;\n                content: \"\";\n            }\n            #tga-pallet-loading-1 .tga-pallet-eyebrow {\n                position: relative;\n                z-index: 1;\n                margin: 0 0 12px;\n                color: #cbbcff;\n                font-size: 12px;\n                font-weight: 800;\n                letter-spacing: .12em;\n                text-transform: uppercase;\n            }\n            #tga-pallet-loading-1 .tga-pallet-hero h1 {\n                position: relative;\n                z-index: 1;\n                max-width: 900px;\n                margin: 0 0 14px;\n                color: var(--tga-tool-white);\n                font-size: clamp(36px, 5.5vw, 62px);\n                line-height: 1.03;\n                letter-spacing: -.04em;\n            }\n            #tga-pallet-loading-1 .tga-pallet-hero p {\n                position: relative;\n                z-index: 1;\n                max-width: 780px;\n                margin: 0;\n                color: #dce4ff;\n                font-size: 18px;\n                line-height: 1.65;\n            }\n            #tga-pallet-loading-1 .tga-pallet-workspace {\n                display: grid;\n                grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);\n                gap: 24px;\n                margin-top: 28px;\n                align-items: start;\n            }\n            #tga-pallet-loading-1 .tga-pallet-panel,\n            #tga-pallet-loading-1 .tga-pallet-section {\n                border: 1px solid var(--tga-tool-line);\n                border-radius: 18px;\n                background: var(--tga-tool-white);\n                box-shadow: 0 16px 45px rgba(15, 24, 49, .06);\n            }\n            #tga-pallet-loading-1 .tga-pallet-panel {\n                padding: 28px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-section {\n                margin-top: 28px;\n                padding: 30px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-panel h2,\n            #tga-pallet-loading-1 .tga-pallet-section h2 {\n                margin: 0 0 8px;\n                color: var(--tga-tool-navy);\n                font-size: 25px;\n                line-height: 1.25;\n                letter-spacing: -.02em;\n            }\n            #tga-pallet-loading-1 .tga-pallet-intro,\n            #tga-pallet-loading-1 .tga-pallet-section > p {\n                margin: 0;\n                color: var(--tga-tool-muted);\n                line-height: 1.7;\n            }\n            #tga-pallet-loading-1 .tga-pallet-fieldset {\n                margin: 22px 0 0;\n                padding: 0;\n                border: 0;\n            }\n            #tga-pallet-loading-1 .tga-pallet-fieldset legend {\n                width: 100%;\n                margin-bottom: 13px;\n                padding: 0 0 9px;\n                border-bottom: 1px solid var(--tga-tool-line);\n                color: var(--tga-tool-navy);\n                font-size: 15px;\n                font-weight: 800;\n            }\n            #tga-pallet-loading-1 .tga-pallet-grid {\n                display: grid;\n                grid-template-columns: repeat(2, minmax(0, 1fr));\n                gap: 14px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-field-wide {\n                grid-column: 1 \/ -1;\n            }\n            #tga-pallet-loading-1 label {\n                display: block;\n                margin: 0 0 7px;\n                color: #334155;\n                font-size: 13px;\n                font-weight: 700;\n            }\n            #tga-pallet-loading-1 input,\n            #tga-pallet-loading-1 select {\n                width: 100%;\n                min-height: 48px;\n                margin: 0;\n                padding: 10px 13px;\n                border: 1px solid #cbd5e1;\n                border-radius: 10px;\n                outline: 0;\n                background: var(--tga-tool-white);\n                color: var(--tga-tool-navy);\n                font: inherit;\n                font-size: 15px;\n            }\n            #tga-pallet-loading-1 input:focus,\n            #tga-pallet-loading-1 select:focus {\n                border-color: var(--tga-tool-purple);\n                box-shadow: 0 0 0 3px rgba(101, 40, 247, .12);\n            }\n            #tga-pallet-loading-1 input:disabled {\n                background: #f8fafc;\n                color: #64748b;\n                cursor: not-allowed;\n            }\n            #tga-pallet-loading-1 .tga-pallet-help {\n                display: block;\n                margin-top: 6px;\n                color: var(--tga-tool-muted);\n                font-size: 12px;\n                line-height: 1.45;\n            }\n            #tga-pallet-loading-1 .tga-pallet-check {\n                display: flex;\n                gap: 10px;\n                align-items: flex-start;\n                min-height: 48px;\n                padding: 12px 13px;\n                border: 1px solid var(--tga-tool-line);\n                border-radius: 10px;\n                background: #f8fafc;\n            }\n            #tga-pallet-loading-1 .tga-pallet-check input {\n                flex: 0 0 auto;\n                width: 18px;\n                min-height: 18px;\n                margin: 2px 0 0;\n                accent-color: var(--tga-tool-purple);\n            }\n            #tga-pallet-loading-1 .tga-pallet-check label {\n                margin: 0;\n                line-height: 1.45;\n            }\n            #tga-pallet-loading-1 .tga-pallet-error {\n                min-height: 22px;\n                margin: 14px 0 0;\n                color: var(--tga-tool-danger);\n                font-size: 13px;\n                font-weight: 700;\n                line-height: 1.5;\n            }\n            #tga-pallet-loading-1 .tga-pallet-actions {\n                display: flex;\n                flex-wrap: wrap;\n                gap: 10px;\n                margin-top: 16px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-button {\n                display: inline-flex;\n                align-items: center;\n                justify-content: center;\n                min-height: 42px;\n                padding: 9px 14px;\n                border: 1px solid #cbd5e1;\n                border-radius: 9px;\n                background: var(--tga-tool-white);\n                color: var(--tga-tool-navy);\n                cursor: pointer;\n                font: inherit;\n                font-size: 14px;\n                font-weight: 800;\n                line-height: 1.2;\n                text-decoration: none;\n                transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;\n            }\n            #tga-pallet-loading-1 .tga-pallet-button:hover {\n                border-color: var(--tga-tool-purple);\n                transform: translateY(-1px);\n            }\n            #tga-pallet-loading-1 .tga-pallet-button:focus-visible,\n            #tga-pallet-loading-1 summary:focus-visible,\n            #tga-pallet-loading-1 a:focus-visible {\n                outline: 3px solid rgba(101, 40, 247, .28);\n                outline-offset: 3px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-primary {\n                min-height: 50px;\n                padding: 11px 19px;\n                border-color: var(--tga-tool-purple);\n                background: var(--tga-tool-purple);\n                color: var(--tga-tool-white);\n            }\n            #tga-pallet-loading-1 .tga-pallet-primary:hover {\n                border-color: var(--tga-tool-purple-dark);\n                background: var(--tga-tool-purple-dark);\n            }\n            #tga-pallet-loading-1 .tga-pallet-button:disabled {\n                border-color: #e2e8f0;\n                background: #f1f5f9;\n                color: #94a3b8;\n                cursor: not-allowed;\n                transform: none;\n            }\n            #tga-pallet-loading-1 .tga-pallet-result {\n                min-height: 560px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-empty {\n                margin-top: 22px;\n                padding: 28px 22px;\n                border: 1px dashed #cbd5e1;\n                border-radius: 14px;\n                background: #f8fafc;\n                color: var(--tga-tool-muted);\n                line-height: 1.7;\n                text-align: center;\n            }\n            #tga-pallet-loading-1 .tga-pallet-output[hidden],\n            #tga-pallet-loading-1 .tga-pallet-empty[hidden],\n            #tga-pallet-loading-1 [data-error-message][hidden],\n            #tga-pallet-loading-1 [data-status-message][hidden],\n            #tga-pallet-loading-1 [data-reset-status][hidden] {\n                display: none !important;\n            }\n            #tga-pallet-loading-1 .tga-pallet-metrics {\n                display: grid;\n                grid-template-columns: repeat(2, minmax(0, 1fr));\n                gap: 12px;\n                margin-top: 20px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-metric {\n                min-width: 0;\n                padding: 15px;\n                border: 1px solid var(--tga-tool-line);\n                border-radius: 12px;\n                background: #fbfdff;\n            }\n            #tga-pallet-loading-1 .tga-pallet-metric span {\n                display: block;\n                color: var(--tga-tool-muted);\n                font-size: 12px;\n                font-weight: 700;\n                line-height: 1.4;\n            }\n            #tga-pallet-loading-1 .tga-pallet-metric strong {\n                display: block;\n                margin-top: 5px;\n                color: var(--tga-tool-navy);\n                font-size: 22px;\n                line-height: 1.25;\n                overflow-wrap: anywhere;\n            }\n            #tga-pallet-loading-1 .tga-pallet-plan {\n                margin-top: 15px;\n                padding: 16px;\n                border-left: 4px solid var(--tga-tool-purple);\n                border-radius: 10px;\n                background: var(--tga-tool-lilac);\n                color: #334155;\n                line-height: 1.65;\n            }\n            #tga-pallet-loading-1 .tga-pallet-plan strong {\n                color: var(--tga-tool-navy);\n            }\n            #tga-pallet-loading-1 .tga-pallet-status {\n                min-height: 22px;\n                margin: 12px 0 0;\n                color: var(--tga-tool-success);\n                font-size: 13px;\n                font-weight: 700;\n                line-height: 1.5;\n            }\n            #tga-pallet-loading-1 .tga-pallet-notes {\n                display: grid;\n                grid-template-columns: repeat(3, minmax(0, 1fr));\n                gap: 14px;\n                margin-top: 20px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-note {\n                padding: 18px;\n                border: 1px solid var(--tga-tool-line);\n                border-radius: 13px;\n                background: #fbfdff;\n            }\n            #tga-pallet-loading-1 .tga-pallet-note h3 {\n                margin: 0 0 7px;\n                color: var(--tga-tool-navy);\n                font-size: 16px;\n                line-height: 1.35;\n            }\n            #tga-pallet-loading-1 .tga-pallet-note p {\n                margin: 0;\n                color: var(--tga-tool-muted);\n                font-size: 14px;\n                line-height: 1.65;\n            }\n            #tga-pallet-loading-1 .tga-pallet-cta {\n                display: flex;\n                gap: 28px;\n                align-items: center;\n                justify-content: space-between;\n                margin-top: 28px;\n                padding: 34px 38px;\n                border-radius: 18px;\n                background:\n                    radial-gradient(circle at 88% 18%, rgba(101, 40, 247, .65), transparent 38%),\n                    linear-gradient(135deg, #081127 0%, #131d42 100%);\n                color: var(--tga-tool-white);\n            }\n            #tga-pallet-loading-1 .tga-pallet-cta h2 {\n                margin: 0 0 8px;\n                color: var(--tga-tool-white);\n                font-size: 28px;\n                line-height: 1.25;\n            }\n            #tga-pallet-loading-1 .tga-pallet-cta p {\n                max-width: 720px;\n                margin: 0;\n                color: #dce4ff;\n                line-height: 1.7;\n            }\n            #tga-pallet-loading-1 .tga-pallet-cta a {\n                flex: 0 0 auto;\n                display: inline-flex;\n                align-items: center;\n                justify-content: center;\n                min-height: 50px;\n                padding: 11px 19px;\n                border-radius: 10px;\n                background: var(--tga-tool-white);\n                color: var(--tga-tool-navy);\n                font-weight: 800;\n                text-decoration: none;\n            }\n            #tga-pallet-loading-1 .tga-pallet-faq-list {\n                display: grid;\n                gap: 10px;\n                margin-top: 20px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-faq-list details {\n                border: 1px solid var(--tga-tool-line);\n                border-radius: 12px;\n                background: var(--tga-tool-white);\n            }\n            #tga-pallet-loading-1 .tga-pallet-faq-list summary {\n                padding: 16px 18px;\n                color: var(--tga-tool-navy);\n                cursor: pointer;\n                font-weight: 800;\n                line-height: 1.45;\n            }\n            #tga-pallet-loading-1 .tga-pallet-faq-list details p {\n                margin: 0;\n                padding: 0 18px 18px;\n                color: var(--tga-tool-muted);\n                line-height: 1.7;\n            }\n            #tga-pallet-loading-1 .tga-pallet-related-grid {\n                display: grid;\n                grid-template-columns: repeat(3, minmax(0, 1fr));\n                gap: 16px;\n                margin-top: 20px;\n            }\n            #tga-pallet-loading-1 .tga-pallet-related {\n                display: block;\n                min-width: 0;\n                padding: 20px;\n                border: 1px solid var(--tga-tool-line);\n                border-radius: 13px;\n                background: var(--tga-tool-white);\n                color: var(--tga-tool-navy);\n                text-decoration: none;\n                transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;\n            }\n            #tga-pallet-loading-1 .tga-pallet-related:hover,\n            #tga-pallet-loading-1 .tga-pallet-related:focus-visible {\n                border-color: var(--tga-tool-purple);\n                box-shadow: 0 10px 24px rgba(15, 24, 49, .08);\n                transform: translateY(-2px);\n            }\n            #tga-pallet-loading-1 .tga-pallet-related strong {\n                display: block;\n                margin-bottom: 7px;\n                color: var(--tga-tool-navy);\n                font-size: 16px;\n                line-height: 1.35;\n            }\n            #tga-pallet-loading-1 .tga-pallet-related span {\n                display: block;\n                color: var(--tga-tool-muted);\n                font-size: 14px;\n                line-height: 1.6;\n            }\n            #tga-pallet-loading-1 .tga-pallet-i18n {\n                position: absolute !important;\n                width: 1px !important;\n                height: 1px !important;\n                overflow: hidden !important;\n                clip: rect(0 0 0 0) !important;\n                white-space: nowrap !important;\n            }\n            @media (max-width: 900px) {\n                #tga-pallet-loading-1 .tga-pallet-workspace {\n                    grid-template-columns: minmax(0, 1fr);\n                }\n                #tga-pallet-loading-1 .tga-pallet-result {\n                    min-height: 0;\n                }\n                #tga-pallet-loading-1 .tga-pallet-notes,\n                #tga-pallet-loading-1 .tga-pallet-related-grid {\n                    grid-template-columns: minmax(0, 1fr);\n                }\n                #tga-pallet-loading-1 .tga-pallet-cta {\n                    align-items: flex-start;\n                    flex-direction: column;\n                }\n            }\n            @media (max-width: 600px) {\n                #tga-pallet-loading-1 {\n                    margin-top: 28px;\n                    padding: 0 0px;\n                }\n                #tga-pallet-loading-1 .tga-pallet-hero {\n                    padding: 31px 23px;\n                    border-radius: 16px;\n                }\n                #tga-pallet-loading-1 .tga-pallet-hero h1 {\n                    font-size: 39px;\n                }\n                #tga-pallet-loading-1 .tga-pallet-hero p {\n                    font-size: 16px;\n                }\n                #tga-pallet-loading-1 .tga-pallet-panel,\n                #tga-pallet-loading-1 .tga-pallet-section {\n                    padding: 22px 18px;\n                }\n                #tga-pallet-loading-1 .tga-pallet-grid,\n                #tga-pallet-loading-1 .tga-pallet-metrics {\n                    grid-template-columns: minmax(0, 1fr);\n                }\n                #tga-pallet-loading-1 input,\n                #tga-pallet-loading-1 select {\n                    font-size: 16px;\n                }\n                #tga-pallet-loading-1 .tga-pallet-actions {\n                    display: grid;\n                    grid-template-columns: minmax(0, 1fr);\n                }\n                #tga-pallet-loading-1 .tga-pallet-button,\n                #tga-pallet-loading-1 .tga-pallet-cta a {\n                    width: 100%;\n                }\n                #tga-pallet-loading-1 .tga-pallet-cta {\n                    padding: 28px 22px;\n                }\n            }\n        <\/style>\n\n        <section class=\"tga-pallet-hero\">\n            <p class=\"tga-pallet-eyebrow\">Plan Each Pallet Before Packing<\/p>\n            <h1 id=\"tga-pallet-loading-1-title\">Pallet Loading Calculator<\/h1>\n            <p>Estimate cartons per layer, stack limits, pallet gross weight, footprint use, and the number of pallets needed for a shipment.<\/p>\n        <\/section>\n\n        <section class=\"tga-pallet-workspace\" aria-label=\"Pallet loading workspace\">\n            <form class=\"tga-pallet-panel tga-pallet-form\" novalidate>\n                <h2>Enter Pallet and Carton Details<\/h2>\n                <p class=\"tga-pallet-intro\">Use packed carton dimensions and the limits that apply to your warehouse or carrier.<\/p>\n\n                <fieldset class=\"tga-pallet-fieldset\">\n                    <legend>Pallet<\/legend>\n                    <div class=\"tga-pallet-grid\">\n                        <div class=\"tga-pallet-field-wide\">\n                            <label for=\"tga-pallet-loading-1-preset\">Pallet preset<\/label>\n                            <select id=\"tga-pallet-loading-1-preset\" data-field=\"preset\">\n                                <option value=\"eur\">EUR \/ EPAL 1 \u2014 1200 \u00d7 800 mm<\/option>\n                                <option value=\"iso\">ISO \u2014 1200 \u00d7 1000 mm<\/option>\n                                <option value=\"us\">North America \u2014 1219 \u00d7 1016 mm<\/option>\n                                <option value=\"custom\">Custom pallet size<\/option>\n                            <\/select>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-pallet-length\">Pallet length (mm)<\/label>\n                            <input id=\"tga-pallet-loading-1-pallet-length\" data-field=\"palletLength\" type=\"number\" value=\"1200\" min=\"100\" max=\"5000\" step=\"1\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-pallet-width\">Pallet width (mm)<\/label>\n                            <input id=\"tga-pallet-loading-1-pallet-width\" data-field=\"palletWidth\" type=\"number\" value=\"800\" min=\"100\" max=\"5000\" step=\"1\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-pallet-height\">Pallet height (mm)<\/label>\n                            <input id=\"tga-pallet-loading-1-pallet-height\" data-field=\"palletHeight\" type=\"number\" value=\"144\" min=\"1\" max=\"1000\" step=\"1\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-pallet-tare\">Pallet tare weight (kg)<\/label>\n                            <input id=\"tga-pallet-loading-1-pallet-tare\" data-field=\"palletTare\" type=\"number\" value=\"25\" min=\"0\" max=\"500\" step=\"0.1\" inputmode=\"decimal\" required>\n                        <\/div>\n                    <\/div>\n                <\/fieldset>\n\n                <fieldset class=\"tga-pallet-fieldset\">\n                    <legend>Carton and shipment<\/legend>\n                    <div class=\"tga-pallet-grid\">\n                        <div>\n                            <label for=\"tga-pallet-loading-1-carton-length\">Carton length (mm)<\/label>\n                            <input id=\"tga-pallet-loading-1-carton-length\" data-field=\"cartonLength\" type=\"number\" value=\"400\" min=\"1\" max=\"5000\" step=\"1\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-carton-width\">Carton width (mm)<\/label>\n                            <input id=\"tga-pallet-loading-1-carton-width\" data-field=\"cartonWidth\" type=\"number\" value=\"300\" min=\"1\" max=\"5000\" step=\"1\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-carton-height\">Carton height (mm)<\/label>\n                            <input id=\"tga-pallet-loading-1-carton-height\" data-field=\"cartonHeight\" type=\"number\" value=\"250\" min=\"1\" max=\"5000\" step=\"1\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-carton-weight\">Carton gross weight (kg)<\/label>\n                            <input id=\"tga-pallet-loading-1-carton-weight\" data-field=\"cartonWeight\" type=\"number\" value=\"12\" min=\"0.01\" max=\"10000\" step=\"0.01\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-total-cartons\">Total cartons<\/label>\n                            <input id=\"tga-pallet-loading-1-total-cartons\" data-field=\"totalCartons\" type=\"number\" value=\"240\" min=\"1\" max=\"1000000\" step=\"1\" inputmode=\"numeric\" required>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-max-height\">Maximum loaded height (mm)<\/label>\n                            <input id=\"tga-pallet-loading-1-max-height\" data-field=\"maxHeight\" type=\"number\" value=\"1800\" min=\"1\" max=\"10000\" step=\"1\" inputmode=\"decimal\" required>\n                            <span class=\"tga-pallet-help\">Includes the pallet height.<\/span>\n                        <\/div>\n                        <div>\n                            <label for=\"tga-pallet-loading-1-max-weight\">Maximum pallet gross weight (kg)<\/label>\n                            <input id=\"tga-pallet-loading-1-max-weight\" data-field=\"maxWeight\" type=\"number\" value=\"1000\" min=\"0.01\" max=\"100000\" step=\"0.1\" inputmode=\"decimal\" required>\n                        <\/div>\n                        <div class=\"tga-pallet-check\">\n                            <input id=\"tga-pallet-loading-1-rotation\" data-field=\"rotation\" type=\"checkbox\" checked>\n                            <label for=\"tga-pallet-loading-1-rotation\">Allow a uniform 90\u00b0 carton rotation<\/label>\n                        <\/div>\n                    <\/div>\n                <\/fieldset>\n\n                <p class=\"tga-pallet-error\" data-role=\"error\" role=\"alert\" aria-live=\"assertive\">\n                    <span data-error-message=\"invalid\" hidden>Enter positive values within the displayed limits for every required field.<\/span>\n                    <span data-error-message=\"heightError\" hidden>Maximum loaded height must be greater than the pallet height.<\/span>\n                    <span data-error-message=\"weightError\" hidden>Maximum pallet gross weight must be greater than the pallet tare weight.<\/span>\n                    <span data-error-message=\"fitError\" hidden>The carton footprint does not fit on this pallet without overhang.<\/span>\n                    <span data-error-message=\"limitError\" hidden>The selected height or weight limit does not allow one complete carton.<\/span>\n                <\/p>\n                <div class=\"tga-pallet-actions\">\n                    <button class=\"tga-pallet-button tga-pallet-primary\" type=\"submit\">Calculate Pallet Load<\/button>\n                    <button class=\"tga-pallet-button\" data-action=\"reset\" type=\"button\">Reset<\/button>\n                <\/div>\n            <\/form>\n\n            <section class=\"tga-pallet-panel tga-pallet-result\" aria-labelledby=\"tga-pallet-loading-1-results-title\">\n                <h2 id=\"tga-pallet-loading-1-results-title\">Pallet Plan<\/h2>\n                <p class=\"tga-pallet-intro\">Review the footprint, height, and weight limits together before packing.<\/p>\n                <div class=\"tga-pallet-empty\" data-role=\"empty\">\n                    <span>Enter your packed dimensions and select Calculate Pallet Load to create a plan.<\/span>\n                    <span class=\"tga-pallet-status\" data-reset-status hidden>The example values have been restored.<\/span>\n                <\/div>\n                <div class=\"tga-pallet-output\" data-role=\"output\" hidden>\n                    <div class=\"tga-pallet-metrics\">\n                        <div class=\"tga-pallet-metric\"><span>Cartons per layer<\/span><strong data-result=\"perLayer\">\u2014<\/strong><\/div>\n                        <div class=\"tga-pallet-metric\"><span>Stacked layers<\/span><strong data-result=\"layers\">\u2014<\/strong><\/div>\n                        <div class=\"tga-pallet-metric\"><span>Cartons per pallet<\/span><strong data-result=\"perPallet\">\u2014<\/strong><\/div>\n                        <div class=\"tga-pallet-metric\"><span>Pallets needed<\/span><strong data-result=\"pallets\">\u2014<\/strong><\/div>\n                        <div class=\"tga-pallet-metric\"><span>Loaded height<\/span><strong data-result=\"loadedHeight\">\u2014<\/strong><\/div>\n                        <div class=\"tga-pallet-metric\"><span>Full pallet gross weight<\/span><strong data-result=\"grossWeight\">\u2014<\/strong><\/div>\n                        <div class=\"tga-pallet-metric\"><span>Footprint use<\/span><strong data-result=\"utilization\">\u2014<\/strong><\/div>\n                        <div class=\"tga-pallet-metric\"><span>Last pallet cartons<\/span><strong data-result=\"lastPallet\">\u2014<\/strong><\/div>\n                    <\/div>\n                    <div class=\"tga-pallet-plan\" data-role=\"plan\"><\/div>\n                    <div class=\"tga-pallet-actions\">\n                        <button class=\"tga-pallet-button\" data-action=\"copy\" type=\"button\">Copy Summary<\/button>\n                        <button class=\"tga-pallet-button\" data-action=\"download\" type=\"button\">Download CSV<\/button>\n                    <\/div>\n                    <p class=\"tga-pallet-status\" data-role=\"status\" role=\"status\" aria-live=\"polite\">\n                        <span data-status-message=\"calculated\" hidden>Pallet loading estimate calculated.<\/span>\n                        <span data-status-message=\"copied\" hidden>Summary copied.<\/span>\n                        <span data-status-message=\"copyFailed\" hidden>Copy failed. Select and copy the result manually.<\/span>\n                        <span data-status-message=\"downloaded\" hidden>CSV downloaded.<\/span>\n                    <\/p>\n                <\/div>\n            <\/section>\n        <\/section>\n\n        <section class=\"tga-pallet-section\">\n            <h2>How to Read the Estimate<\/h2>\n                <p>The calculator applies footprint, loaded-height, and gross-weight limits. The lower resulting carton capacity controls how many cartons fit on one pallet.<\/p>\n            <div class=\"tga-pallet-notes\">\n                <article class=\"tga-pallet-note\">\n                    <h3>Footprint<\/h3>\n                    <p>The two uniform carton orientations are compared without overhang. Mixed or interlocked layer patterns are not simulated.<\/p>\n                <\/article>\n                <article class=\"tga-pallet-note\">\n                    <h3>Height<\/h3>\n                    <p>Available stack height equals the maximum loaded height minus the pallet height, divided by carton height.<\/p>\n                <\/article>\n                <article class=\"tga-pallet-note\">\n                    <h3>Weight<\/h3>\n                    <p>Available cargo weight equals the maximum pallet gross weight minus pallet tare weight, divided by carton gross weight. The final layer can be partial.<\/p>\n                <\/article>\n            <\/div>\n        <\/section>\n\n        <section class=\"tga-pallet-cta\">\n            <div>\n                <h2>Plan International Trade With Fewer Surprises<\/h2>\n                <p>Explore TradeGo AI services for buyer research, sales preparation, trade documentation, risk review, and market visibility.<\/p>\n            <\/div>\n            <a href=\"https:\/\/tradegoai.app\/vi\/services\/\">Explore Services \u2192<\/a>\n        <\/section>\n\n        <section class=\"tga-pallet-section\">\n            <h2>Frequently Asked Questions<\/h2>\n            <div class=\"tga-pallet-faq-list\">\n                                    <details>\n                        <summary>How does the calculator choose a carton orientation?<\/summary>\n                        <p>It compares a uniform lengthwise layout with a uniform 90-degree rotated layout and uses the one that fits more cartons per full layer. A weight limit or the remaining shipment quantity can leave the final layer partly filled.<\/p>\n                    <\/details>\n                                    <details>\n                        <summary>Does the maximum loaded height include the pallet?<\/summary>\n                        <p>Yes. The loaded-height limit includes the pallet height, so the available carton stack height is the limit minus the pallet itself.<\/p>\n                    <\/details>\n                                    <details>\n                        <summary>How is the pallet gross weight calculated?<\/summary>\n                        <p>Pallet gross weight equals the pallet tare weight plus the gross weight of every carton placed on it. The result uses the weight unit selected in the form.<\/p>\n                    <\/details>\n                                    <details>\n                        <summary>Can I use the result as a final warehouse loading plan?<\/summary>\n                        <p>Use it as an early planning estimate. Confirm carton strength, load stability, pallet capacity, wrapping, overhang rules, handling equipment, and carrier requirements before packing.<\/p>\n                    <\/details>\n                                    <details>\n                        <summary>Are the carton and pallet details saved?<\/summary>\n                        <p>The details are used only to calculate the results shown in your browser. Reset clears the current plan.<\/p>\n                    <\/details>\n                            <\/div>\n        <\/section>\n\n        <section class=\"tga-pallet-section\">\n            <h2>Related Free Tools<\/h2>\n            <p>Continue from pallet planning into shipment volume, container capacity, and chargeable-weight estimates.<\/p>\n            <div class=\"tga-pallet-related-grid\">\n                <a class=\"tga-pallet-related\" href=\"https:\/\/tradegoai.app\/vi\/tools\/cbm-carton-calculator\/\">\n                    <strong>CBM &amp; Carton Calculator<\/strong>\n                    <span>Combine several carton types into shipment volume and gross-weight totals.<\/span>\n                <\/a>\n                <a class=\"tga-pallet-related\" href=\"https:\/\/tradegoai.app\/vi\/tools\/container-loading-estimator\/\">\n                    <strong>Container Loading Estimator<\/strong>\n                    <span>Compare theoretical carton capacity across common container sizes.<\/span>\n                <\/a>\n                <a class=\"tga-pallet-related\" href=\"https:\/\/tradegoai.app\/vi\/tools\/volumetric-weight-calculator\/\">\n                    <strong>Volumetric Weight Calculator<\/strong>\n                    <span>Compare actual and dimensional weight for air, express, and road shipments.<\/span>\n                <\/a>\n            <\/div>\n        <\/section>\n\n        <div class=\"tga-pallet-i18n\" aria-hidden=\"true\">\n            <span data-key=\"empty\">Enter your packed dimensions and select Calculate Pallet Load to create a plan.<\/span>\n            <span data-key=\"invalid\">Enter positive values within the displayed limits for every required field.<\/span>\n            <span data-key=\"heightError\">Maximum loaded height must be greater than the pallet height.<\/span>\n            <span data-key=\"weightError\">Maximum pallet gross weight must be greater than the pallet tare weight.<\/span>\n            <span data-key=\"fitError\">The carton footprint does not fit on this pallet without overhang.<\/span>\n            <span data-key=\"limitError\">The selected height or weight limit does not allow one complete carton.<\/span>\n            <span data-key=\"calculated\">Pallet loading estimate calculated.<\/span>\n            <span data-key=\"copied\">Summary copied.<\/span>\n            <span data-key=\"copyFailed\">Copy failed. Select and copy the result manually.<\/span>\n            <span data-key=\"downloaded\">CSV downloaded.<\/span>\n            <span data-key=\"reset\">The example values have been restored.<\/span>\n            <span data-key=\"orientationLengthwise\">Lengthwise orientation<\/span>\n            <span data-key=\"orientationRotated\">90\u00b0 rotated orientation<\/span>\n            <span data-key=\"heightLimited\">height limit<\/span>\n            <span data-key=\"weightLimited\">weight limit<\/span>\n            <span data-key=\"bothLimited\">height and weight limits<\/span>\n            <span data-key=\"planPrefix\">Best uniform layout:<\/span>\n            <span data-key=\"arrangement\">cartons along pallet length \u00d7 cartons along pallet width.<\/span>\n            <span data-key=\"limiterPrefix\">Stack is limited by the<\/span>\n            <span data-key=\"partialPrefix\">The final pallet contains<\/span>\n            <span data-key=\"cartons\">cartons.<\/span>\n            <span data-key=\"summaryTitle\">Pallet Loading Estimate<\/span>\n            <span data-key=\"labelOrientation\">Orientation<\/span>\n            <span data-key=\"labelArrangement\">Layer arrangement<\/span>\n            <span data-key=\"labelPerLayer\">Cartons per layer<\/span>\n            <span data-key=\"labelLayers\">Stacked layers<\/span>\n            <span data-key=\"labelPerPallet\">Cartons per pallet<\/span>\n            <span data-key=\"labelPallets\">Pallets needed<\/span>\n            <span data-key=\"labelLast\">Last pallet cartons<\/span>\n            <span data-key=\"labelHeight\">Loaded height<\/span>\n            <span data-key=\"labelWeight\">Full pallet gross weight<\/span>\n            <span data-key=\"labelUtilization\">Footprint use<\/span>\n            <span data-key=\"labelLimiter\">Limiting factor<\/span>\n        <\/div>\n\n        <script>\n            (function () {\n                const root = document.getElementById(\"tga-pallet-loading-1\");\n                if (!root || root.dataset.ready === '1') {\n                    return;\n                }\n                root.dataset.ready = '1';\n\n                const form = root.querySelector('.tga-pallet-form');\n                const empty = root.querySelector('[data-role=\"empty\"]');\n                const output = root.querySelector('[data-role=\"output\"]');\n                const plan = root.querySelector('[data-role=\"plan\"]');\n                const preset = root.querySelector('[data-field=\"preset\"]');\n                const resultNodes = {};\n                const labels = {};\n                let current = null;\n\n                root.querySelectorAll('[data-result]').forEach(function (node) {\n                    resultNodes[node.dataset.result] = node;\n                });\n                function loadLabels() {\n                    root.querySelectorAll('.tga-pallet-i18n [data-key]').forEach(function (node) {\n                        labels[node.dataset.key] = node.textContent.trim();\n                    });\n                }\n                loadLabels();\n\n                const defaults = {\n                    preset: 'eur',\n                    palletLength: 1200,\n                    palletWidth: 800,\n                    palletHeight: 144,\n                    palletTare: 25,\n                    cartonLength: 400,\n                    cartonWidth: 300,\n                    cartonHeight: 250,\n                    cartonWeight: 12,\n                    totalCartons: 240,\n                    maxHeight: 1800,\n                    maxWeight: 1000,\n                    rotation: true\n                };\n\n                const presets = {\n                    eur: {length: 1200, width: 800, height: 144, tare: 25},\n                    iso: {length: 1200, width: 1000, height: 150, tare: 28},\n                    us: {length: 1219, width: 1016, height: 140, tare: 23}\n                };\n\n                function field(name) {\n                    return root.querySelector('[data-field=\"' + name + '\"]');\n                }\n\n                function value(name) {\n                    return Number(field(name).value);\n                }\n\n                function formatNumber(number, decimals) {\n                    return Number(number).toLocaleString(undefined, {\n                        minimumFractionDigits: decimals,\n                        maximumFractionDigits: decimals\n                    });\n                }\n\n                function clearMessages() {\n                    writeError('');\n                    writeStatus('');\n                    const resetMessage = root.querySelector('[data-reset-status]');\n                    if (resetMessage) {\n                        resetMessage.hidden = true;\n                    }\n                }\n\n                function writeError(key) {\n                    root.querySelectorAll('[data-error-message]').forEach(function (node) {\n                        node.hidden = !key || node.dataset.errorMessage !== key;\n                    });\n                }\n\n                function writeStatus(key) {\n                    root.querySelectorAll('[data-status-message]').forEach(function (node) {\n                        node.hidden = !key || node.dataset.statusMessage !== key;\n                    });\n                }\n\n                function updatePalletFields() {\n                    const isCustom = preset.value === 'custom';\n                    ['palletLength', 'palletWidth', 'palletHeight', 'palletTare'].forEach(function (name) {\n                        field(name).disabled = !isCustom;\n                    });\n                }\n\n                function applyPreset() {\n                    const selected = presets[preset.value];\n                    if (selected) {\n                        field('palletLength').value = selected.length;\n                        field('palletWidth').value = selected.width;\n                        field('palletHeight').value = selected.height;\n                        field('palletTare').value = selected.tare;\n                    }\n                    updatePalletFields();\n                    clearMessages();\n                }\n\n                function parseInputs() {\n                    const data = {\n                        palletLength: value('palletLength'),\n                        palletWidth: value('palletWidth'),\n                        palletHeight: value('palletHeight'),\n                        palletTare: value('palletTare'),\n                        cartonLength: value('cartonLength'),\n                        cartonWidth: value('cartonWidth'),\n                        cartonHeight: value('cartonHeight'),\n                        cartonWeight: value('cartonWeight'),\n                        totalCartons: value('totalCartons'),\n                        maxHeight: value('maxHeight'),\n                        maxWeight: value('maxWeight'),\n                        rotation: field('rotation').checked\n                    };\n\n                    const positive = [\n                        data.palletLength,\n                        data.palletWidth,\n                        data.palletHeight,\n                        data.cartonLength,\n                        data.cartonWidth,\n                        data.cartonHeight,\n                        data.cartonWeight,\n                        data.totalCartons,\n                        data.maxHeight,\n                        data.maxWeight\n                    ].every(function (number) {\n                        return Number.isFinite(number) && number > 0;\n                    });\n\n                    if (!positive || !Number.isFinite(data.palletTare) || data.palletTare < 0) {\n                        throw new Error('invalid');\n                    }\n                    const withinLimits =\n                        data.palletLength <= 5000 &&\n                        data.palletWidth <= 5000 &&\n                        data.palletHeight <= 1000 &&\n                        data.palletTare <= 500 &&\n                        data.cartonLength <= 5000 &&\n                        data.cartonWidth <= 5000 &&\n                        data.cartonHeight <= 5000 &&\n                        data.cartonWeight <= 10000 &&\n                        Number.isInteger(data.totalCartons) &&\n                        data.totalCartons <= 1000000 &&\n                        data.maxHeight <= 10000 &&\n                        data.maxWeight <= 100000;\n                    if (!withinLimits) {\n                        throw new Error('invalid');\n                    }\n                    if (data.maxHeight <= data.palletHeight) {\n                        throw new Error('heightError');\n                    }\n                    if (data.maxWeight <= data.palletTare) {\n                        throw new Error('weightError');\n                    }\n\n                    return data;\n                }\n\n                function calculate(data) {\n                    const lengthwise = {\n                        name: labels.orientationLengthwise,\n                        alongLength: Math.floor(data.palletLength \/ data.cartonLength),\n                        alongWidth: Math.floor(data.palletWidth \/ data.cartonWidth)\n                    };\n                    lengthwise.perLayer = lengthwise.alongLength * lengthwise.alongWidth;\n\n                    const rotated = {\n                        name: labels.orientationRotated,\n                        alongLength: Math.floor(data.palletLength \/ data.cartonWidth),\n                        alongWidth: Math.floor(data.palletWidth \/ data.cartonLength)\n                    };\n                    rotated.perLayer = rotated.alongLength * rotated.alongWidth;\n\n                    let layout = lengthwise;\n                    if (data.rotation && rotated.perLayer > lengthwise.perLayer) {\n                        layout = rotated;\n                    }\n                    if (layout.perLayer < 1) {\n                        throw new Error('fitError');\n                    }\n\n                    const heightLayers = Math.floor((data.maxHeight - data.palletHeight) \/ data.cartonHeight);\n                    const maxCartonsByHeight = layout.perLayer * heightLayers;\n                    const maxCartonsByWeight = Math.floor((data.maxWeight - data.palletTare) \/ data.cartonWeight);\n                    const perPallet = Math.min(maxCartonsByHeight, maxCartonsByWeight);\n                    const layers = Math.ceil(perPallet \/ layout.perLayer);\n\n                    if (perPallet < 1) {\n                        throw new Error('limitError');\n                    }\n\n                    const pallets = Math.ceil(data.totalCartons \/ perPallet);\n                    const lastPallet = data.totalCartons - ((pallets - 1) * perPallet);\n                    const loadedHeight = data.palletHeight + (layers * data.cartonHeight);\n                    const grossWeight = data.palletTare + (perPallet * data.cartonWeight);\n                    const cartonArea = data.cartonLength * data.cartonWidth;\n                    const palletArea = data.palletLength * data.palletWidth;\n                    const utilization = (layout.perLayer * cartonArea \/ palletArea) * 100;\n                    let limiter = labels.bothLimited;\n\n                    if (maxCartonsByHeight < maxCartonsByWeight) {\n                        limiter = labels.heightLimited;\n                    } else if (maxCartonsByWeight < maxCartonsByHeight) {\n                        limiter = labels.weightLimited;\n                    }\n\n                    return {\n                        input: data,\n                        layout: layout,\n                        heightLayers: heightLayers,\n                        maxCartonsByHeight: maxCartonsByHeight,\n                        maxCartonsByWeight: maxCartonsByWeight,\n                        layers: layers,\n                        perPallet: perPallet,\n                        pallets: pallets,\n                        lastPallet: lastPallet,\n                        loadedHeight: loadedHeight,\n                        grossWeight: grossWeight,\n                        utilization: utilization,\n                        limiter: limiter\n                    };\n                }\n\n                function summaryLines(result) {\n                    return [\n                        labels.summaryTitle,\n                        labels.labelOrientation + ': ' + result.layout.name,\n                        labels.labelArrangement + ': ' + result.layout.alongLength + ' \u00d7 ' + result.layout.alongWidth,\n                        labels.labelPerLayer + ': ' + result.layout.perLayer,\n                        labels.labelLayers + ': ' + result.layers,\n                        labels.labelPerPallet + ': ' + result.perPallet,\n                        labels.labelPallets + ': ' + result.pallets,\n                        labels.labelLast + ': ' + result.lastPallet,\n                        labels.labelHeight + ': ' + formatNumber(result.loadedHeight, 0) + ' mm',\n                        labels.labelWeight + ': ' + formatNumber(result.grossWeight, 2) + ' kg',\n                        labels.labelUtilization + ': ' + formatNumber(result.utilization, 1) + '%',\n                        labels.labelLimiter + ': ' + result.limiter\n                    ];\n                }\n\n                function render(result) {\n                    resultNodes.perLayer.textContent = formatNumber(result.layout.perLayer, 0);\n                    resultNodes.layers.textContent = formatNumber(result.layers, 0);\n                    resultNodes.perPallet.textContent = formatNumber(result.perPallet, 0);\n                    resultNodes.pallets.textContent = formatNumber(result.pallets, 0);\n                    resultNodes.loadedHeight.textContent = formatNumber(result.loadedHeight, 0) + ' mm';\n                    resultNodes.grossWeight.textContent = formatNumber(result.grossWeight, 2) + ' kg';\n                    resultNodes.utilization.textContent = formatNumber(result.utilization, 1) + '%';\n                    resultNodes.lastPallet.textContent = formatNumber(result.lastPallet, 0);\n\n                    plan.textContent = '';\n                    const layoutStrong = document.createElement('strong');\n                    layoutStrong.textContent = labels.planPrefix + ' ';\n                    plan.appendChild(layoutStrong);\n                    plan.appendChild(document.createTextNode(\n                        result.layout.name + ' \u2014 ' +\n                        result.layout.alongLength + ' \u00d7 ' +\n                        result.layout.alongWidth + ' ' +\n                        labels.arrangement + ' ' +\n                        labels.limiterPrefix + ' ' +\n                        result.limiter + '. ' +\n                        labels.partialPrefix + ' ' +\n                        result.lastPallet + ' ' +\n                        labels.cartons\n                    ));\n\n                    empty.hidden = true;\n                    output.hidden = false;\n                    writeStatus('calculated');\n                }\n\n                function csvCell(valueToEscape) {\n                    let text = String(valueToEscape);\n                    if (\/^[=+\\-@]\/.test(text)) {\n                        text = \"'\" + text;\n                    }\n                    return '\"' + text.replace(\/\"\/g, '\"\"') + '\"';\n                }\n\n                function downloadCsv() {\n                    if (!current) {\n                        return;\n                    }\n                    loadLabels();\n                    const rows = [\n                        ['Metric', 'Value'],\n                        [labels.labelOrientation, current.layout.name],\n                        [labels.labelArrangement, current.layout.alongLength + ' x ' + current.layout.alongWidth],\n                        [labels.labelPerLayer, current.layout.perLayer],\n                        [labels.labelLayers, current.layers],\n                        [labels.labelPerPallet, current.perPallet],\n                        [labels.labelPallets, current.pallets],\n                        [labels.labelLast, current.lastPallet],\n                        [labels.labelHeight, current.loadedHeight + ' mm'],\n                        [labels.labelWeight, current.grossWeight.toFixed(2) + ' kg'],\n                        [labels.labelUtilization, current.utilization.toFixed(1) + '%'],\n                        [labels.labelLimiter, current.limiter]\n                    ];\n                    const csv = '\\uFEFF' + rows.map(function (row) {\n                        return row.map(csvCell).join(',');\n                    }).join('\\r\\n');\n                    const blob = new Blob([csv], {type: 'text\/csv;charset=utf-8'});\n                    const url = URL.createObjectURL(blob);\n                    const link = document.createElement('a');\n                    link.href = url;\n                    link.download = 'pallet-loading-estimate.csv';\n                    document.body.appendChild(link);\n                    link.click();\n                    link.remove();\n                    URL.revokeObjectURL(url);\n                    writeStatus('downloaded');\n                }\n\n                async function copySummary() {\n                    if (!current) {\n                        return;\n                    }\n                    loadLabels();\n                    const text = summaryLines(current).join('\\n');\n                    try {\n                        if (navigator.clipboard && window.isSecureContext) {\n                            await navigator.clipboard.writeText(text);\n                        } else {\n                            const area = document.createElement('textarea');\n                            area.value = text;\n                            area.setAttribute('readonly', '');\n                            area.style.position = 'fixed';\n                            area.style.opacity = '0';\n                            document.body.appendChild(area);\n                            area.select();\n                            if (!document.execCommand('copy')) {\n                                throw new Error('copy');\n                            }\n                            area.remove();\n                        }\n                        writeStatus('copied');\n                    } catch (copyError) {\n                        writeStatus('copyFailed');\n                    }\n                }\n\n                function restoreDefaults() {\n                    loadLabels();\n                    Object.keys(defaults).forEach(function (name) {\n                        const node = field(name);\n                        if (!node) {\n                            return;\n                        }\n                        if (node.type === 'checkbox') {\n                            node.checked = defaults[name];\n                        } else {\n                            node.value = defaults[name];\n                        }\n                    });\n                    applyPreset();\n                    current = null;\n                    clearMessages();\n                    output.hidden = true;\n                    empty.hidden = false;\n                    const resetStatus = root.querySelector('[data-reset-status]');\n                    if (resetStatus) {\n                        resetStatus.hidden = false;\n                    }\n                    field('cartonLength').focus();\n                }\n\n                preset.addEventListener('change', applyPreset);\n                form.addEventListener('submit', function (event) {\n                    event.preventDefault();\n                    loadLabels();\n                    clearMessages();\n                    try {\n                        current = calculate(parseInputs());\n                        render(current);\n                    } catch (calculationError) {\n                        current = null;\n                        output.hidden = true;\n                        empty.hidden = false;\n                        writeError(calculationError.message || 'invalid');\n                    }\n                });\n                root.querySelector('[data-action=\"reset\"]').addEventListener('click', restoreDefaults);\n                root.querySelector('[data-action=\"copy\"]').addEventListener('click', copySummary);\n                root.querySelector('[data-action=\"download\"]').addEventListener('click', downloadCsv);\n\n                updatePalletFields();\n            })();\n        <\/script>\n    <\/main>\n    \n","protected":false},"excerpt":{"rendered":"<p>T\u00ednh s\u1ed1 th\u00f9ng carton tr\u00ean m\u1ed7i pallet, chi\u1ec1u cao x\u1ebfp ch\u1ed3ng, tr\u1ecdng l\u01b0\u1ee3ng c\u1ea3 b\u00ec, di\u1ec7n t\u00edch s\u00e0n s\u1eed d\u1ee5ng v\u00e0 s\u1ed1 pallet c\u1ea7n thi\u1ebft \u0111\u1ec3 l\u1eadp k\u1ebf ho\u1ea1ch v\u1eadn chuy\u1ec3n.<\/p>","protected":false},"featured_media":9850,"template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"spectra_gs_classes":"[\"\"]"},"tool_categories":[51,46],"class_list":["post-9848","tools","type-tools","status-publish","has-post-thumbnail","hentry","tool_categories-shipping-calculators","tool_categories-trade-operations"],"spectra_custom_meta":{"spectra_gs_classes":["[\"\"]"],"rank_math_internal_links_processed":["1"],"wp_statistics_words_count":["1"],"_thumbnail_id":["9850"],"rank_math_title":["%title% %sep% %sitename%"],"rank_math_description":["%excerpt%"],"rank_math_robots":["a:2:{i:0;s:5:\"index\";i:1;s:6:\"follow\";}"],"rank_math_facebook_image":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share.webp"],"rank_math_facebook_image_id":["9850"],"rank_math_twitter_use_facebook":["on"],"rank_math_twitter_card_type":["summary_large_image"],"astra_style_timestamp_css":["1790737855"],"_uag_page_assets":["a:9:{s:3:\"css\";s:4963:\".uag-blocks-common-selector{z-index:var(--z-index-desktop) !important}@media (max-width: 976px){.uag-blocks-common-selector{z-index:var(--z-index-tablet) !important}}@media (max-width: 767px){.uag-blocks-common-selector{z-index:var(--z-index-mobile) !important}}\n.uagb-icon-list__wrap{display:flex;align-items:flex-start;justify-content:flex-start}.wp-block-uagb-icon-list-child{padding:0;transition:all 0.2s;display:inline-flex;color:#3a3a3a;align-items:center;text-decoration:none;box-shadow:none}.wp-block-uagb-icon-list-child span.uagb-icon-list__source-wrap{display:block;align-items:center}.uagb-icon-list__source-wrap svg{display:block}.uagb-icon-list__source-image{width:40px}.uagb-icon-list__outer-wrap .uagb-icon-list__content-wrap{color:#3a3a3a;display:flex;align-items:center}\n.wp-block-uagb-icon-list-child{position:relative}.wp-block-uagb-icon-list-child>a{position:absolute;top:0;left:0;width:100%;height:100%}img.uagb-icon-list__source-image{max-width:unset}.wp-block-uagb-icon-list-child .uagb-icon-list__label{word-break:break-word}\n.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__source-image{width: 16px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap svg{width: 16px;height: 16px;font-size: 16px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{padding: 0px;border-radius: 0px;border-width: 0px;align-self: center;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child .uagb-icon-list__label{text-decoration: !important;font-weight: 600;line-height: em;}.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__wrap{display: flex;flex-direction: column;justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: flex-start;-ms-flex-align: flex-start;align-items: flex-start;margin-top: 30px;margin-right: 0px;margin-bottom: 0px;margin-left: 0px;padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__label{text-align: left;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child{text-decoration: !important;font-weight: 600;line-height: em;}.wp-block-uagb-icon-list.uagb-block-b5768981.wp-block-uagb-icon-list .wp-block-uagb-icon-list-child{margin-left: 0;margin-right: 0;margin-bottom: 10px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__source-wrap{margin-right: 15px;}.uagb-block-75fa870d.wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-75fa870d.wp-block-uagb-icon-list-child:hover .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-5bf81fd2.wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}.uagb-block-5bf81fd2.wp-block-uagb-icon-list-child:hover .uagb-icon-list__source-wrap{background:  !important;border-color:  !important;}@media only screen and (max-width: 976px) {.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__source-image{width: 16px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap svg{width: 16px;height: 16px;font-size: 16px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap {padding: 0px;border-width: 0px;align-self: center;}.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__wrap{display: flex;flex-direction: column;justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: flex-start;-ms-flex-align: flex-start;align-items: flex-start;}.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__label{text-align: left;}.wp-block-uagb-icon-list.uagb-block-b5768981.wp-block-uagb-icon-list .wp-block-uagb-icon-list-child{margin-left: 0;margin-right: 0;margin-bottom: 10px;}}@media only screen and (max-width: 767px) {.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__source-image{width: 16px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__label{text-align: center;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap svg{width: 16px;height: 16px;font-size: 16px;}.wp-block-uagb-icon-list.uagb-block-b5768981 .wp-block-uagb-icon-list-child .uagb-icon-list__source-wrap{padding: 0px;border-width: 0px;align-self: center;}.wp-block-uagb-icon-list.uagb-block-b5768981 .uagb-icon-list__wrap{display: flex;flex-direction: column;justify-content: center;-webkit-box-pack: center;-ms-flex-pack: center;-webkit-box-align: center;-ms-flex-align: center;align-items: center;margin-top: 0px;margin-right: 0px;margin-bottom: 0px;margin-left: 0px;}.wp-block-uagb-icon-list.uagb-block-b5768981.wp-block-uagb-icon-list .wp-block-uagb-icon-list-child{margin-left: 0;margin-right: 0;margin-bottom: 10px;}}\";s:2:\"js\";s:0:\"\";s:18:\"current_block_list\";a:10:{i:0;s:11:\"core\/search\";i:1;s:10:\"core\/group\";i:2;s:12:\"core\/heading\";i:3;s:17:\"core\/latest-posts\";i:4;s:20:\"core\/latest-comments\";i:5;s:13:\"core\/archives\";i:6;s:15:\"core\/categories\";i:7;s:14:\"uagb\/icon-list\";i:8;s:20:\"uagb\/icon-list-child\";i:9;s:14:\"core\/shortcode\";}s:8:\"uag_flag\";b:1;s:11:\"uag_version\";s:10:\"1791813617\";s:6:\"gfonts\";a:0:{}s:10:\"gfonts_url\";s:0:\"\";s:12:\"gfonts_files\";a:0:{}s:14:\"uag_faq_layout\";b:0;}"],"rank_math_schema_SoftwareApplication":["a:8:{s:5:\"@type\";s:19:\"SoftwareApplication\";s:4:\"name\";s:25:\"Pallet Loading Calculator\";s:11:\"description\";s:130:\"Calculate cartons per pallet, stack height, gross weight, floor-space use, and the number of pallets needed for shipment planning.\";s:3:\"url\";s:54:\"https:\/\/tradegoai.app\/tools\/pallet-loading-calculator\/\";s:5:\"image\";s:92:\"https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share.webp\";s:19:\"applicationCategory\";s:19:\"BusinessApplication\";s:15:\"operatingSystem\";s:11:\"Web Browser\";s:6:\"offers\";a:3:{s:5:\"@type\";s:5:\"Offer\";s:5:\"price\";s:1:\"0\";s:13:\"priceCurrency\";s:3:\"USD\";}}"],"_uag_css_file_name":["uag-css-9848.css"]},"uagb_featured_image_src":{"full":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share.webp",1200,630,false],"thumbnail":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share-150x150.webp",150,150,true],"medium":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share-300x158.webp",300,158,true],"medium_large":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share-768x403.webp",768,403,true],"large":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share-1024x538.webp",1024,538,true],"1536x1536":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share.webp",1200,630,false],"2048x2048":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share.webp",1200,630,false],"trp-custom-language-flag":["https:\/\/tradegoai.app\/wp-content\/uploads\/2026\/07\/pallet-loading-calculator-social-share-18x9.webp",18,9,true]},"uagb_author_info":{"display_name":"","author_link":"https:\/\/tradegoai.app\/vi\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"Calculate cartons per pallet, stack height, gross weight, floor-space use, and the number of pallets needed for shipment planning.","_links":{"self":[{"href":"https:\/\/tradegoai.app\/vi\/wp-json\/wp\/v2\/tools\/9848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tradegoai.app\/vi\/wp-json\/wp\/v2\/tools"}],"about":[{"href":"https:\/\/tradegoai.app\/vi\/wp-json\/wp\/v2\/types\/tools"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tradegoai.app\/vi\/wp-json\/wp\/v2\/media\/9850"}],"wp:attachment":[{"href":"https:\/\/tradegoai.app\/vi\/wp-json\/wp\/v2\/media?parent=9848"}],"wp:term":[{"taxonomy":"tool_categories","embeddable":true,"href":"https:\/\/tradegoai.app\/vi\/wp-json\/wp\/v2\/tool_categories?post=9848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}