{"id":445152,"date":"2025-11-04T13:27:36","date_gmt":"2025-11-04T13:27:36","guid":{"rendered":"https:\/\/londrinapdl.com\/?page_id=445152"},"modified":"2025-11-04T15:10:27","modified_gmt":"2025-11-04T15:10:27","slug":"costura","status":"publish","type":"page","link":"https:\/\/londrinapdl.com\/en\/costura\/","title":{"rendered":"Costura"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"445152\" class=\"elementor elementor-445152\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a6bafde e-flex e-con-boxed e-con e-parent\" data-id=\"a6bafde\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9def176 elementor-widget elementor-widget-shortcode\" data-id=\"9def176\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">         <div class=\"lf-wrap\">\n\n                        <div id=\"lf-toast\" class=\"lf-toast\" aria-live=\"polite\" hidden><\/div>\n\n                        <div class=\"lf-drawer\" id=\"lfDrawer\" hidden>\n                <div class=\"lf-drawer-fundo\" data-fechar><\/div>\n\n                <aside class=\"lf-drawer-painel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Menu\">\n                    <div class=\"lf-drawer-topo\">\n                        <div class=\"lf-drawer-quem\">\n                            <span class=\"lf-drawer-inicial\" id=\"lfDrawerInicial\">\u2014<\/span>\n                            <span class=\"lf-drawer-txt\">\n                                <strong id=\"lfDrawerNome\">\u2014<\/strong>\n                                <small id=\"lfDrawerFuncao\">Vendedor<\/small>\n                            <\/span>\n                        <\/div>\n                        <button type=\"button\" class=\"lf-drawer-x\" data-fechar aria-label=\"Fechar menu\">&times;<\/button>\n                    <\/div>\n\n                    <nav class=\"lf-drawer-nav\">\n                        <button type=\"button\" class=\"lf-drawer-item\" data-acao=\"novo\">\n                            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\"\/><\/svg>\n                            <span><b>Novo servi\u00e7o<\/b><small>Registar uma pe\u00e7a para costura<\/small><\/span>\n                        <\/button>\n\n                        <button type=\"button\" class=\"lf-drawer-item\" data-acao=\"agendamentos\">\n                            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 6h16M4 12h16M4 18h10\"\/><\/svg>\n                            <span><b>Agendamentos<\/b><small>Corrigir, reimprimir ou apagar<\/small><\/span>\n                        <\/button>\n\n                        <button type=\"button\" class=\"lf-drawer-item\" data-acao=\"mensagens\" id=\"lfDrawerMensagens\">\n                            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M21 12a8 8 0 0 1-11.9 7L4 20l1-4a8 8 0 1 1 16-4z\"\/><\/svg>\n                            <span><b>Mensagens<\/b><small>Respostas dos clientes no WhatsApp<\/small><\/span>\n                            <span class=\"lf-badge\" id=\"lfMsgBadge\" hidden>0<\/span>\n                        <\/button>\n\n                        <button type=\"button\" class=\"lf-drawer-item\" data-acao=\"trabalhos\" id=\"lfDrawerTrabalhos\" hidden>\n                            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>\n                            <span><b>Trabalhos do dia<\/b><small>Fechar servi\u00e7os e avisar clientes<\/small><\/span>\n                        <\/button>\n                    <\/nav>\n\n                    <div class=\"lf-drawer-sep\">Este dispositivo<\/div>\n\n                    <label class=\"lf-drawer-item lf-drawer-toggle\">\n                        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 9V3h12v6M6 18H4v-6h16v6h-2M8 14h8v7H8z\"\/><\/svg>\n                        <span><b>Imprimir aqui<\/b><small>Desligado, os tal\u00f5es saem no caixa<\/small><\/span>\n                        <input type=\"checkbox\" id=\"lfPrintLocal\">\n                    <\/label>\n\n                    <button type=\"button\" class=\"lf-drawer-item lf-drawer-sair\" data-acao=\"sair\">\n                        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M16 17l5-5-5-5M21 12H9M12 19H5V5h7\"\/><\/svg>\n                        <span><b>Sair<\/b><small>Terminar sess\u00e3o neste telem\u00f3vel<\/small><\/span>\n                    <\/button>\n                <\/aside>\n            <\/div>\n            \n\n                        <div class=\"lf-gate\" id=\"lfGate\">\n                <div class=\"lf-gate-card\">\n                    <div class=\"lf-gate-logo\">Londrina<\/div>\n                    <h2 id=\"lfGateTitulo\">C\u00f3digo de vendedor<\/h2>\n                    <p class=\"lf-gate-sub\" id=\"lfGateSub\">Marca o teu c\u00f3digo de 4 d\u00edgitos<\/p>\n\n                    <div class=\"lf-pin\" id=\"lfPinDots\">\n                        <i><\/i><i><\/i><i><\/i><i><\/i>\n                    <\/div>\n\n                    <div class=\"lf-keys\" id=\"lfKeys\">\n                        <button type=\"button\" data-k=\"1\">1<\/button>\n                        <button type=\"button\" data-k=\"2\">2<\/button>\n                        <button type=\"button\" data-k=\"3\">3<\/button>\n                        <button type=\"button\" data-k=\"4\">4<\/button>\n                        <button type=\"button\" data-k=\"5\">5<\/button>\n                        <button type=\"button\" data-k=\"6\">6<\/button>\n                        <button type=\"button\" data-k=\"7\">7<\/button>\n                        <button type=\"button\" data-k=\"8\">8<\/button>\n                        <button type=\"button\" data-k=\"9\">9<\/button>\n                        <button type=\"button\" class=\"lf-key-alt\" data-k=\"bio\" id=\"lfKeyBio\" hidden>&#9673;<\/button>\n                        <button type=\"button\" data-k=\"0\">0<\/button>\n                        <button type=\"button\" class=\"lf-key-alt\" data-k=\"del\">&#9003;<\/button>\n                    <\/div>\n\n                    <p class=\"lf-gate-erro\" id=\"lfGateErro\" hidden><\/p>\n                <\/div>\n            <\/div>\n            \n                        <div class=\"lf-card lf-costura\" id=\"lfCostura\" hidden>\n                <div class=\"lf-user\">\n                    <div>\n                        <span class=\"lf-user-label\">Costura<\/span>\n                        <strong id=\"lfCostNome\">\u2014<\/strong>\n                    <\/div>\n                    <div class=\"lf-user-acoes\">\n                        <button type=\"button\" class=\"lf-burger\" aria-label=\"Menu\" aria-expanded=\"false\">\n                            <span><\/span><span><\/span><span><\/span>\n                        <\/button>\n                    <\/div>\n                <\/div>\n\n                <div class=\"lf-cost-busca\" role=\"search\">\n                    <input type=\"search\" id=\"lfCostTalao\" inputmode=\"numeric\" autocomplete=\"off\"\n                           placeholder=\"Procurar pelo n\u00ba do tal\u00e3o\" aria-label=\"N\u00famero do tal\u00e3o\">\n                    <button type=\"button\" class=\"lf-cost-hoje\" id=\"lfCostProcurar\">Procurar<\/button>\n                <\/div>\n\n                <div class=\"lf-cost-dia\">\n                    <button type=\"button\" class=\"lf-cost-seta\" id=\"lfDiaAnt\" aria-label=\"Dia anterior\">&lsaquo;<\/button>\n                    <div class=\"lf-cost-data\">\n                        <strong id=\"lfCostData\">\u2014<\/strong>\n                        <span id=\"lfCostContagem\"><\/span>\n                    <\/div>\n                    <button type=\"button\" class=\"lf-cost-seta\" id=\"lfDiaSeg\" aria-label=\"Dia seguinte\">&rsaquo;<\/button>\n                    <button type=\"button\" class=\"lf-cost-hoje\" id=\"lfDiaHoje\">Hoje<\/button>\n                <\/div>\n\n                <div id=\"lfCostLista\"><\/div>\n            <\/div>\n            \n                        <div class=\"lf-card\" id=\"lfAgendaCard\" hidden>\n                <div class=\"lf-user\">\n                    <div>\n                        <span class=\"lf-user-label\">Agendamentos<\/span>\n                        <strong id=\"lfAgendaTitulo\">\u00daltimos registos<\/strong>\n                    <\/div>\n                    <div class=\"lf-user-acoes\">\n                        <button type=\"button\" class=\"lf-link\" id=\"lfAgendaVoltar\">Voltar<\/button>\n                    <\/div>\n                <\/div>\n\n                <label class=\"lf-field lf-busca\">\n                    <span>Procurar<\/span>\n                    <input type=\"search\" id=\"lfBusca\" placeholder=\"N\u00ba de tal\u00e3o ou nome do cliente\" inputmode=\"search\">\n                <\/label>\n\n                <div id=\"lfAgendaLista\"><\/div>\n            <\/div>\n            \n                        <div class=\"lf-card\" id=\"lfMsgCard\" hidden>\n                <div class=\"lf-user\">\n                    <div>\n                        <span class=\"lf-user-label\">Mensagens<\/span>\n                        <strong id=\"lfMsgTitulo\">Conversas<\/strong>\n                    <\/div>\n                    <div class=\"lf-user-acoes\">\n                        <button type=\"button\" class=\"lf-link\" id=\"lfMsgVoltar\">Voltar<\/button>\n                    <\/div>\n                <\/div>\n\n                <div id=\"lfMsgLista\"><\/div>\n\n                <div id=\"lfMsgConversa\" hidden>\n                    <div class=\"lf-msg-fio\" id=\"lfMsgFio\"><\/div>\n                    <p class=\"lf-msg-aviso\" id=\"lfMsgAviso\"><\/p>\n                    <div class=\"lf-msg-resposta\">\n                        <textarea id=\"lfMsgTexto\" rows=\"2\" placeholder=\"Escrever resposta...\" maxlength=\"1000\"><\/textarea>\n                        <button type=\"button\" class=\"lf-btn\" id=\"lfMsgEnviar\">Enviar<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n            \n            <div class=\"lf-card\" id=\"lfCard\" hidden>\n                                <div class=\"lf-user\">\n                    <div>\n                        <span class=\"lf-user-label\">Vendedor<\/span>\n                        <strong id=\"lfUserNome\">\u2014<\/strong>\n                    <\/div>\n                    <div class=\"lf-user-acoes\">\n                        <button type=\"button\" class=\"lf-burger\" id=\"lfMenuBtn\" aria-label=\"Menu\" aria-expanded=\"false\">\n                            <span><\/span><span><\/span><span><\/span>\n                        <\/button>\n                    <\/div>\n                <\/div>\n\n                \n                <form method=\"post\" class=\"londrina-form\" id=\"londrinaForm\" autocomplete=\"on\" novalidate\n                      data-ajax=\"https:\/\/londrinapdl.com\/wp-admin\/admin-ajax.php\"\n                      data-agenda-nonce=\"a6bda154a2\"\n                      data-capacidade=\"840\"\n                      data-buffer=\"2\"\n                      data-pin=\"1\"\n                      data-wa-api=\"1\"\n                      data-servicos=\"[{&quot;key&quot;:&quot;subir_bainha&quot;,&quot;nome&quot;:&quot;Subir bainha&quot;,&quot;min&quot;:21},{&quot;key&quot;:&quot;apertar_cintura&quot;,&quot;nome&quot;:&quot;Apertar cintura&quot;,&quot;min&quot;:21},{&quot;key&quot;:&quot;apertar_perna&quot;,&quot;nome&quot;:&quot;Apertar perna&quot;,&quot;min&quot;:31},{&quot;key&quot;:&quot;apertar_casaco&quot;,&quot;nome&quot;:&quot;Apertar casaco&quot;,&quot;min&quot;:31},{&quot;key&quot;:&quot;subir_manga_casaco&quot;,&quot;nome&quot;:&quot;Subir manga do casaco&quot;,&quot;min&quot;:36},{&quot;key&quot;:&quot;subir_bainha_ganga&quot;,&quot;nome&quot;:&quot;Subir bainha ganga original&quot;,&quot;min&quot;:21},{&quot;key&quot;:&quot;subir_roda_do_casaco&quot;,&quot;nome&quot;:&quot;Subir roda do casaco&quot;,&quot;min&quot;:46},{&quot;key&quot;:&quot;apertar_camisa&quot;,&quot;nome&quot;:&quot;Apertar camisa&quot;,&quot;min&quot;:26},{&quot;key&quot;:&quot;fazer_manga_curta&quot;,&quot;nome&quot;:&quot;Fazer manga curta&quot;,&quot;min&quot;:36},{&quot;key&quot;:&quot;botao_para_beira&quot;,&quot;nome&quot;:&quot;Bot\\u00e3o para beira&quot;,&quot;min&quot;:16},{&quot;key&quot;:&quot;subir_roda_da_camisa&quot;,&quot;nome&quot;:&quot;Subir roda da camisa&quot;,&quot;min&quot;:26},{&quot;key&quot;:&quot;subir_punho_da_camisa&quot;,&quot;nome&quot;:&quot;Subir punho da camisa&quot;,&quot;min&quot;:31},{&quot;key&quot;:&quot;alargar_cintura&quot;,&quot;nome&quot;:&quot;Alargar cintura&quot;,&quot;min&quot;:26},{&quot;key&quot;:&quot;fazer_virola&quot;,&quot;nome&quot;:&quot;Fazer virola&quot;,&quot;min&quot;:31},{&quot;key&quot;:&quot;mudar_botao_do_casaco&quot;,&quot;nome&quot;:&quot;Mudar bot\\u00e3o do casaco&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;mudar_botao_da_camisa&quot;,&quot;nome&quot;:&quot;Mudar bot\\u00e3o da camisa&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;fechar_rachas_do_casaco&quot;,&quot;nome&quot;:&quot;Fechar rachas do casaco&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;prender_o_lenco&quot;,&quot;nome&quot;:&quot;Prender o len\\u00e7o&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;mudar_forro_do_colete&quot;,&quot;nome&quot;:&quot;Mudar forro do colete&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;reforcar_botoes_de_casaco_colete&quot;,&quot;nome&quot;:&quot;Refor\\u00e7ar bot\\u00f5es de casaco\\\/colete&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;alargar_cintura_1cm&quot;,&quot;nome&quot;:&quot;Alargar cintura 1cm&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;alargar_cintura_2cm&quot;,&quot;nome&quot;:&quot;Alargar cintura 2cm&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;apertar_manga&quot;,&quot;nome&quot;:&quot;Apertar manga&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;cozer_elasticos&quot;,&quot;nome&quot;:&quot;Cozer el\\u00e1sticos&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;bainha_com_inclinacao&quot;,&quot;nome&quot;:&quot;Bainha com inclina\\u00e7\\u00e3o&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;mudar_botao_do_punho&quot;,&quot;nome&quot;:&quot;Mudar bot\\u00e3o do punho&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;tirar_pincas&quot;,&quot;nome&quot;:&quot;Tirar pin\\u00e7as&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;colocar_fecho&quot;,&quot;nome&quot;:&quot;Colocar fecho&quot;,&quot;min&quot;:20},{&quot;key&quot;:&quot;apertar&quot;,&quot;nome&quot;:&quot;Apertar&quot;,&quot;min&quot;:20}]\"\n                      data-artigos=\"[{&quot;key&quot;:&quot;fato&quot;,&quot;nome&quot;:&quot;Fato&quot;,&quot;servicos&quot;:[&quot;subir_bainha&quot;,&quot;apertar_cintura&quot;,&quot;apertar_perna&quot;,&quot;apertar_casaco&quot;,&quot;subir_manga_casaco&quot;,&quot;subir_roda_do_casaco&quot;,&quot;alargar_cintura&quot;,&quot;fazer_virola&quot;,&quot;mudar_botao_do_casaco&quot;,&quot;fechar_rachas_do_casaco&quot;,&quot;prender_o_lenco&quot;,&quot;reforcar_botoes_de_casaco_colete&quot;,&quot;alargar_cintura_1cm&quot;,&quot;alargar_cintura_2cm&quot;,&quot;apertar_manga&quot;,&quot;cozer_elasticos&quot;]},{&quot;key&quot;:&quot;casaco&quot;,&quot;nome&quot;:&quot;Casaco&quot;,&quot;servicos&quot;:[&quot;apertar_casaco&quot;,&quot;subir_manga_casaco&quot;,&quot;subir_roda_do_casaco&quot;,&quot;mudar_botao_do_casaco&quot;,&quot;fechar_rachas_do_casaco&quot;,&quot;apertar_manga&quot;]},{&quot;key&quot;:&quot;calca&quot;,&quot;nome&quot;:&quot;Cal\\u00e7a&quot;,&quot;servicos&quot;:[&quot;subir_bainha&quot;,&quot;apertar_cintura&quot;,&quot;apertar_perna&quot;,&quot;alargar_cintura&quot;,&quot;fazer_virola&quot;,&quot;alargar_cintura_1cm&quot;,&quot;alargar_cintura_2cm&quot;]},{&quot;key&quot;:&quot;calca_ganga&quot;,&quot;nome&quot;:&quot;Cal\\u00e7a de ganga&quot;,&quot;servicos&quot;:[&quot;subir_bainha&quot;,&quot;apertar_cintura&quot;,&quot;apertar_perna&quot;,&quot;subir_bainha_ganga&quot;]},{&quot;key&quot;:&quot;camisa&quot;,&quot;nome&quot;:&quot;Camisa&quot;,&quot;servicos&quot;:[&quot;apertar_camisa&quot;,&quot;fazer_manga_curta&quot;,&quot;botao_para_beira&quot;,&quot;subir_roda_da_camisa&quot;,&quot;subir_punho_da_camisa&quot;,&quot;mudar_botao_da_camisa&quot;]},{&quot;key&quot;:&quot;colete&quot;,&quot;nome&quot;:&quot;Colete&quot;,&quot;servicos&quot;:[&quot;mudar_forro_do_colete&quot;,&quot;reforcar_botoes_de_casaco_colete&quot;,&quot;apertar&quot;]},{&quot;key&quot;:&quot;outro&quot;,&quot;nome&quot;:&quot;Outra pe\\u00e7a&quot;,&quot;servicos&quot;:[]}]\">\n\n                    <input type=\"hidden\" name=\"lf_token\" id=\"lfToken\" value=\"\">\n                    <input type=\"hidden\" name=\"editar_id\" id=\"lfEditarId\" value=\"\">\n                    <input type=\"hidden\" name=\"origem\" id=\"lfOrigem\" value=\"web\">\n\n                    <input type=\"hidden\" id=\"londrina_form_nonce\" name=\"londrina_form_nonce\" value=\"779091f91d\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/445152\" \/>                    <input type=\"hidden\" name=\"action\" value=\"londrina_form_submit\">\n                    <input type=\"hidden\" name=\"londrina_form_id\" value=\"1\">\n\n                    <div class=\"lf-steps-head\" hidden>\n                        <ol class=\"lf-steps-nav\">\n                            <li data-para=\"1\">Cliente<\/li>\n                            <li data-para=\"2\">Pe\u00e7as<\/li>\n                            <li data-para=\"3\">Datas<\/li>\n                            <li data-para=\"4\">Confirmar<\/li>\n                        <\/ol>\n                        <div class=\"lf-steps-bar\"><i id=\"lfStepsBar\"><\/i><\/div>\n                    <\/div>\n\n                    <div class=\"lf-step\" data-step=\"1\">\n                    <div class=\"lf-grid\">\n                        <label class=\"lf-field\">\n                            <span>Nome Completo<\/span>\n                            <input type=\"text\" name=\"nome_completo\" placeholder=\"Nome e apelido\" required minlength=\"2\">\n                        <\/label>\n\n                        <label class=\"lf-field\">\n                            <span>NIF <em class=\"lf-opt\">(opcional)<\/em><\/span>\n                            <input type=\"text\" name=\"nif\" inputmode=\"numeric\" pattern=\"\\d{9}\" maxlength=\"9\" placeholder=\"XXXXXXXXX\">\n                        <\/label>\n\n                        <label class=\"lf-field\">\n                            <span>Email <em class=\"lf-opt\">(opcional)<\/em><\/span>\n                            <input type=\"email\" name=\"email\" placeholder=\"email@exemplo.pt\">\n                        <\/label>\n\n                        <label class=\"lf-field\">\n                            <span>Telefone<\/span>\n                            <div class=\"lf-tel\">\n                                <div class=\"lf-ind\">\n                                    <button type=\"button\" class=\"lf-ind-btn\" id=\"lfIndBtn\" aria-haspopup=\"listbox\" aria-expanded=\"false\"\n                                            aria-label=\"Indicativo do pa\u00eds\">\n                                        <span id=\"lfIndTxt\">+351<\/span>\n                                        <svg viewBox=\"0 0 12 8\" aria-hidden=\"true\"><path d=\"M1 1.5 6 6.5l5-5\"\/><\/svg>\n                                    <\/button>\n                                    <input type=\"hidden\" name=\"telefone_ind\" id=\"lfIndValor\" value=\"351\">\n                                    <div class=\"lf-ind-lista\" id=\"lfIndLista\" hidden role=\"listbox\">\n                                        <input type=\"search\" id=\"lfIndBusca\" placeholder=\"Procurar pa\u00eds\" autocomplete=\"off\">\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"351\">\n                                            <span>Portugal<\/span><em>+351<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"1\">\n                                            <span>EUA \/ Canad\u00e1<\/span><em>+1<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"34\">\n                                            <span>Espanha<\/span><em>+34<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"33\">\n                                            <span>Fran\u00e7a<\/span><em>+33<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"44\">\n                                            <span>Reino Unido<\/span><em>+44<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"49\">\n                                            <span>Alemanha<\/span><em>+49<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"41\">\n                                            <span>Su\u00ed\u00e7a<\/span><em>+41<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"352\">\n                                            <span>Luxemburgo<\/span><em>+352<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"32\">\n                                            <span>B\u00e9lgica<\/span><em>+32<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"31\">\n                                            <span>Pa\u00edses Baixos<\/span><em>+31<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"353\">\n                                            <span>Irlanda<\/span><em>+353<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"39\">\n                                            <span>It\u00e1lia<\/span><em>+39<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"55\">\n                                            <span>Brasil<\/span><em>+55<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"244\">\n                                            <span>Angola<\/span><em>+244<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"238\">\n                                            <span>Cabo Verde<\/span><em>+238<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"258\">\n                                            <span>Mo\u00e7ambique<\/span><em>+258<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"245\">\n                                            <span>Guin\u00e9-Bissau<\/span><em>+245<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"239\">\n                                            <span>S\u00e3o Tom\u00e9<\/span><em>+239<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"58\">\n                                            <span>Venezuela<\/span><em>+58<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"27\">\n                                            <span>\u00c1frica do Sul<\/span><em>+27<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"61\">\n                                            <span>Austr\u00e1lia<\/span><em>+61<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"46\">\n                                            <span>Su\u00e9cia<\/span><em>+46<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"47\">\n                                            <span>Noruega<\/span><em>+47<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"45\">\n                                            <span>Dinamarca<\/span><em>+45<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"358\">\n                                            <span>Finl\u00e2ndia<\/span><em>+358<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"48\">\n                                            <span>Pol\u00f3nia<\/span><em>+48<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"43\">\n                                            <span>\u00c1ustria<\/span><em>+43<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"30\">\n                                            <span>Gr\u00e9cia<\/span><em>+30<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"376\">\n                                            <span>Andorra<\/span><em>+376<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"212\">\n                                            <span>Marrocos<\/span><em>+212<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"54\">\n                                            <span>Argentina<\/span><em>+54<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"52\">\n                                            <span>M\u00e9xico<\/span><em>+52<\/em>\n                                        <\/button>\n                                                                                <button type=\"button\" class=\"lf-ind-op\" role=\"option\" data-cod=\"90\">\n                                            <span>Turquia<\/span><em>+90<\/em>\n                                        <\/button>\n                                                                            <\/div>\n                                <\/div>\n                                <input type=\"tel\" name=\"telefone\" inputmode=\"tel\" pattern=\"^[0-9 ]{6,}$\" placeholder=\"9XXXXXXXX\" required>\n                            <\/div>\n                        <\/label>\n\n                        <div class=\"lf-field\">\n                            <span>N\u00ba de Tal\u00e3o<\/span>\n                            <div class=\"lf-auto\">Atribu\u00eddo automaticamente ao registar &middot; o mesmo nos dois tal\u00f5es<\/div>\n                        <\/div>\n\n                        <label class=\"lf-field\">\n                            <span>Pago<\/span>\n                            <select name=\"pago\" required>\n                                <option value=\"\">-- Selecionar --<\/option>\n                                <option value=\"sim\">Sim<\/option>\n                                <option value=\"nao\">N\u00e3o<\/option>\n                            <\/select>\n                        <\/label>\n                    <\/div>\n\n                    <\/div><!-- \/passo 1 -->\n\n                    <div class=\"lf-step\" data-step=\"2\">\n                    <fieldset class=\"lf-block\">\n                        <legend>O que est\u00e1 a vender<\/legend>\n\n                        <div class=\"lf-pecas\" id=\"lfPecas\"><\/div>\n\n                        <div class=\"lf-add-peca\">\n                            <span class=\"lf-add-label\">Adicionar pe\u00e7a:<\/span>\n                            <div class=\"lf-artigos\" id=\"lfArtigos\">\n                                                                    <button type=\"button\" class=\"lf-artigo\" data-artigo=\"fato\">\n                                        Fato                                    <\/button>\n                                                                    <button type=\"button\" class=\"lf-artigo\" data-artigo=\"casaco\">\n                                        Casaco                                    <\/button>\n                                                                    <button type=\"button\" class=\"lf-artigo\" data-artigo=\"calca\">\n                                        Cal\u00e7a                                    <\/button>\n                                                                    <button type=\"button\" class=\"lf-artigo\" data-artigo=\"calca_ganga\">\n                                        Cal\u00e7a de ganga                                    <\/button>\n                                                                    <button type=\"button\" class=\"lf-artigo\" data-artigo=\"camisa\">\n                                        Camisa                                    <\/button>\n                                                                    <button type=\"button\" class=\"lf-artigo\" data-artigo=\"colete\">\n                                        Colete                                    <\/button>\n                                                                    <button type=\"button\" class=\"lf-artigo\" data-artigo=\"outro\">\n                                        Outra pe\u00e7a                                    <\/button>\n                                                            <\/div>\n                        <\/div>\n\n                        <p class=\"lf-vazio\" id=\"lfPecasVazio\">Escolhe em cima o que est\u00e1s a vender. Podes juntar mais do que uma pe\u00e7a ao mesmo tal\u00e3o \u2014 por exemplo um fato, uma camisa e uma cal\u00e7a de ganga \u00e0 parte.<\/p>\n                    <\/fieldset>\n                    <\/div><!-- \/passo 2 -->\n\n                    <div class=\"lf-step\" data-step=\"3\">\n                    <fieldset class=\"lf-block\">\n                        <legend>Datas<\/legend>\n                        <div class=\"lf-grid\">\n                            <label class=\"lf-field\">\n                                <span>Data das costureiras (execu\u00e7\u00e3o)<\/span>\n                                <input type=\"date\" name=\"data_costureira\" id=\"lfDataCostureira\" min=\"2026-10-23\" required>\n                            <\/label>\n\n                            <label class=\"lf-field\">\n                                <span>Data do cliente (levantamento)<\/span>\n                                <input type=\"date\" name=\"previsto\" id=\"lfDataCliente\" min=\"2026-10-23\" required>\n                            <\/label>\n                        <\/div>\n\n                        <div class=\"lf-cap\" id=\"lfCap\" hidden>\n                            <div class=\"lf-cap-head\">\n                                <span class=\"lf-dot\" id=\"lfDot\"><\/span>\n                                <strong id=\"lfCapTitle\">\u2014<\/strong>\n                                <span class=\"lf-cap-pct\" id=\"lfCapPct\"><\/span>\n                            <\/div>\n                            <div class=\"lf-bar\"><i id=\"lfBar\"><\/i><\/div>\n                            <div class=\"lf-cap-sub\" id=\"lfCapSub\"><\/div>\n                            <div class=\"lf-sugestoes\" id=\"lfSugestoes\"><\/div>\n                        <\/div>\n\n                        <label class=\"lf-force\" id=\"lfForceWrap\" hidden>\n                            <input type=\"checkbox\" name=\"forcar\" value=\"1\" id=\"lfForce\">\n                            <span>Agendar mesmo assim (dia sem capacidade livre)<\/span>\n                        <\/label>\n\n                        <div class=\"lf-week\" id=\"lfWeek\" role=\"group\" aria-label=\"Ocupa\u00e7\u00e3o dos pr\u00f3ximos dias\"><\/div>\n                    <\/fieldset>\n                    <\/div><!-- \/passo 3 -->\n\n                    <div class=\"lf-step\" data-step=\"4\">\n                    <div class=\"lf-resumo-final\" id=\"lfResumoFinal\" hidden><\/div>\n\n                    <div class=\"lf-grid\">\n                        \n                        <label class=\"lf-field lf-col-2\">\n                            <span>Observa\u00e7\u00f5es para a costura (opcional)<\/span>\n                            <input type=\"text\" name=\"observacoes\" placeholder=\"Ex.: marcar com alfinetes, cliente alto...\">\n                        <\/label>\n                    <\/div>\n\n                    <\/div><!-- \/passo 4 -->\n\n                    <div class=\"lf-actions\">\n                        <div class=\"lf-resumo\">\n                            <strong id=\"lfTotal\">0 min<\/strong>\n                            <span id=\"lfResumoSub\">Sem servi\u00e7os escolhidos<\/span>\n                        <\/div>\n                        <div class=\"lf-actions-btns\">\n                            <button type=\"button\" class=\"lf-btn lf-btn-ghost lf-btn-nav\" id=\"lfVoltar\" hidden>Voltar<\/button>\n                            <button type=\"button\" class=\"lf-btn lf-btn-ghost\" id=\"lfReprint\" hidden>Reimprimir<\/button>\n                            <button type=\"button\" class=\"lf-btn lf-btn-nav\" id=\"lfSeguinte\" hidden>Seguinte<\/button>\n                            <button type=\"submit\" class=\"lf-btn\" id=\"lfRegistar\">Registar e imprimir<\/button>\n                        <\/div>\n                    <\/div>\n                    <p class=\"lf-hint\">Imprime 2 tal\u00f5es: um para o cliente e outro para a costura.<\/p>\n                <\/form>\n            <\/div>\n        <\/div>\n\n        <style>\n            .lf-wrap [hidden]{display:none !important}\n            .lf-wrap *,.lf-wrap *::before,.lf-wrap *::after{box-sizing:border-box}\n            .lf-wrap{max-width:900px;margin:0 auto;padding:8px}\n\n            \/* Reposi\u00e7\u00e3o: temas e kits (Elementor, por exemplo) costumam impor largura total,\n               mai\u00fasculas e alturas m\u00ednimas a todos os <button>, o que desfaz esta interface.\n               Todo o CSS aqui vai prefixado com .lf-wrap para empatar essas regras e ganhar\n               por ordem, j\u00e1 que este bloco sai depois do <head>. *\/\n            .lf-wrap button{width:auto;min-width:0;max-width:none;min-height:0;text-transform:none;\n                letter-spacing:normal;line-height:1.2;box-shadow:none;text-decoration:none;flex:0 0 auto}\n            .lf-wrap input,.lf-wrap select,.lf-wrap textarea{min-height:0;text-transform:none;letter-spacing:normal}\n            .lf-wrap .lf-card{background:#fff;border:1px solid #e5e7eb;border-radius:16px;padding:22px;box-shadow:0 4px 18px rgba(0,0,0,.06)}\n            .lf-wrap .lf-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}\n            .lf-wrap .lf-field{display:flex;flex-direction:column;gap:6px}\n            .lf-wrap .lf-field>span{font-size:.92rem;color:#374151;font-weight:600}\n            .lf-wrap .lf-field input,.lf-wrap .lf-field select{\n                border:1px solid #d1d5db;border-radius:12px;padding:12px 14px;font-size:1rem;width:100%;\n                transition:border-color .15s, box-shadow .15s; background:#f9fafb\n            }\n            .lf-wrap .lf-field input:focus,.lf-wrap .lf-field select:focus{\n                outline:none;border-color:#111827;box-shadow:0 0 0 4px rgba(17,24,39,.08);background:#fff\n            }\n            .lf-wrap .lf-col-2{grid-column:span 2 \/ span 2}\n            .lf-wrap .lf-auto{border:1px dashed #d1d5db;border-radius:12px;padding:12px 14px;font-size:.88rem;color:#6b7280;background:#f9fafb}\n            .lf-wrap .lf-opt{font-style:normal;font-weight:500;color:#9ca3af}\n\n            \/* Ecr\u00e3 de entrada (c\u00f3digo do vendedor) *\/\n            .lf-wrap .lf-gate{display:flex;align-items:center;justify-content:center;min-height:70vh;padding:16px}\n            .lf-wrap .lf-gate-card{background:#fff;border:1px solid #e5e7eb;border-radius:20px;padding:26px 22px;box-shadow:0 4px 18px rgba(0,0,0,.06);width:100%;max-width:340px;text-align:center}\n            .lf-wrap .lf-gate-logo{font-weight:800;letter-spacing:.04em;text-transform:uppercase;font-size:.8rem;color:#6b7280}\n            .lf-wrap .lf-gate-card h2{margin:10px 0 4px;font-size:1.15rem;color:#111827}\n            .lf-wrap .lf-gate-sub{margin:0 0 18px;font-size:.88rem;color:#6b7280}\n            .lf-wrap .lf-pin{display:flex;gap:14px;justify-content:center;margin:0 0 22px}\n            .lf-wrap .lf-pin i{width:14px;height:14px;border-radius:999px;border:2px solid #d1d5db;display:block;transition:background-color .12s,border-color .12s}\n            .lf-wrap .lf-pin i.on{background:#111827;border-color:#111827}\n            .lf-wrap .lf-pin.erro i{border-color:#ef4444}\n            .lf-wrap .lf-keys{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}\n            .lf-wrap .lf-keys button{appearance:none;border:1px solid #e5e7eb;background:#f9fafb;border-radius:14px;padding:16px 0;font-size:1.35rem;font-weight:700;color:#111827;cursor:pointer}\n            .lf-wrap .lf-keys button:active{background:#111827;color:#fff}\n            .lf-wrap .lf-keys .lf-key-alt{font-size:1.1rem;background:#fff;color:#6b7280}\n            .lf-wrap .lf-gate-erro{margin:16px 0 0;color:#b91c1c;font-size:.86rem;font-weight:600}\n\n            \/* Barra do vendedor autenticado *\/\n            .lf-wrap .lf-user{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;\n                     border:1px solid #e5e7eb;border-radius:12px;padding:10px 14px;margin-bottom:16px;background:#f9fafb}\n            .lf-wrap .lf-user-label{display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:#9ca3af}\n            .lf-wrap .lf-user strong{font-size:1rem;color:#111827}\n            .lf-wrap .lf-user-acoes{display:flex;align-items:center;gap:14px}\n            .lf-wrap .lf-print-toggle{display:flex;align-items:center;gap:6px;font-size:.85rem;color:#374151;cursor:pointer}\n            .lf-wrap .lf-print-toggle input{width:16px;height:16px}\n            .lf-wrap .lf-link{background:none;border:0;color:#6b7280;text-decoration:underline;cursor:pointer;font-size:.85rem;padding:0}\n\n            \/* Menu do vendedor *\/\n            .lf-wrap button.lf-burger,.lf-wrap .lf-burger{appearance:none;border:1px solid #e5e7eb;background:#fff;border-radius:12px !important;\n                        width:42px;height:42px;padding:0;display:flex;flex-direction:column;align-items:center;\n                        justify-content:center;gap:4px;cursor:pointer}\n            .lf-wrap .lf-burger span{display:block;width:18px;height:2px;background:#111827;border-radius:2px;transition:transform .15s,opacity .15s}\n            .lf-wrap .lf-burger[aria-expanded=\"true\"] span:nth-child(1){transform:translateY(6px) rotate(45deg)}\n            .lf-wrap .lf-burger[aria-expanded=\"true\"] span:nth-child(2){opacity:0}\n            .lf-wrap .lf-burger[aria-expanded=\"true\"] span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}\n\n            \/* Gaveta lateral *\/\n            .lf-wrap .lf-drawer{position:fixed;inset:0;z-index:60}\n            .lf-wrap .lf-drawer-fundo{position:absolute;inset:0;background:rgba(15,23,42,.45);\n                        opacity:0;transition:opacity .22s ease}\n            .lf-wrap .lf-drawer.aberto .lf-drawer-fundo{opacity:1}\n            .lf-wrap .lf-drawer-painel{position:absolute;top:0;right:0;bottom:0;width:86%;max-width:320px;\n                        background:#fff;box-shadow:-12px 0 32px rgba(15,23,42,.18);display:flex;flex-direction:column;\n                        transform:translateX(100%);transition:transform .24s cubic-bezier(.32,.72,0,1);\n                        padding-bottom:env(safe-area-inset-bottom);overflow-y:auto}\n            .lf-wrap .lf-drawer.aberto .lf-drawer-painel{transform:translateX(0)}\n\n            .lf-wrap .lf-drawer-topo{display:flex;align-items:center;gap:10px;padding:18px 16px 14px;border-bottom:1px solid #f1f5f9}\n            .lf-wrap .lf-drawer-quem{display:flex;align-items:center;gap:12px;flex:1 1 auto;min-width:0}\n            .lf-wrap .lf-drawer-inicial{width:42px;height:42px;border-radius:999px;background:#111827;color:#fff;\n                        display:flex;align-items:center;justify-content:center;font-weight:800;font-size:1rem;flex:0 0 auto}\n            .lf-wrap .lf-drawer-txt{min-width:0}\n            .lf-wrap .lf-drawer-txt strong{display:block;font-size:1rem;color:#111827;\n                        white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n            .lf-wrap .lf-drawer-txt small{display:block;font-size:.76rem;color:#6b7280;text-transform:capitalize}\n            .lf-wrap .lf-drawer-x{appearance:none;border:0;background:#f3f4f6;color:#374151;width:34px;height:34px;\n                        border-radius:999px;font-size:1.4rem;line-height:1;cursor:pointer;flex:0 0 auto}\n\n            .lf-wrap .lf-drawer-nav{padding:8px 0}\n            .lf-wrap .lf-drawer-sep{padding:14px 16px 6px;font-size:.68rem;text-transform:uppercase;\n                        letter-spacing:.08em;color:#9ca3af;font-weight:700;border-top:1px solid #f1f5f9;margin-top:4px}\n            .lf-wrap .lf-drawer-item{display:flex;align-items:center;gap:14px;width:100%;text-align:left;\n                        appearance:none;border:0;background:none;padding:13px 16px;cursor:pointer;color:#111827}\n            .lf-wrap .lf-drawer-item:active{background:#f8fafc}\n            .lf-wrap .lf-drawer-item svg{width:22px;height:22px;flex:0 0 auto;fill:none;stroke:#111827;\n                        stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}\n            .lf-wrap .lf-drawer-item>span{flex:1 1 auto;min-width:0}\n            .lf-wrap .lf-drawer-item b{display:block;font-size:.95rem;line-height:1.3}\n            .lf-wrap .lf-drawer-item small{display:block;font-size:.76rem;color:#6b7280;line-height:1.35}\n            .lf-wrap .lf-drawer-toggle input{width:24px;height:24px;flex:0 0 auto;margin:0}\n            .lf-wrap .lf-drawer-sair{margin-top:auto;border-top:1px solid #f1f5f9}\n            .lf-wrap .lf-drawer-sair b{color:#b91c1c}\n            .lf-wrap .lf-drawer-sair svg{stroke:#b91c1c}\n\n            \/* Lista de agendamentos *\/\n            .lf-wrap .lf-busca{margin-bottom:14px}\n            .lf-wrap .lf-ag{border:1px solid #e5e7eb;border-radius:14px;padding:12px 14px;margin-bottom:10px;background:#fff}\n            .lf-wrap .lf-ag.pronto{background:#f0fdf4;border-color:#bbf7d0}\n            .lf-wrap .lf-ag-topo{display:flex;align-items:baseline;gap:8px}\n            .lf-wrap .lf-ag-num{font-weight:800;color:#111827}\n            .lf-wrap .lf-ag-cliente{flex:1 1 auto;min-width:0;font-size:.95rem;color:#374151;\n                        white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n            .lf-wrap .lf-ag-estado{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:#15803d}\n            .lf-wrap .lf-ag-svc{font-size:.86rem;color:#4b5563;margin:6px 0 4px}\n            .lf-wrap .lf-ag-datas{font-size:.78rem;color:#6b7280}\n            .lf-wrap .lf-ag-acoes{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}\n            .lf-wrap button.lf-ag-btn,.lf-wrap .lf-ag-btn{appearance:none;border:1px solid #d1d5db;background:#fff;border-radius:999px !important;\n                        padding:9px 14px;font-size:.85rem;font-weight:600;color:#111827;cursor:pointer}\n            .lf-wrap .lf-ag-btn.principal{background:#111827;color:#fff;border-color:#111827}\n            .lf-wrap .lf-ag-btn.apagar{color:#b91c1c;border-color:#fecaca}\n            .lf-wrap .lf-ag-vazio{text-align:center;color:#6b7280;font-size:.9rem;padding:26px 10px}\n\n            .lf-wrap .lf-editar-aviso{display:flex;align-items:center;gap:10px;background:#fffbeb;border:1px solid #fde68a;\n                        border-radius:12px;padding:10px 14px;margin-bottom:14px;font-size:.88rem;color:#78350f}\n            .lf-wrap .lf-editar-aviso button{margin-left:auto;flex:0 0 auto}\n\n            \/* Ecr\u00e3 das costureiras *\/\n            .lf-wrap .lf-cost-dia{display:flex;align-items:center;gap:10px;margin-bottom:16px}\n            \/* Caixa de mensagens dos clientes *\/\n            .lf-wrap .lf-badge{flex:0 0 auto;background:#25D366;color:#06331a;border-radius:999px;\n                        min-width:22px;padding:2px 7px;font-size:.75rem;font-weight:800;text-align:center}\n            .lf-wrap .lf-conv{display:flex;align-items:center;gap:12px;width:100%;text-align:left;appearance:none;\n                        border:1px solid #e5e7eb !important;border-radius:16px !important;background:#fff !important;\n                        color:#111827 !important;padding:12px 14px;margin-bottom:8px;cursor:pointer}\n            .lf-wrap .lf-conv.novas{border-color:#25D366 !important;background:#f0fdf4 !important}\n            .lf-wrap .lf-conv-txt{flex:1 1 auto;min-width:0}\n            .lf-wrap .lf-conv-nome{display:block;font-weight:700;font-size:.95rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n            .lf-wrap .lf-conv-ultima{display:block;font-size:.84rem;color:#6b7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n            .lf-wrap .lf-conv-hora{flex:0 0 auto;font-size:.74rem;color:#9ca3af}\n            .lf-wrap .lf-msg-fio{display:flex;flex-direction:column;gap:8px;padding:6px 0 10px}\n            .lf-wrap .lf-msg{max-width:82%;padding:9px 13px;border-radius:16px;font-size:.92rem;line-height:1.4;white-space:pre-wrap;word-break:break-word}\n            .lf-wrap .lf-msg.deles{align-self:flex-start;background:#f3f4f6;border-bottom-left-radius:6px}\n            .lf-wrap .lf-msg.nossa{align-self:flex-end;background:#dcfce7;border-bottom-right-radius:6px}\n            .lf-wrap .lf-msg small{display:block;margin-top:4px;font-size:.7rem;color:#6b7280}\n            .lf-wrap .lf-msg-aviso{font-size:.8rem;color:#6b7280;margin:0 0 8px;text-align:center}\n            .lf-wrap .lf-msg-resposta{display:flex;gap:8px;align-items:flex-end}\n            .lf-wrap .lf-msg-resposta textarea{flex:1 1 auto;min-width:0;border:1px solid #d1d5db;border-radius:16px;\n                        padding:10px 14px;font-size:1rem;font-family:inherit;background:#f9fafb;resize:none}\n            .lf-wrap .lf-msg-vazio{text-align:center;color:#6b7280;font-size:.9rem;padding:26px 10px}\n\n            \/* Telefone: indicativo do pa\u00eds + n\u00famero, lado a lado *\/\n            .lf-wrap .lf-tel{display:flex;gap:8px;align-items:stretch}\n            \/* Indicativo: bot\u00e3o pequeno s\u00f3 com o c\u00f3digo; a lista tem os pa\u00edses todos *\/\n            .lf-wrap .lf-ind{position:relative;flex:0 0 auto}\n            .lf-wrap button.lf-ind-btn,.lf-wrap .lf-ind-btn{display:flex;align-items:center;gap:5px;width:auto;\n                        appearance:none;border:1px solid #d1d5db !important;border-radius:12px !important;\n                        background:#f9fafb !important;color:#111827 !important;cursor:pointer;\n                        padding:12px 10px 12px 12px;font-size:1rem;font-weight:600;line-height:1.2;white-space:nowrap}\n            .lf-wrap .lf-ind-btn svg{width:11px;height:7px;flex:0 0 auto;fill:none;stroke:#374151;stroke-width:1.8;\n                        stroke-linecap:round;stroke-linejoin:round}\n            .lf-wrap .lf-ind-lista{position:absolute;z-index:40;top:calc(100% + 6px);left:0;width:min(272px,78vw);\n                        max-height:280px;overflow-y:auto;background:#fff;border:1px solid #e5e7eb;border-radius:14px;\n                        box-shadow:0 12px 28px rgba(15,23,42,.16);padding:8px}\n            .lf-wrap .lf-ind-lista input[type=\"search\"]{width:100%;border:1px solid #d1d5db;border-radius:10px;\n                        padding:9px 12px;font-size:1rem;margin-bottom:6px;background:#f9fafb}\n            .lf-wrap button.lf-ind-op,.lf-wrap .lf-ind-op{display:flex;align-items:center;justify-content:space-between;gap:10px;\n                        width:100%;appearance:none;border:0 !important;background:transparent !important;color:#111827 !important;\n                        border-radius:10px !important;padding:10px 10px;font-size:.95rem;text-align:left;cursor:pointer}\n            .lf-wrap .lf-ind-op:hover,.lf-wrap .lf-ind-op.escolhido{background:#f3f4f6 !important}\n            .lf-wrap .lf-ind-op em{font-style:normal;color:#6b7280;font-size:.88rem}\n            .lf-wrap .lf-tel input{flex:1 1 auto;min-width:0}\n            .lf-wrap .lf-cost-busca{display:flex;gap:8px;margin-bottom:14px}\n            .lf-wrap .lf-cost-busca input{flex:1 1 auto;min-width:0;border:1px solid #e5e7eb;border-radius:999px;\n                        padding:10px 16px;font-size:16px;background:#fff;color:#111827;margin:0}\n            .lf-wrap .lf-ag-btn.pronto{background:#16a34a !important;color:#fff !important;border-color:#16a34a !important}\n            .lf-wrap .lf-cost-seta{appearance:none;border:1px solid #e5e7eb;background:#fff;width:40px;height:40px;\n                        border-radius:999px;font-size:1.4rem;line-height:1;color:#111827;cursor:pointer;flex:0 0 auto}\n            .lf-wrap .lf-cost-data{flex:1 1 auto;min-width:0;text-align:center}\n            .lf-wrap .lf-cost-data strong{display:block;font-size:1rem;color:#111827}\n            .lf-wrap .lf-cost-data span{display:block;font-size:.78rem;color:#6b7280}\n            .lf-wrap .lf-cost-hoje{appearance:none;border:1px solid #e5e7eb;background:#fff;border-radius:999px;\n                        padding:9px 14px;font-size:.85rem;font-weight:600;cursor:pointer;color:#111827;flex:0 0 auto}\n\n            .lf-wrap .lf-cost-grupo{font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;color:#9ca3af;\n                        font-weight:700;margin:18px 0 8px}\n            .lf-wrap .lf-trab{border:1px solid #e5e7eb;border-radius:16px;padding:14px;margin-bottom:10px;background:#fff}\n            .lf-wrap .lf-trab.feito{background:#f0fdf4;border-color:#bbf7d0}\n            .lf-wrap .lf-trab.atraso{border-color:#fdba74;background:#fff7ed}\n            .lf-wrap .lf-trab-topo{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}\n            .lf-wrap .lf-trab-num{font-weight:800;font-size:1.05rem;color:#111827}\n            .lf-wrap .lf-trab-cliente{flex:1 1 auto;min-width:0;font-size:.95rem;color:#374151;\n                        white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n            .lf-wrap .lf-trab-min{font-size:.78rem;color:#6b7280;white-space:nowrap}\n            .lf-wrap .lf-trab-peca{margin:6px 0}\n            .lf-wrap .lf-trab-peca b{display:block;font-size:.82rem;text-transform:uppercase;letter-spacing:.04em;color:#111827}\n            .lf-wrap .lf-trab-peca span{font-size:.92rem;color:#374151}\n            .lf-wrap .lf-trab-obs{margin-top:8px;padding:8px 10px;border-radius:10px;background:#fffbeb;\n                        border:1px solid #fde68a;font-size:.86rem;color:#78350f}\n            .lf-wrap .lf-trab-rodape{display:flex;align-items:center;gap:10px;margin-top:12px;flex-wrap:wrap}\n            .lf-wrap .lf-trab-entrega{font-size:.8rem;color:#6b7280;flex:1 1 auto}\n            .lf-wrap button.lf-trab-btn,.lf-wrap .lf-trab-btn{appearance:none;border:0;border-radius:999px !important;padding:13px 18px;font-weight:700;\n                        font-size:.95rem;cursor:pointer;background:#111827;color:#fff;flex:0 0 auto}\n            .lf-wrap .lf-trab-btn[disabled]{background:#e5e7eb;color:#9ca3af;cursor:default}\n            .lf-wrap .lf-trab-estado{font-size:.85rem;font-weight:600;color:#15803d}\n            .lf-wrap .lf-trab-tel{display:inline-block;font-size:.9rem;font-weight:700;color:#b45309;\n                        text-decoration:none;border:1px solid #fdba74;border-radius:999px !important;padding:10px 16px;background:#fff}\n\n            \/* Bot\u00e3o de WhatsApp: abre a conversa j\u00e1 escrita no telem\u00f3vel de quem est\u00e1 a atender *\/\n            .lf-wrap a.lf-wa,.lf-wrap .lf-wa{display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;\n                        background:#25D366 !important;color:#06331a !important;text-decoration:none !important;\n                        border:0 !important;border-radius:999px !important;padding:10px 16px;\n                        font-size:.88rem;font-weight:700;white-space:nowrap}\n            .lf-wrap a.lf-wa svg,.lf-wrap button.lf-wa svg{width:17px;height:17px;fill:none;stroke:#06331a;stroke-width:2;\n                        stroke-linecap:round;stroke-linejoin:round}\n            \/* Com a API ligada o WhatsApp \u00e9 um bot\u00e3o (envia pelo site) \u2014 anular o estilo de bot\u00e3o do tema *\/\n            .lf-wrap button.lf-wa,.lf-wrap button.lf-toast-wa{appearance:none;border:0 !important;cursor:pointer;\n                        font-family:inherit;line-height:1.2;min-height:0;text-transform:none;letter-spacing:0;\n                        box-shadow:none !important;margin:0}\n            .lf-wrap button.lf-wa:disabled,.lf-wrap button.lf-toast-wa:disabled{opacity:.7;cursor:default}\n            .lf-wrap button.lf-wa.enviado{background:#dcfce7 !important}\n            .lf-wrap .lf-cost-vazio{text-align:center;color:#6b7280;font-size:.9rem;padding:28px 10px}\n\n            \/* min-width:0 \u00e9 obrigat\u00f3rio: o fieldset nasce com min-width:min-content e a faixa\n               dos dias (nowrap) esticava-o para l\u00e1 da largura do ecr\u00e3 no telem\u00f3vel *\/\n            .lf-wrap .lf-block{border:1px solid #e5e7eb;border-radius:14px;padding:16px;margin:18px 0;min-width:0}\n            .lf-wrap .lf-block>legend{font-weight:700;font-size:.95rem;color:#111827;padding:0 8px}\n\n            .lf-wrap .lf-services{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}\n            .lf-wrap .lf-svc{display:flex;align-items:center;gap:10px;min-width:0;border:1px solid #e5e7eb;border-radius:14px;\n                    padding:10px 12px;background:#f9fafb;transition:border-color .12s,background-color .12s,box-shadow .12s}\n            .lf-wrap .lf-svc.is-on{border-color:#111827;background:#fff;box-shadow:0 0 0 3px rgba(17,24,39,.07)}\n            .lf-wrap .lf-svc-main{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0;cursor:pointer;\n                         -webkit-tap-highlight-color:transparent;user-select:none}\n            .lf-wrap .lf-svc input.lf-svc-check{position:absolute;opacity:0;width:1px;height:1px;margin:0;pointer-events:none}\n            .lf-wrap .lf-svc-box{flex:0 0 auto;width:24px;height:24px;border:2px solid #d1d5db;border-radius:8px;background:#fff;\n                        position:relative;transition:background-color .12s,border-color .12s}\n            .lf-wrap .lf-svc-box::after{content:\"\";position:absolute;left:7px;top:2px;width:6px;height:12px;\n                        border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg) scale(.4);opacity:0;transition:opacity .12s,transform .12s}\n            .lf-wrap .lf-svc-check:checked + .lf-svc-box{background:#111827;border-color:#111827}\n            .lf-wrap .lf-svc-check:checked + .lf-svc-box::after{opacity:1;transform:rotate(45deg) scale(1)}\n            .lf-wrap .lf-svc-check:focus-visible + .lf-svc-box{box-shadow:0 0 0 4px rgba(17,24,39,.15)}\n            .lf-wrap .lf-svc-txt{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1 1 auto}\n            .lf-wrap .lf-svc-nome{font-size:.95rem;line-height:1.25;color:#111827;overflow-wrap:anywhere}\n            .lf-wrap .lf-svc-min{font-size:.78rem;color:#6b7280}\n\n            .lf-wrap div.lf-stepper,.lf-wrap .lf-stepper{flex:0 0 auto;display:flex;align-items:center;gap:2px;background:#fff;border:1px solid #d1d5db;border-radius:999px !important;padding:2px}\n            .lf-wrap .lf-stepper .lf-q{appearance:none;border:0;background:transparent;width:34px;height:34px;border-radius:999px;\n                        font-size:1.15rem;line-height:1;font-weight:700;color:#111827;cursor:pointer}\n            .lf-wrap .lf-stepper .lf-q:active{background:#111827;color:#fff}\n            .lf-wrap .lf-stepper input.lf-svc-qtd{width:30px;min-width:30px;border:0;background:transparent;text-align:center;\n                        font-size:1rem;font-weight:700;padding:0;color:#111827;-moz-appearance:textfield}\n            .lf-wrap .lf-stepper input.lf-svc-qtd::-webkit-outer-spin-button,\n            .lf-wrap .lf-stepper input.lf-svc-qtd::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n\n            .lf-wrap .lf-outro{margin-top:14px}\n\n            \/* Pe\u00e7as (o que est\u00e1 a ser vendido) *\/\n            .lf-wrap .lf-add-peca{margin-top:14px}\n            .lf-wrap .lf-add-label{display:block;font-size:.8rem;color:#6b7280;font-weight:600;margin-bottom:8px}\n            .lf-wrap .lf-artigos{display:flex;flex-wrap:wrap;gap:8px}\n            .lf-wrap button.lf-artigo,.lf-wrap .lf-artigo{appearance:none;width:auto;flex:0 0 auto;text-transform:none !important;border:1px solid #d1d5db;background:#fff;border-radius:999px !important;\n                       padding:10px 16px;font-size:.9rem;font-weight:600;color:#111827;cursor:pointer}\n            .lf-wrap .lf-artigo:hover{border-color:#111827;background:#f9fafb}\n            .lf-wrap .lf-artigo:active{background:#111827;color:#fff}\n            .lf-wrap .lf-vazio{margin:14px 0 0;font-size:.86rem;color:#6b7280;line-height:1.5}\n\n            .lf-wrap .lf-peca{border:1px solid #e5e7eb;border-radius:16px;padding:12px;margin-bottom:12px;background:#fff}\n            .lf-wrap .lf-peca.sem-servico{border-color:#fbbf24;background:#fffbeb}\n            .lf-wrap .lf-peca-head{display:flex;align-items:center;gap:10px;margin-bottom:10px}\n            .lf-wrap .lf-peca-nome{font-weight:700;font-size:1rem;color:#111827;flex:1 1 auto;min-width:0}\n            .lf-wrap .lf-peca-min{font-size:.8rem;color:#6b7280;white-space:nowrap}\n            .lf-wrap .lf-peca-del{appearance:none;border:0;background:#f3f4f6;color:#6b7280;width:30px;height:30px;\n                         border-radius:999px;font-size:1.1rem;line-height:1;cursor:pointer;flex:0 0 auto}\n            .lf-wrap .lf-peca-del:hover{background:#fee2e2;color:#b91c1c}\n            .lf-wrap .lf-peca-svcs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n            .lf-wrap .lf-mais{appearance:none;border:0;background:none;color:#374151;text-decoration:underline;\n                     font-size:.84rem;cursor:pointer;padding:10px 0 2px}\n\n            \/* Passos *\/\n            .lf-wrap .lf-steps-head{margin-bottom:16px}\n            .lf-wrap .lf-steps-nav{display:flex;list-style:none;margin:0 0 8px;padding:0;gap:4px;counter-reset:passo}\n            .lf-wrap .lf-steps-nav li{flex:1 1 0;font-size:.72rem;color:#9ca3af;text-align:center;cursor:pointer;\n                             text-transform:uppercase;letter-spacing:.04em;font-weight:700}\n            .lf-wrap .lf-steps-nav li.is-on{color:#111827}\n            .lf-wrap .lf-steps-nav li.is-feito{color:#6b7280}\n            .lf-wrap .lf-steps-bar{height:4px;border-radius:999px;background:#e5e7eb;overflow:hidden}\n            .lf-wrap .lf-steps-bar>i{display:block;height:100%;width:25%;background:#111827;transition:width .25s ease}\n            .lf-wrap .lf-btn-nav{flex:0 0 auto}\n\n            .lf-wrap .lf-resumo-final{border:1px solid #e5e7eb;border-radius:16px;padding:14px;background:#f9fafb;margin-bottom:16px}\n            .lf-wrap .lf-rf-topo{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:10px}\n            .lf-wrap .lf-rf-topo strong{font-size:1.05rem;color:#111827}\n            .lf-wrap .lf-rf-topo span{font-size:.82rem;color:#6b7280}\n            .lf-wrap .lf-rf-lista{list-style:none;margin:0;padding:0}\n            .lf-wrap .lf-rf-lista li{display:flex;gap:8px;align-items:baseline;padding:8px 0;border-top:1px solid #e5e7eb;font-size:.88rem}\n            .lf-wrap .lf-rf-lista b{flex:0 0 auto;color:#111827}\n            .lf-wrap .lf-rf-lista span{flex:1 1 auto;color:#4b5563;min-width:0}\n            .lf-wrap .lf-rf-lista em{flex:0 0 auto;font-style:normal;color:#6b7280;font-size:.8rem}\n            .lf-wrap .lf-rf-datas{display:flex;gap:10px;margin-top:12px}\n            .lf-wrap .lf-rf-datas>div{flex:1 1 0;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:8px 10px}\n            .lf-wrap .lf-rf-datas span{display:block;font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;color:#9ca3af}\n            .lf-wrap .lf-rf-datas strong{font-size:.95rem;color:#111827}\n\n            .lf-wrap .lf-cap{margin-top:14px;border:1px solid #e5e7eb;border-radius:12px;padding:12px 14px;background:#f9fafb}\n            .lf-wrap .lf-cap-head{display:flex;align-items:center;gap:8px;font-size:.95rem}\n            .lf-wrap .lf-cap-pct{margin-left:auto;color:#6b7280;font-size:.85rem}\n            .lf-wrap .lf-dot{width:12px;height:12px;border-radius:999px;background:#9ca3af;display:inline-block}\n            .lf-wrap .lf-bar{height:8px;border-radius:999px;background:#e5e7eb;margin:8px 0;overflow:hidden}\n            .lf-wrap .lf-bar>i{display:block;height:100%;width:0;background:#16a34a;transition:width .2s}\n            .lf-wrap .lf-cap-sub{font-size:.85rem;color:#6b7280}\n            .lf-wrap .lf-sugestoes{margin-top:8px;display:flex;gap:8px;flex-wrap:wrap}\n            .lf-wrap .lf-sug{border:1px solid #d1d5db;background:#fff;border-radius:999px;padding:6px 12px;font-size:.82rem;cursor:pointer}\n            .lf-wrap .lf-sug:hover{border-color:#111827}\n            .lf-wrap .lf-force{display:flex;gap:8px;align-items:center;margin-top:10px;font-size:.9rem;color:#7f1d1d}\n\n            .lf-wrap .lf-week{display:flex;gap:6px;margin-top:12px;flex-wrap:wrap}\n            .lf-wrap .lf-wday{flex:1 1 60px;min-width:60px;border:1px solid #e5e7eb;border-radius:10px;padding:6px;text-align:center;cursor:pointer;background:#fff}\n            .lf-wrap .lf-wday:hover{border-color:#111827}\n            .lf-wrap .lf-wday.is-sel{box-shadow:0 0 0 3px rgba(17,24,39,.12);border-color:#111827}\n            .lf-wrap .lf-wday b{display:block;font-size:.78rem;color:#111827}\n            .lf-wrap .lf-wday span{display:block;font-size:.7rem;color:#6b7280}\n            .lf-wrap .lf-wday i{display:block;height:5px;border-radius:999px;margin-top:5px;background:#9ca3af}\n\n            .lf-wrap .lf-actions{display:flex;align-items:center;gap:12px;margin-top:18px;flex-wrap:wrap}\n            .lf-wrap .lf-resumo{min-width:0;display:flex;flex-direction:column;line-height:1.2;margin-right:auto}\n            .lf-wrap .lf-resumo strong{font-size:1.25rem;color:#111827;white-space:nowrap}\n            .lf-wrap .lf-resumo span{font-size:.8rem;color:#6b7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n            .lf-wrap .lf-actions-btns{display:flex;gap:10px;align-items:center}\n            \/* O !important aqui n\u00e3o \u00e9 pregui\u00e7a: h\u00e1 CSS do tema\/kit e um snippet do site a\n               impor cantos direitos e outras cores a todos os <button>, com regras que\n               ganham a estas. S\u00f3 as propriedades que definem a forma v\u00e3o marcadas. *\/\n            .lf-wrap button.lf-btn,.lf-wrap .lf-btn{width:auto;flex:0 0 auto;text-transform:none !important;letter-spacing:normal !important;\n                appearance:none;border:0 !important;border-radius:999px !important;padding:12px 22px;font-weight:700;cursor:pointer;\n                background:#111827 !important; color:#fff !important;\n                transition:transform .05s ease, filter .15s ease, background-color .15s ease, box-shadow .15s ease;\n            }\n            .lf-wrap .lf-btn:hover{ background:#1f2937 !important; }\n            .lf-wrap .lf-btn:focus{ outline:none; box-shadow:0 0 0 4px rgba(17,24,39,.18); }\n            .lf-wrap .lf-btn:disabled{ filter:grayscale(1) brightness(.9); cursor:not-allowed; }\n            .lf-wrap button.lf-btn-ghost,.lf-wrap .lf-btn-ghost{background:#fff !important;color:#111827 !important;border:1px solid #d1d5db !important}\n            .lf-wrap .lf-btn-ghost:hover{background:#f3f4f6 !important}\n            .lf-wrap .lf-hint{font-size:.9rem;color:#6b7280}\n            .lf-wrap .lf-toast{ margin-bottom:14px;border-radius:12px;padding:12px 14px;font-weight:600;\n                        display:flex;align-items:center;gap:12px;flex-wrap:wrap }\n            .lf-wrap .lf-toast-txt{flex:1 1 60%;min-width:0}\n            .lf-wrap .lf-toast-wa{flex:0 0 auto;background:#25D366 !important;color:#06331a !important;\n                        text-decoration:none;border-radius:999px !important;padding:9px 16px;font-weight:700;font-size:.88rem;\n                        white-space:nowrap}\n            .lf-wrap .lf-toast-x{flex:0 0 auto;appearance:none;border:0;background:transparent;color:inherit;\n                        font-size:1.3rem;line-height:1;cursor:pointer;padding:0 2px;opacity:.6}\n            .lf-wrap .lf-toast.success{background:#e6ffed;border-left:6px solid #10b981;color:#065f46}\n            .lf-wrap .lf-toast.error{background:#fff1f2;border-left:6px solid #ef4444;color:#7f1d1d}\n            \/* ---------- telem\u00f3vel: comportamento de app ---------- *\/\n            @media (max-width:720px){\n                \/* clip em vez de hidden: hidden criaria um contentor de scroll e matava o position:sticky *\/\n                \/* Sem overflow aqui: um contexto de corte no antecessor recorta a barra fixa.\n                   O transbordo j\u00e1 \u00e9 evitado no min-width dos blocos. *\/\n                .lf-wrap{padding:0;max-width:100%}\n                .lf-wrap .lf-card{border:0;border-radius:0;box-shadow:none;\n                         padding:14px 14px calc(20px + env(safe-area-inset-bottom))}\n\n                \/* S\u00f3 o cart\u00e3o do formul\u00e1rio tem a barra fixa por cima. Reserva-lhe espa\u00e7o:\n                   o valor certo \u00e9 acertado por JS \u00e0 altura real da barra, isto \u00e9 o m\u00ednimo. *\/\n                .lf-wrap #lfCard{padding-bottom:calc(140px + env(safe-area-inset-bottom)) !important}\n                \/* Ao focar um campo perto do fundo, o browser n\u00e3o o deixa debaixo da barra *\/\n                html{scroll-padding-bottom:150px}\n\n                .lf-wrap .lf-grid{grid-template-columns:1fr;gap:14px}\n                .lf-wrap .lf-col-2{grid-column:auto}\n                .lf-wrap .lf-services{grid-template-columns:1fr;gap:8px}\n\n                \/* 16px evita o zoom autom\u00e1tico do iPhone ao tocar num campo *\/\n                .lf-wrap .lf-field input,.lf-wrap .lf-field select{font-size:16px;padding:14px}\n                \/* no telem\u00f3vel o bot\u00e3o do indicativo acompanha a altura do campo do n\u00famero *\/\n                .lf-wrap button.lf-ind-btn,.lf-wrap .lf-ind-btn{padding:14px 10px 14px 12px;font-size:16px}\n                .lf-wrap button.lf-ind-op,.lf-wrap .lf-ind-op{padding:13px 10px}\n                .lf-wrap .lf-ind-lista input[type=\"search\"]{font-size:16px}\n                .lf-wrap .lf-field>span{font-size:.85rem}\n\n                .lf-wrap .lf-block{padding:14px 12px;border-radius:16px;margin:16px 0}\n                .lf-wrap .lf-block>legend{font-size:.9rem}\n\n                .lf-wrap .lf-peca-svcs{grid-template-columns:1fr;gap:8px}\n                .lf-wrap .lf-artigo{padding:12px 18px;font-size:.95rem}\n                .lf-wrap .lf-steps-nav li{font-size:.68rem}\n                .lf-wrap .lf-svc{padding:12px;border-radius:16px;gap:12px}\n                .lf-wrap .lf-svc-main{gap:12px;padding:2px 0}\n                .lf-wrap .lf-svc-nome{font-size:1rem}\n                .lf-wrap .lf-stepper .lf-q{width:40px;height:40px;font-size:1.3rem}\n                .lf-wrap .lf-stepper input.lf-svc-qtd{width:34px;min-width:34px;font-size:16px}\n\n                \/* tira das linhas de servi\u00e7o o texto que n\u00e3o cabe *\/\n                .lf-wrap .lf-svc-txt{gap:2px}\n\n                \/* faixa dos dias: arrasta na horizontal em vez de rebentar a largura *\/\n                .lf-wrap .lf-week{flex-wrap:nowrap;min-width:0;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x proximity;\n                         -webkit-overflow-scrolling:touch;margin:12px -14px 0;padding:0 14px 6px;gap:8px}\n                .lf-wrap .lf-wday{flex:0 0 76px;min-width:76px;scroll-snap-align:start;padding:8px 6px;border-radius:14px}\n                .lf-wrap .lf-wday b{font-size:.8rem}\n                .lf-wrap .lf-wday i{height:6px;margin-top:6px}\n\n                .lf-wrap .lf-sugestoes{gap:6px}\n                .lf-wrap .lf-sug{padding:10px 14px;font-size:.85rem}\n\n                \/* Barra fixa ao fundo do ecr\u00e3, em duas linhas: resumo em cima, bot\u00f5es por baixo.\n                   Fixed em vez de sticky para n\u00e3o depender da altura do conte\u00fado do passo. *\/\n                .lf-wrap .lf-actions{position:fixed;left:0;right:0;bottom:0;z-index:20;margin:0;\n                            padding:8px 12px;padding-bottom:calc(8px + env(safe-area-inset-bottom));\n                            background:rgba(255,255,255,.97);backdrop-filter:blur(8px);\n                            border-top:1px solid #e5e7eb;box-shadow:0 -6px 20px rgba(15,23,42,.06);\n                            flex-wrap:wrap;gap:6px 10px}\n\n                \/* linha 1: o resumo, na horizontal *\/\n                .lf-wrap .lf-resumo{flex:1 0 100%;flex-direction:row;align-items:baseline;gap:6px;margin-right:0}\n                .lf-wrap .lf-resumo strong{font-size:.95rem}\n                .lf-wrap .lf-resumo span{font-size:.76rem}\n                .lf-wrap .lf-resumo span::before{content:\"\u00b7 \"}\n\n                \/* linha 2: os bot\u00f5es todos juntos, o principal a ocupar o resto.\n                   O grupo leva 100% para nunca ficar dependente da largura do texto do bot\u00e3o. *\/\n                .lf-wrap .lf-actions-btns{flex:1 0 100%;gap:8px}\n                .lf-wrap .lf-actions .lf-btn{padding:11px 14px;font-size:.9rem}\n                .lf-wrap .lf-actions-btns .lf-btn{flex:1 1 auto;justify-content:center}\n                .lf-wrap #lfVoltar{flex:0 0 auto;padding-left:16px;padding-right:16px}\n                .lf-wrap .lf-hint{display:none}\n\n                .lf-wrap .lf-user{position:sticky;top:0;z-index:6;margin:-14px -14px 14px;border-radius:0;border-left:0;border-right:0;border-top:0;\n                         background:rgba(249,250,251,.97);backdrop-filter:blur(8px);padding:10px 14px}\n\n                .lf-wrap .lf-gate{min-height:100vh;min-height:100dvh;padding:0}\n                .lf-wrap .lf-gate-card{max-width:100%;min-height:100vh;min-height:100dvh;border:0;border-radius:0;box-shadow:none;\n                              display:flex;flex-direction:column;justify-content:center;padding:24px 22px}\n                .lf-wrap .lf-keys button{padding:20px 0;font-size:1.5rem}\n                .lf-wrap .lf-toast{position:sticky;top:0;z-index:7}\n            }\n\n            @media (max-width:380px){\n                .lf-wrap .lf-svc{padding:10px}\n                .lf-wrap .lf-stepper .lf-q{width:36px;height:36px}\n                .lf-wrap .lf-actions .lf-btn{padding:10px 12px;font-size:.86rem}\n                .lf-wrap #lfVoltar{padding-left:14px;padding-right:14px}\n            }\n        <\/style>\n\n        <script>\n            (function(){\n                const form   = document.getElementById('londrinaForm');\n                if (!form) return;\n\n                const toast    = document.getElementById('lf-toast');\n                const ajaxUrl  = form.dataset.ajax;\n                let nonce      = form.dataset.agendaNonce;\n\n                \/* Os nonces caducam ao fim de 12\u201324 h e a app pode ficar aberta dias.\n                   V\u00e3o-se buscar novos sem recarregar a p\u00e1gina. *\/\n                let ultimaRenovacao = Date.now();\n\n                async function renovarNonces(){\n                    try {\n                        const res  = await fetch(ajaxUrl + '?action=londrina_nonces&_=' + Date.now(),\n                                                 { credentials:'same-origin', cache:'no-store' });\n                        const json = await res.json();\n                        if (!json || !json.success) return false;\n\n                        nonce = json.data.agenda;\n                        form.dataset.agendaNonce = nonce;\n                        const campo = form.querySelector('[name=\"londrina_form_nonce\"]');\n                        if (campo) campo.value = json.data.form;\n\n                        ultimaRenovacao = Date.now();\n                        return true;\n                    } catch(e) {\n                        return false;\n                    }\n                }\n\n                function pedidoRecusadoPorNonce(json){\n                    return !!(json && json.success === false && json.data && json.data.code === 'nonce');\n                }\n\n                \/\/ Ao voltar \u00e0 app depois de ela estar em segundo plano, renova se j\u00e1 passou mais de 1 hora\n                document.addEventListener('visibilitychange', function(){\n                    if (!document.hidden && Date.now() - ultimaRenovacao > 3600000) renovarNonces();\n                });\n                setInterval(renovarNonces, 3 * 3600000);\n                const capacity = parseInt(form.dataset.capacidade, 10) || 0;\n                const buffer   = parseInt(form.dataset.buffer, 10) || 0;\n\n                const elTotal   = document.getElementById('lfTotal');\n                const elResumo  = document.getElementById('lfResumoSub');\n                const elWork    = document.getElementById('lfDataCostureira');\n                const elClient  = document.getElementById('lfDataCliente');\n                const elCap     = document.getElementById('lfCap');\n                const elDot     = document.getElementById('lfDot');\n                const elTitle   = document.getElementById('lfCapTitle');\n                const elPct     = document.getElementById('lfCapPct');\n                const elBar     = document.getElementById('lfBar');\n                const elSub     = document.getElementById('lfCapSub');\n                const elSug     = document.getElementById('lfSugestoes');\n                const elForceW  = document.getElementById('lfForceWrap');\n                const elForce   = document.getElementById('lfForce');\n                const elWeek    = document.getElementById('lfWeek');\n                const elReprint = document.getElementById('lfReprint');\n\n                \/* entrada de vendedor *\/\n                const usaPin     = form.dataset.pin === '1';\n                const elGate     = document.getElementById('lfGate');\n                const elCard     = document.getElementById('lfCard');\n                const elToken    = document.getElementById('lfToken');\n                const elOrigem   = document.getElementById('lfOrigem');\n                const elUserNome = document.getElementById('lfUserNome');\n                const elPinDots  = document.getElementById('lfPinDots');\n                const elKeys     = document.getElementById('lfKeys');\n                const elKeyBio   = document.getElementById('lfKeyBio');\n                const elGateErro = document.getElementById('lfGateErro');\n                const elGateSub  = document.getElementById('lfGateSub');\n                const elSair     = document.getElementById('lfSair');\n                const elPrintLoc = document.getElementById('lfPrintLocal');\n\n                const CORES = { verde:'#16a34a', amarelo:'#eab308', laranja:'#f97316', vermelho:'#dc2626', fechado:'#9ca3af' };\n                const DIAS  = ['Dom','Seg','Ter','Qua','Qui','Sex','S\u00e1b'];\n\n                let ultimaAgenda = null;\n                let ultimosDocs  = null;\n                let ultimoId     = 0;\n\n                function fmtMin(m){\n                    m = Math.max(0, parseInt(m,10) || 0);\n                    const h = Math.floor(m\/60), r = m%60;\n                    if (h && r) return h + 'h' + String(r).padStart(2,'0');\n                    if (h) return h + 'h';\n                    return r + ' min';\n                }\n\n                \/**\n                 * O aviso pode trazer uma a\u00e7\u00e3o (o WhatsApp, por exemplo). Nesse caso\n                 * fica no ecr\u00e3 at\u00e9 ser fechado \u2014 sen\u00e3o desaparecia antes de se decidir.\n                 *\/\n                function showToast(msg, type, acao){\n                    toast.textContent = '';\n                    toast.className   = 'lf-toast ' + (type || 'success');\n\n                    const texto = document.createElement('span');\n                    texto.className = 'lf-toast-txt';\n                    texto.textContent = msg;\n                    toast.appendChild(texto);\n\n                    if (acao && acao.envio) {\n                        \/\/ Envio pela API: um toque e a mensagem sai do n\u00famero da loja\n                        const btn = document.createElement('button');\n                        btn.type = 'button';\n                        btn.className = 'lf-toast-wa';\n                        const lbl = document.createElement('span');\n                        lbl.className = 'lf-wa-txt';\n                        lbl.textContent = acao.texto || 'Enviar WhatsApp';\n                        btn.appendChild(lbl);\n                        btn.addEventListener('click', function(){ enviarWhatsApp(acao.envio, btn); });\n                        toast.appendChild(btn);\n                    } else if (acao && acao.href) {\n                        const link = document.createElement('a');\n                        link.className = 'lf-toast-wa';\n                        link.href = acao.href;\n                        link.target = '_blank';\n                        link.rel = 'noopener';\n                        link.textContent = acao.texto || 'Abrir';\n                        toast.appendChild(link);\n                    }\n\n                    const fechar = document.createElement('button');\n                    fechar.type = 'button';\n                    fechar.className = 'lf-toast-x';\n                    fechar.setAttribute('aria-label', 'Fechar aviso');\n                    fechar.textContent = '\u00d7';\n                    fechar.addEventListener('click', function(){ toast.hidden = true; });\n                    toast.appendChild(fechar);\n\n                    toast.hidden = false;\n\n                    \/* Com uma a\u00e7\u00e3o por decidir d\u00e1-se mais tempo, mas n\u00e3o fica para sempre:\n                       sen\u00e3o ficava no ecr\u00e3 com dados do cliente anterior. Os erros ficam. *\/\n                    if (type !== 'error') {\n                        const espera = (acao && acao.href) ? 25000 : 6000;\n                        clearTimeout(toast._temporizador);\n                        toast._temporizador = setTimeout(function(){ toast.hidden = true; }, espera);\n                    }\n                }\n\n                \/* Com a API da Meta ligada, os bot\u00f5es de WhatsApp enviam pelo site (do n\u00famero\n                   da loja) em vez de abrirem o WhatsApp do telem\u00f3vel de quem toca. *\/\n                const WA_API = form.dataset.waApi === '1';\n\n                \/* ---------- indicativo do pa\u00eds ---------- *\/\n                const elIndBtn   = document.getElementById('lfIndBtn');\n                const elIndTxt   = document.getElementById('lfIndTxt');\n                const elIndValor = document.getElementById('lfIndValor');\n                const elIndLista = document.getElementById('lfIndLista');\n                const elIndBusca = document.getElementById('lfIndBusca');\n\n                function abrirIndicativos(abrir){\n                    if (!elIndLista) return;\n                    elIndLista.hidden = !abrir;\n                    elIndBtn.setAttribute('aria-expanded', abrir ? 'true' : 'false');\n                    if (abrir) {\n                        elIndBusca.value = '';\n                        filtrarIndicativos();\n                        \/\/ No telem\u00f3vel o teclado tapava a lista: s\u00f3 foca em ecr\u00e3s grandes\n                        if (window.innerWidth > 720) elIndBusca.focus();\n                        const escolhido = elIndLista.querySelector('.lf-ind-op.escolhido');\n                        if (escolhido) escolhido.scrollIntoView({ block:'nearest' });\n                    }\n                }\n\n                function filtrarIndicativos(){\n                    const q = (elIndBusca.value || '').trim().toLowerCase();\n                    elIndLista.querySelectorAll('.lf-ind-op').forEach(function(op){\n                        const texto = op.textContent.toLowerCase();\n                        op.hidden = q !== '' && texto.indexOf(q) === -1;\n                    });\n                }\n\n                function escolherIndicativo(cod){\n                    if (!elIndValor) return;\n                    elIndValor.value = cod;\n                    elIndTxt.textContent = '+' + cod;\n                    elIndLista.querySelectorAll('.lf-ind-op').forEach(function(op){\n                        op.classList.toggle('escolhido', op.dataset.cod === cod);\n                    });\n                }\n\n                if (elIndBtn) {\n                    escolherIndicativo(elIndValor.value);\n\n                    elIndBtn.addEventListener('click', function(){ abrirIndicativos(elIndLista.hidden); });\n                    elIndBusca.addEventListener('input', filtrarIndicativos);\n\n                    elIndLista.addEventListener('click', function(e){\n                        const op = e.target.closest('.lf-ind-op');\n                        if (!op) return;\n                        escolherIndicativo(op.dataset.cod);\n                        abrirIndicativos(false);\n                        const tel = form.querySelector('[name=\"telefone\"]');\n                        if (tel) tel.focus();\n                    });\n\n                    document.addEventListener('click', function(e){\n                        if (!elIndLista.hidden && !e.target.closest('.lf-ind')) abrirIndicativos(false);\n                    });\n\n                    document.addEventListener('keydown', function(e){\n                        if (e.key === 'Escape' && !elIndLista.hidden) abrirIndicativos(false);\n                    });\n                }\n\n                \/* Ao corrigir um tal\u00e3o, separa outra vez o indicativo do n\u00famero.\n                   Os tal\u00f5es antigos s\u00f3 t\u00eam o telefone todo numa linha. *\/\n                function preencherTelefone(dados){\n                    const elInd = form.querySelector('[name=\"telefone_ind\"]');\n                    const elTel = form.querySelector('[name=\"telefone\"]');\n                    if (!elTel) return;\n\n                    let codigo = String(dados.telefone_ind || '');\n                    let numero = String(dados.telefone_numero || dados.telefone || '');\n\n                    const m = numero.match(\/^\\+\\s*(\\d{1,4})[\\s-]+(.+)$\/);\n                    if (m) {\n                        if (!codigo) codigo = m[1];\n                        numero = m[2];\n                    }\n\n                    if (codigo && elIndLista && elIndLista.querySelector('.lf-ind-op[data-cod=\"' + codigo + '\"]')) {\n                        escolherIndicativo(codigo);\n                    } else if (elInd && codigo) {\n                        elInd.value = codigo;\n                    }\n\n                    elTel.value = numero.trim();\n                }\n\n                function acaoWhatsApp(url, texto, envio){\n                    if (!url) return null;\n                    return { href: url, texto: texto || 'Avisar por WhatsApp', envio: (WA_API && envio) ? envio : null };\n                }\n\n                async function enviarWhatsApp(envio, el){\n                    if (el.disabled) return;\n                    const lbl = el.querySelector('.lf-wa-txt') || el;\n                    const original = lbl.textContent;\n\n                    el.disabled = true;\n                    lbl.textContent = 'A enviar...';\n\n                    async function pedir(){\n                        const corpo = new URLSearchParams();\n                        corpo.set('action', 'londrina_wa_enviar');\n                        corpo.set('nonce', nonce);\n                        corpo.set('token', guardar.ler('lf_token') || '');\n                        corpo.set('id', envio.id);\n                        corpo.set('tipo', envio.tipo);\n                        const res = await fetch(ajaxUrl, { method:'POST', credentials:'same-origin', body: corpo });\n                        return res.json();\n                    }\n\n                    try {\n                        let json = await pedir();\n                        if (pedidoRecusadoPorNonce(json) && await renovarNonces()) json = await pedir();\n\n                        if (json && json.success) {\n                            lbl.textContent = 'WhatsApp enviado \u2713';\n                            el.classList.add('enviado');\n                            showToast(json.data && json.data.message ? json.data.message : 'WhatsApp enviado.', 'success');\n                            return;\n                        }\n                        showToast((json && json.data && json.data.message) ? json.data.message : 'O WhatsApp n\u00e3o foi enviado.', 'error');\n                    } catch(e) {\n                        showToast('Sem liga\u00e7\u00e3o \u00e0 internet. O WhatsApp n\u00e3o foi enviado.', 'error');\n                    }\n\n                    el.disabled = false;\n                    lbl.textContent = original;\n                }\n\n                \/* ---------- pe\u00e7as e servi\u00e7os ---------- *\/\n                const CAT_SVC = JSON.parse(form.dataset.servicos || '[]');\n                const CAT_ART = JSON.parse(form.dataset.artigos  || '[]');\n                const elPecas = document.getElementById('lfPecas');\n                const elVazio = document.getElementById('lfPecasVazio');\n\n                const svcPorChave = {};\n                CAT_SVC.forEach(function(s){ svcPorChave[s.key] = s; });\n\n                let proximaPeca = 0;\n\n                function artigoPorChave(k){\n                    for (const a of CAT_ART) if (a.key === k) return a;\n                    return null;\n                }\n\n                function linhaServico(idxPeca, svc){\n                    const div = document.createElement('div');\n                    div.className = 'lf-svc';\n                    div.dataset.min = svc.min;\n                    div.innerHTML =\n                        '<label class=\"lf-svc-main\">' +\n                            '<input type=\"checkbox\" class=\"lf-svc-check\" name=\"pecas[' + idxPeca + '][servicos][]\" value=\"' + svc.key + '\">' +\n                            '<span class=\"lf-svc-box\" aria-hidden=\"true\"><\/span>' +\n                            '<span class=\"lf-svc-txt\">' +\n                                '<span class=\"lf-svc-nome\"><\/span>' +\n                                '<span class=\"lf-svc-min\">' + svc.min + ' min<\/span>' +\n                            '<\/span>' +\n                        '<\/label>' +\n                        '<div class=\"lf-stepper\" hidden>' +\n                            '<button type=\"button\" class=\"lf-q\" data-step=\"-1\" aria-label=\"Menos um\">&minus;<\/button>' +\n                            '<input type=\"number\" class=\"lf-svc-qtd\" name=\"pecas[' + idxPeca + '][qtd][' + svc.key + ']\" value=\"1\" min=\"1\" max=\"20\" readonly aria-label=\"Quantidade\">' +\n                            '<button type=\"button\" class=\"lf-q\" data-step=\"1\" aria-label=\"Mais um\">+<\/button>' +\n                        '<\/div>';\n                    div.querySelector('.lf-svc-nome').textContent = svc.nome;\n                    return div;\n                }\n\n                function adicionarPeca(chaveArtigo){\n                    const artigo = artigoPorChave(chaveArtigo);\n                    if (!artigo) return;\n\n                    const idx = proximaPeca++;\n                    const caixa = document.createElement('div');\n                    caixa.className = 'lf-peca';\n                    caixa.dataset.idx = idx;\n\n                    caixa.innerHTML =\n                        '<div class=\"lf-peca-head\">' +\n                            '<span class=\"lf-peca-nome\"><\/span>' +\n                            '<span class=\"lf-peca-min\">0 min<\/span>' +\n                            '<button type=\"button\" class=\"lf-peca-del\" aria-label=\"Remover pe\u00e7a\">&times;<\/button>' +\n                        '<\/div>' +\n                        '<input type=\"hidden\" name=\"pecas[' + idx + '][artigo]\" value=\"' + artigo.key + '\">' +\n                        '<div class=\"lf-peca-svcs\"><\/div>' +\n                        '<button type=\"button\" class=\"lf-mais\">Mostrar todos os servi\u00e7os<\/button>';\n\n                    caixa.querySelector('.lf-peca-nome').textContent = artigo.nome;\n\n                    const lista = caixa.querySelector('.lf-peca-svcs');\n                    const sugeridos = (artigo.servicos || []).filter(function(k){ return svcPorChave[k]; });\n\n                    sugeridos.forEach(function(k){ lista.appendChild(linhaServico(idx, svcPorChave[k])); });\n\n                    CAT_SVC.forEach(function(svc){\n                        if (sugeridos.indexOf(svc.key) !== -1) return;\n                        const linha = linhaServico(idx, svc);\n                        linha.classList.add('lf-svc-extra');\n                        linha.hidden = sugeridos.length > 0;\n                        lista.appendChild(linha);\n                    });\n\n                    if (sugeridos.length === 0) caixa.querySelector('.lf-mais').hidden = true;\n\n                    elPecas.appendChild(caixa);\n                    if (elVazio) elVazio.hidden = true;\n\n                    caixa.scrollIntoView({block:'nearest', behavior:'smooth'});\n                    totalMinutos();\n                }\n\n                function minutosDaPeca(caixa){\n                    let total = 0;\n                    caixa.querySelectorAll('.lf-svc').forEach(function(box){\n                        const chk = box.querySelector('.lf-svc-check');\n                        const qtd = box.querySelector('.lf-svc-qtd');\n                        const stp = box.querySelector('.lf-stepper');\n\n                        box.classList.toggle('is-on', chk.checked);\n                        if (stp) stp.hidden = !chk.checked;\n\n                        if (chk.checked) {\n                            const n = Math.max(1, Math.min(20, parseInt(qtd.value,10) || 1));\n                            qtd.value = n;\n                            total += (parseInt(box.dataset.min,10)||0) * n;\n                        }\n                    });\n                    return total;\n                }\n\n                function totalMinutos(){\n                    let total = 0;\n                    let comServico = 0;\n                    const caixas = form.querySelectorAll('.lf-peca');\n\n                    caixas.forEach(function(caixa){\n                        const m = minutosDaPeca(caixa);\n                        caixa.querySelector('.lf-peca-min').textContent = fmtMin(m);\n                        caixa.classList.toggle('sem-servico', m === 0);\n                        if (m > 0) comServico++;\n                        total += m;\n                    });\n\n                    if (elVazio) elVazio.hidden = caixas.length > 0;\n\n                    elTotal.textContent = fmtMin(total);\n                    if (elResumo) {\n                        elResumo.textContent = caixas.length === 0 ? 'Sem pe\u00e7as'\n                            : (caixas.length === 1 ? '1 pe\u00e7a' : caixas.length + ' pe\u00e7as')\n                              + (comServico < caixas.length ? ' \u00b7 falta escolher servi\u00e7os' : '');\n                    }\n\n                    if (typeof ajustarEspacoBarra === 'function') ajustarEspacoBarra();\n                    return total;\n                }\n\n                if (document.getElementById('lfArtigos')) {\n                    document.getElementById('lfArtigos').addEventListener('click', function(e){\n                        const btn = e.target.closest('.lf-artigo');\n                        if (!btn) return;\n                        adicionarPeca(btn.dataset.artigo);\n                    });\n                }\n\n                form.addEventListener('click', function(e){\n                    \/* remover pe\u00e7a *\/\n                    const del = e.target.closest('.lf-peca-del');\n                    if (del) {\n                        e.preventDefault();\n                        del.closest('.lf-peca').remove();\n                        totalMinutos();\n                        carregarAgenda();\n                        return;\n                    }\n\n                    \/* mostrar os servi\u00e7os que n\u00e3o s\u00e3o t\u00edpicos daquele artigo *\/\n                    const mais = e.target.closest('.lf-mais');\n                    if (mais) {\n                        e.preventDefault();\n                        const caixa = mais.closest('.lf-peca');\n                        const escondidos = caixa.querySelectorAll('.lf-svc-extra');\n                        const abrir = escondidos.length && escondidos[0].hidden;\n                        escondidos.forEach(function(l){ l.hidden = !abrir; });\n                        mais.textContent = abrir ? 'Mostrar s\u00f3 os habituais' : 'Mostrar todos os servi\u00e7os';\n                        return;\n                    }\n\n                    \/* bot\u00f5es \u2212 e + *\/\n                    const btn = e.target.closest('.lf-q');\n                    if (!btn) return;\n                    e.preventDefault();\n\n                    const box   = btn.closest('.lf-svc');\n                    const qtd   = box.querySelector('.lf-svc-qtd');\n                    const passo = parseInt(btn.dataset.step, 10) || 0;\n                    const atual = parseInt(qtd.value, 10) || 1;\n                    const novo  = Math.max(1, Math.min(20, atual + passo));\n\n                    if (novo === atual) return;\n                    qtd.value = novo;\n                    totalMinutos();\n                    carregarAgenda();\n                });\n\n                \/* ---------- agenda \/ sem\u00e1foro ---------- *\/\n                async function carregarAgenda(){\n                    const dia = elWork.value;\n                    if (!dia) { elCap.hidden = true; elWeek.innerHTML = ''; return; }\n\n                    const need = totalMinutos();\n                    const sessao = (form.querySelector('[name=\"lf_token\"]') || {}).value || '';\n                    const url  = ajaxUrl + '?action=londrina_agenda&nonce=' + encodeURIComponent(nonce) +\n                                 '&token=' + encodeURIComponent(sessao) +\n                                 '&from=' + encodeURIComponent(dia) + '&days=14&need=' + need;\n\n                    try{\n                        const res  = await fetch(url, { credentials:'same-origin' });\n                        const json = await res.json();\n                        if (!json || !json.success) return;\n                        ultimaAgenda = json.data;\n                        pintar(need);\n                    }catch(e){ \/* silencioso: o servidor volta a validar *\/ }\n                }\n\n                function pintar(need){\n                    if (!ultimaAgenda) return;\n                    const dia = elWork.value;\n                    const st  = ultimaAgenda.dias[dia];\n                    if (!st) return;\n\n                    const cap     = st.capacity || capacity;\n                    const usadoJa = st.used;\n                    const futuro  = usadoJa + need;\n                    const pct     = cap > 0 ? Math.round((futuro \/ cap) * 100) : 100;\n\n                    let nivel = 'verde';\n                    if (!st.open) nivel = 'fechado';\n                    else if (pct >= 100) nivel = 'vermelho';\n                    else if (pct >= ultimaAgenda.limiares.laranja) nivel = 'laranja';\n                    else if (pct >= ultimaAgenda.limiares.amarelo) nivel = 'amarelo';\n\n                    const rotulos = { verde:'Dispon\u00edvel', amarelo:'Com trabalho', laranja:'Quase cheio', vermelho:'Sem capacidade', fechado:'Dia encerrado' };\n\n                    elCap.hidden = false;\n                    elDot.style.background = CORES[nivel];\n                    elTitle.textContent = rotulos[nivel];\n                    elPct.textContent   = st.open ? (pct + '% ocupado') : '';\n                    elBar.style.width      = Math.min(100, pct) + '%';\n                    elBar.style.background = CORES[nivel];\n\n                    if (!st.open) {\n                        elSub.textContent = 'As costureiras n\u00e3o trabalham neste dia.';\n                    } else {\n                        elSub.textContent = 'J\u00e1 agendado: ' + fmtMin(usadoJa) + ' (' + st.jobs + ' servi\u00e7os) \u00b7 '\n                                          + 'Este servi\u00e7o: ' + fmtMin(need) + ' \u00b7 '\n                                          + 'Livre depois: ' + fmtMin(Math.max(0, cap - futuro))\n                                          + ' de ' + fmtMin(cap) + ' (' + ultimaAgenda.costureiras + ' costureiras, ' + ultimaAgenda.horario + ')';\n                    }\n\n                    const semEspaco = !st.open || futuro > cap;\n                    elForceW.hidden = !semEspaco;\n                    if (!semEspaco && elForce) elForce.checked = false;\n\n                    elSug.innerHTML = '';\n                    if (semEspaco && ultimaAgenda.sugestoes && ultimaAgenda.sugestoes.length) {\n                        const t = document.createElement('span');\n                        t.className = 'lf-cap-sub';\n                        t.textContent = 'Dias com espa\u00e7o:';\n                        elSug.appendChild(t);\n                        ultimaAgenda.sugestoes.forEach(function(sug){\n                            const b = document.createElement('button');\n                            b.type = 'button';\n                            b.className = 'lf-sug';\n                            b.textContent = dataCurta(sug.date) + ' \u00b7 livre ' + fmtMin(sug.free);\n                            b.addEventListener('click', function(){\n                                elWork.value = sug.date;\n                                sincronizarCliente();\n                                carregarAgenda();\n                            });\n                            elSug.appendChild(b);\n                        });\n                    }\n\n                    pintarSemana(need);\n                }\n\n                function dataCurta(iso){\n                    const d = new Date(iso + 'T12:00:00');\n                    return DIAS[d.getDay()] + ' ' + String(d.getDate()).padStart(2,'0') + '\/' + String(d.getMonth()+1).padStart(2,'0');\n                }\n\n                function pintarSemana(need){\n                    if (!ultimaAgenda) return;\n                    elWeek.innerHTML = '';\n                    const datas = Object.keys(ultimaAgenda.dias).sort().slice(0, 10);\n\n                    datas.forEach(function(iso){\n                        const st  = ultimaAgenda.dias[iso];\n                        const cap = st.capacity || capacity;\n                        const pct = cap > 0 ? Math.round(((st.used + (iso === elWork.value ? need : 0)) \/ cap) * 100) : 100;\n\n                        let nivel = 'verde';\n                        if (!st.open) nivel = 'fechado';\n                        else if (pct >= 100) nivel = 'vermelho';\n                        else if (pct >= ultimaAgenda.limiares.laranja) nivel = 'laranja';\n                        else if (pct >= ultimaAgenda.limiares.amarelo) nivel = 'amarelo';\n\n                        const el = document.createElement('button');\n                        el.type = 'button';\n                        el.className = 'lf-wday' + (iso === elWork.value ? ' is-sel' : '');\n                        el.innerHTML = '<b>' + dataCurta(iso) + '<\/b><span>' + (st.open ? pct + '%' : '\u2014') + '<\/span><i style=\"background:' + CORES[nivel] + '\"><\/i>';\n                        el.addEventListener('click', function(){\n                            elWork.value = iso;\n                            sincronizarCliente();\n                            carregarAgenda();\n                        });\n                        elWeek.appendChild(el);\n                    });\n                }\n\n                \/**\n                 * Sempre que muda a data das costureiras, a data do cliente passa a ser\n                 * essa mais o intervalo definido nas Defini\u00e7\u00f5es. Continua a poder mudar-se\n                 * \u00e0 m\u00e3o a seguir \u2014 s\u00f3 volta a ser recalculada se a data de execu\u00e7\u00e3o mudar.\n                 *\/\n                function sincronizarCliente(){\n                    if (!elWork.value) return;\n                    elClient.min = elWork.value;\n\n                    const d = new Date(elWork.value + 'T12:00:00');\n                    d.setDate(d.getDate() + buffer);\n                    elClient.value = new Date(d.getTime() - d.getTimezoneOffset() * 60000).toISOString().slice(0,10);\n                }\n\n                \/* ---------- entrada do vendedor (c\u00f3digo de 4 d\u00edgitos + biometria) ---------- *\/\n                const guardar = {\n                    ler: function(k){ try { return localStorage.getItem(k); } catch(e){ return null; } },\n                    por: function(k,v){ try { localStorage.setItem(k,v); } catch(e){} },\n                    tira: function(k){ try { localStorage.removeItem(k); } catch(e){} }\n                };\n\n                const naApp = window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true;\n                if (elOrigem) elOrigem.value = naApp ? 'app' : 'web';\n\n                const eTelemovel = window.matchMedia('(pointer: coarse)').matches || naApp;\n                if (elPrintLoc) {\n                    const guardado = guardar.ler('lf_print_local');\n                    elPrintLoc.checked = guardado === null ? !eTelemovel : guardado === '1';\n                    elPrintLoc.addEventListener('change', function(){\n                        guardar.por('lf_print_local', elPrintLoc.checked ? '1' : '0');\n                    });\n                }\n\n                function imprimirAqui(){ return elPrintLoc ? elPrintLoc.checked : true; }\n\n                \/* base64url <-> bytes, para a biometria *\/\n                function paraB64(buf){\n                    return btoa(String.fromCharCode.apply(null, new Uint8Array(buf)))\n                        .replace(\/\\+\/g,'-').replace(\/\\\/\/g,'_').replace(\/=+$\/,'');\n                }\n                function deB64(txt){\n                    const b = atob(txt.replace(\/-\/g,'+').replace(\/_\/g,'\/'));\n                    const a = new Uint8Array(b.length);\n                    for (let i=0;i<b.length;i++) a[i] = b.charCodeAt(i);\n                    return a;\n                }\n                function desafio(){ return crypto.getRandomValues(new Uint8Array(32)); }\n                function temWebAuthn(){ return !!(window.PublicKeyCredential && navigator.credentials); }\n\n                async function bioRegistar(nome){\n                    if (!temWebAuthn()) return false;\n                    try {\n                        const cred = await navigator.credentials.create({ publicKey: {\n                            challenge: desafio(),\n                            rp: { name: 'Costura', id: location.hostname },\n                            user: { id: new TextEncoder().encode('lf-' + nome), name: nome, displayName: nome },\n                            pubKeyCredParams: [{type:'public-key',alg:-7},{type:'public-key',alg:-257}],\n                            authenticatorSelection: { authenticatorAttachment:'platform', userVerification:'required' },\n                            timeout: 60000,\n                            attestation: 'none'\n                        }});\n                        if (!cred) return false;\n                        guardar.por('lf_bio', paraB64(cred.rawId));\n                        return true;\n                    } catch(e){ return false; }\n                }\n\n                async function bioEntrar(){\n                    const id = guardar.ler('lf_bio');\n                    if (!id || !temWebAuthn()) return false;\n                    try {\n                        const r = await navigator.credentials.get({ publicKey: {\n                            challenge: desafio(),\n                            allowCredentials: [{ type:'public-key', id: deB64(id) }],\n                            userVerification: 'required',\n                            timeout: 60000\n                        }});\n                        return !!r;\n                    } catch(e){ return false; }\n                }\n\n                function mostrarErroGate(msg){\n                    if (!elGateErro) return;\n                    elGateErro.textContent = msg;\n                    elGateErro.hidden = false;\n                    elPinDots.classList.add('erro');\n                    setTimeout(function(){ elPinDots.classList.remove('erro'); }, 900);\n                }\n\n                \/* ---------- ecr\u00e3 das costureiras ---------- *\/\n                const elCostura  = document.getElementById('lfCostura');\n                const elCostNome = document.getElementById('lfCostNome');\n                const elCostData = document.getElementById('lfCostData');\n                const elCostCont = document.getElementById('lfCostContagem');\n                const elCostLista= document.getElementById('lfCostLista');\n\n                let diaCostura = null;\n                let funcaoAtual = 'vendedor';\n\n                function isoHoje(){\n                    const d = new Date();\n                    return new Date(d.getTime() - d.getTimezoneOffset() * 60000).toISOString().slice(0,10);\n                }\n\n                function dataLonga(iso){\n                    const dias  = ['Domingo','Segunda-feira','Ter\u00e7a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S\u00e1bado'];\n                    const d = new Date(iso + 'T12:00:00');\n                    return dias[d.getDay()] + ', ' + String(d.getDate()).padStart(2,'0') + '\/' + String(d.getMonth()+1).padStart(2,'0');\n                }\n\n                function cartaoTrabalho(t, atrasado){\n                    const div = document.createElement('div');\n                    div.className = 'lf-trab' + (t.pronto ? ' feito' : (atrasado ? ' atraso' : ''));\n                    div.dataset.id = t.id;\n\n                    const topo = document.createElement('div');\n                    topo.className = 'lf-trab-topo';\n                    const num = document.createElement('span'); num.className = 'lf-trab-num'; num.textContent = '#' + t.n_talao;\n                    const cli = document.createElement('span'); cli.className = 'lf-trab-cliente'; cli.textContent = t.cliente;\n                    const min = document.createElement('span'); min.className = 'lf-trab-min'; min.textContent = t.minutos;\n                    topo.appendChild(num); topo.appendChild(cli); topo.appendChild(min);\n                    div.appendChild(topo);\n\n                    t.pecas.forEach(function(p){\n                        const bloco = document.createElement('div');\n                        bloco.className = 'lf-trab-peca';\n                        const b = document.createElement('b'); b.textContent = p.nome;\n                        const s = document.createElement('span'); s.textContent = p.servicos.join(', ');\n                        bloco.appendChild(b); bloco.appendChild(s);\n                        div.appendChild(bloco);\n                    });\n\n                    if (t.observacoes) {\n                        const obs = document.createElement('div');\n                        obs.className = 'lf-trab-obs';\n                        obs.textContent = t.observacoes;\n                        div.appendChild(obs);\n                    }\n\n                    const rodape = document.createElement('div');\n                    rodape.className = 'lf-trab-rodape';\n\n                    const entrega = document.createElement('span');\n                    entrega.className = 'lf-trab-entrega';\n                    entrega.textContent = (atrasado ? 'Era para ' + t.execucao + ' \u00b7 ' : '') + 'Cliente levanta ' + t.entrega;\n                    rodape.appendChild(entrega);\n\n                    if (t.pronto) {\n                        const estado = document.createElement('span');\n                        estado.className = 'lf-trab-estado';\n                        estado.textContent = (t.avisado ? 'Cliente avisado ' + t.avisado_em : 'Pronto \u00b7 avisar por telefone')\n                                           + textoWhatsApp(t.wa_estado);\n                        if (t.wa_erro) estado.title = t.wa_erro;\n                        rodape.appendChild(estado);\n\n                        if (t.whatsapp) rodape.appendChild(botaoWhatsApp(t.whatsapp, null, { id: t.id, tipo: 'pronto' }));\n                        if (!t.avisado && t.telefone) rodape.appendChild(botaoTelefone(t.telefone));\n                    } else {\n                        const btn = document.createElement('button');\n                        btn.type = 'button';\n                        btn.className = 'lf-trab-btn';\n                        btn.textContent = (t.tem_email || t.wa_auto) ? 'Pronto \u2014 avisar cliente' : 'Marcar como pronto';\n                        btn.addEventListener('click', function(){ fecharServico(t, div, btn); });\n                        rodape.appendChild(btn);\n                    }\n\n                    div.appendChild(rodape);\n                    return div;\n                }\n\n                \/* Estado da mensagem autom\u00e1tica, tal como a Meta o vai devolvendo *\/\n                function textoWhatsApp(estado){\n                    const nomes = { enviado:'enviado', entregue:'entregue', lido:'lido', falhou:'n\u00e3o chegou' };\n                    return estado && nomes[estado] ? ' \u00b7 WhatsApp ' + nomes[estado] : '';\n                }\n\n                function botaoTelefone(numero){\n                    const tel = document.createElement('a');\n                    tel.className = 'lf-trab-tel';\n                    tel.href = 'tel:' + numero.replace(\/\\s+\/g, '');\n                    tel.textContent = 'Ligar ' + numero;\n                    return tel;\n                }\n\n                function botaoWhatsApp(url, texto, envio){\n                    if (WA_API && envio) {\n                        const b = document.createElement('button');\n                        b.type = 'button';\n                        b.className = 'lf-wa';\n                        b.innerHTML = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20 12a8 8 0 0 1-11.9 7L4 20l1-4a8 8 0 1 1 15-4z\"\/><\/svg>';\n                        const lbl = document.createElement('span');\n                        lbl.className = 'lf-wa-txt';\n                        lbl.textContent = texto || (envio.tipo === 'pronto' ? 'Avisar por WhatsApp' : 'Enviar WhatsApp');\n                        b.appendChild(lbl);\n                        b.addEventListener('click', function(){ enviarWhatsApp(envio, b); });\n                        return b;\n                    }\n\n                    const wa = document.createElement('a');\n                    wa.className = 'lf-wa';\n                    wa.href = url;\n                    wa.target = '_blank';\n                    wa.rel = 'noopener';\n                    wa.innerHTML = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20 12a8 8 0 0 1-11.9 7L4 20l1-4a8 8 0 1 1 15-4z\"\/><\/svg>';\n                    wa.appendChild(document.createTextNode(texto || 'WhatsApp'));\n                    return wa;\n                }\n\n                async function fecharServico(t, cartao, btn){\n                    btn.disabled = true;\n                    btn.textContent = 'A avisar...';\n\n                    try {\n                        const corpo = new URLSearchParams();\n                        corpo.set('action', 'londrina_pronto');\n                        corpo.set('nonce', nonce);\n                        corpo.set('token', guardar.ler('lf_token') || '');\n                        corpo.set('id', t.id);\n\n                        const res  = await fetch(ajaxUrl, { method:'POST', credentials:'same-origin', body: corpo });\n                        const json = await res.json();\n\n                        if (json && json.success) {\n                            const d = json.data;\n                            \/\/ Sem email, o aviso fica no ecr\u00e3 com o WhatsApp \u00e0 m\u00e3o\n                            showToast(d.message,\n                                      d.estado === 'avisado' ? 'success' : 'error',\n                                      d.estado === 'avisado' ? null : acaoWhatsApp(d.whatsapp, null, { id: d.id, tipo: 'pronto' }));\n\n                            cartao.classList.add('feito');\n                            cartao.classList.remove('atraso');\n\n                            btn.remove();\n                            const estado = document.createElement('span');\n                            estado.className = 'lf-trab-estado';\n                            estado.textContent = d.estado === 'avisado'\n                                ? 'Cliente avisado agora' + (d.canais && d.canais.length ? ' por ' + d.canais.join(' e ') : '')\n                                : 'Pronto \u00b7 avisar por telefone';\n                            const rodapeCartao = cartao.querySelector('.lf-trab-rodape');\n                            rodapeCartao.appendChild(estado);\n\n                            if (d.whatsapp) rodapeCartao.appendChild(botaoWhatsApp(d.whatsapp, null, { id: d.id, tipo: 'pronto' }));\n                            if (d.estado !== 'avisado' && d.telefone) {\n                                rodapeCartao.appendChild(botaoTelefone(d.telefone));\n                            }\n                        } else {\n                            btn.disabled = false;\n                            btn.textContent = 'Pronto \u2014 avisar cliente';\n                            showToast((json && json.data && json.data.message) ? json.data.message : 'N\u00e3o foi poss\u00edvel fechar o servi\u00e7o.', 'error');\n                        }\n                    } catch(e) {\n                        btn.disabled = false;\n                        btn.textContent = 'Pronto \u2014 avisar cliente';\n                        showToast('Sem liga\u00e7\u00e3o. Tenta outra vez.', 'error');\n                    }\n                }\n\n                async function carregarTrabalhos(){\n                    if (!elCostLista) return;\n                    if (!diaCostura) diaCostura = isoHoje();\n\n                    elCostData.textContent = buscaTalao ? 'Tal\u00e3o ' + buscaTalao : dataLonga(diaCostura);\n                    elCostLista.innerHTML = '<p class=\"lf-cost-vazio\">A carregar...<\/p>';\n\n                    try {\n                        const url = ajaxUrl + '?action=londrina_trabalhos&nonce=' + encodeURIComponent(nonce)\n                                  + '&token=' + encodeURIComponent(guardar.ler('lf_token') || '')\n                                  + (buscaTalao ? '&talao=' + encodeURIComponent(buscaTalao)\n                                                : '&dia=' + encodeURIComponent(diaCostura));\n\n                        const res  = await fetch(url, { credentials:'same-origin' });\n                        const json = await res.json();\n\n                        if (!json || !json.success) {\n                            elCostLista.innerHTML = '<p class=\"lf-cost-vazio\">N\u00e3o foi poss\u00edvel carregar os trabalhos.<\/p>';\n                            return;\n                        }\n\n                        const dados = json.data;\n\n                        \/\/ Resultado da pesquisa por tal\u00e3o: qualquer dia, sem o grupo \"em atraso\"\n                        if (dados.busca) {\n                            elCostCont.textContent = dados.trabalhos.length\n                                ? dados.trabalhos.length + (dados.trabalhos.length === 1 ? ' tal\u00e3o encontrado' : ' tal\u00f5es encontrados')\n                                : 'nenhum tal\u00e3o encontrado';\n                            elCostLista.innerHTML = '';\n                            if (!dados.trabalhos.length) {\n                                elCostLista.innerHTML = '<p class=\"lf-cost-vazio\">N\u00e3o h\u00e1 nenhum tal\u00e3o com esse n\u00famero.<\/p>';\n                            }\n                            dados.trabalhos.forEach(function(t){ elCostLista.appendChild(cartaoTrabalho(t, false)); });\n                            return;\n                        }\n\n                        const porFazer = dados.trabalhos.filter(function(t){ return !t.pronto; }).length;\n                        elCostCont.textContent = dados.trabalhos.length\n                            ? porFazer + ' por fechar de ' + dados.trabalhos.length\n                            : 'sem trabalhos marcados';\n\n                        elCostLista.innerHTML = '';\n\n                        if (dados.atrasados.length) {\n                            const t1 = document.createElement('div');\n                            t1.className = 'lf-cost-grupo';\n                            t1.textContent = 'Em atraso (' + dados.atrasados.length + ')';\n                            elCostLista.appendChild(t1);\n                            dados.atrasados.forEach(function(t){ elCostLista.appendChild(cartaoTrabalho(t, true)); });\n                        }\n\n                        if (dados.trabalhos.length) {\n                            const t2 = document.createElement('div');\n                            t2.className = 'lf-cost-grupo';\n                            t2.textContent = 'Deste dia';\n                            elCostLista.appendChild(t2);\n                            dados.trabalhos.forEach(function(t){ elCostLista.appendChild(cartaoTrabalho(t, false)); });\n                        } else if (!dados.atrasados.length) {\n                            elCostLista.innerHTML = '<p class=\"lf-cost-vazio\">N\u00e3o h\u00e1 nada marcado para este dia.<\/p>';\n                        }\n                    } catch(e) {\n                        elCostLista.innerHTML = '<p class=\"lf-cost-vazio\">Sem liga\u00e7\u00e3o. Puxa para recarregar.<\/p>';\n                    }\n                }\n\n                \/* Pesquisa pelo n\u00ba do tal\u00e3o (\u00fatil quando a pe\u00e7a chega \u00e0s m\u00e3os sem se saber o dia) *\/\n                let buscaTalao = '';\n                const elCostTalao = document.getElementById('lfCostTalao');\n\n                function limparBusca(){\n                    buscaTalao = '';\n                    if (elCostTalao) elCostTalao.value = '';\n                }\n\n                function procurarTalao(){\n                    buscaTalao = (elCostTalao.value || '').replace(\/\\D+\/g, '');\n                    carregarTrabalhos();\n                }\n\n                if (elCostTalao) {\n                    elCostTalao.addEventListener('keydown', function(e){\n                        if (e.key === 'Enter') { e.preventDefault(); procurarTalao(); }\n                    });\n                    \/\/ Apagar o texto (ou o \"x\" do campo) volta \u00e0 lista do dia\n                    elCostTalao.addEventListener('search', function(){ if (!elCostTalao.value) procurarTalao(); });\n                    document.getElementById('lfCostProcurar').addEventListener('click', procurarTalao);\n                }\n\n                function mudarDia(dias){\n                    limparBusca();\n                    const d = new Date((diaCostura || isoHoje()) + 'T12:00:00');\n                    d.setDate(d.getDate() + dias);\n                    diaCostura = new Date(d.getTime() - d.getTimezoneOffset() * 60000).toISOString().slice(0,10);\n                    carregarTrabalhos();\n                }\n\n                if (elCostura) {\n                    document.getElementById('lfDiaAnt').addEventListener('click', function(){ mudarDia(-1); });\n                    document.getElementById('lfDiaSeg').addEventListener('click', function(){ mudarDia(1); });\n                    document.getElementById('lfDiaHoje').addEventListener('click', function(){ limparBusca(); diaCostura = isoHoje(); carregarTrabalhos(); });\n                }\n\n                \/* ---------- menu do vendedor e agendamentos ---------- *\/\n                const elMenu      = document.getElementById('lfDrawer');\n                const elDrawNome  = document.getElementById('lfDrawerNome');\n                const elDrawIni   = document.getElementById('lfDrawerInicial');\n                const elDrawFunc  = document.getElementById('lfDrawerFuncao');\n                const elDrawTrab  = document.getElementById('lfDrawerTrabalhos');\n                const elAgCard    = document.getElementById('lfAgendaCard');\n                const elAgLista   = document.getElementById('lfAgendaLista');\n                const elAgVoltar  = document.getElementById('lfAgendaVoltar');\n                const elBusca     = document.getElementById('lfBusca');\n                const elEditarId  = document.getElementById('lfEditarId');\n\n                let buscaTimer = null;\n\n                function abrirMenu(abrir){\n                    if (!elMenu) return;\n\n                    if (abrir) {\n                        elMenu.hidden = false;\n                        \/\/ deixa o browser pintar antes de animar, sen\u00e3o a gaveta aparece j\u00e1 aberta\n                        requestAnimationFrame(function(){ elMenu.classList.add('aberto'); });\n                        document.body.style.overflow = 'hidden';\n                    } else {\n                        elMenu.classList.remove('aberto');\n                        document.body.style.overflow = '';\n                        setTimeout(function(){ if (!elMenu.classList.contains('aberto')) elMenu.hidden = true; }, 240);\n                    }\n\n                    document.querySelectorAll(\".lf-burger\").forEach(function(b){ b.setAttribute(\"aria-expanded\", abrir ? \"true\" : \"false\"); });\n                }\n\n                document.querySelectorAll('.lf-burger').forEach(function(b){\n                    b.addEventListener('click', function(){ abrirMenu(elMenu.hidden); });\n                });\n\n                if (elMenu) {\n                    elMenu.addEventListener('click', function(e){\n                        if (e.target.closest('[data-fechar]')) { abrirMenu(false); return; }\n\n                        const item = e.target.closest('.lf-drawer-item');\n                        if (!item || !item.dataset.acao) return;\n\n                        abrirMenu(false);\n\n                        if (item.dataset.acao === 'novo')              { sairDaEdicao(); mostrarPainel('vendedor'); }\n                        else if (item.dataset.acao === 'agendamentos')   mostrarPainel('agendamentos');\n                        else if (item.dataset.acao === 'mensagens')      mostrarPainel('mensagens');\n                        else if (item.dataset.acao === 'trabalhos')      mostrarPainel('costureira');\n                        else if (item.dataset.acao === 'sair')           terminarSessao();\n                    });\n\n                    document.addEventListener('keydown', function(e){\n                        if (e.key === 'Escape' && !elMenu.hidden) abrirMenu(false);\n                    });\n                }\n\n                if (elAgVoltar) elAgVoltar.addEventListener('click', function(){ mostrarPainel('vendedor'); });\n\n                if (elBusca) {\n                    elBusca.addEventListener('input', function(){\n                        clearTimeout(buscaTimer);\n                        buscaTimer = setTimeout(carregarAgendamentos, 350);\n                    });\n                }\n\n                async function carregarAgendamentos(){\n                    if (!elAgLista) return;\n                    elAgLista.innerHTML = '<p class=\"lf-ag-vazio\">A carregar...<\/p>';\n\n                    try {\n                        const url = ajaxUrl + '?action=londrina_agendamentos&nonce=' + encodeURIComponent(nonce)\n                                  + '&token=' + encodeURIComponent(guardar.ler('lf_token') || '')\n                                  + '&procura=' + encodeURIComponent(elBusca ? elBusca.value.trim() : '');\n\n                        const res  = await fetch(url, { credentials:'same-origin' });\n                        const json = await res.json();\n\n                        if (!json || !json.success) {\n                            elAgLista.innerHTML = '<p class=\"lf-ag-vazio\">N\u00e3o foi poss\u00edvel carregar.<\/p>';\n                            return;\n                        }\n\n                        const lista = json.data.agendamentos || [];\n                        if (!lista.length) {\n                            elAgLista.innerHTML = '<p class=\"lf-ag-vazio\">Nada encontrado.<\/p>';\n                            return;\n                        }\n\n                        elAgLista.innerHTML = '';\n                        lista.forEach(function(a){ elAgLista.appendChild(cartaoAgendamento(a)); });\n                    } catch(e) {\n                        elAgLista.innerHTML = '<p class=\"lf-ag-vazio\">Sem liga\u00e7\u00e3o.<\/p>';\n                    }\n                }\n\n                function cartaoAgendamento(a){\n                    const div = document.createElement('div');\n                    div.className = 'lf-ag' + (a.pronto ? ' pronto' : '');\n\n                    const topo = document.createElement('div');\n                    topo.className = 'lf-ag-topo';\n                    const num = document.createElement('span'); num.className = 'lf-ag-num'; num.textContent = '#' + a.n_talao;\n                    const cli = document.createElement('span'); cli.className = 'lf-ag-cliente'; cli.textContent = a.cliente;\n                    topo.appendChild(num); topo.appendChild(cli);\n                    if (a.pronto) {\n                        const est = document.createElement('span'); est.className = 'lf-ag-estado'; est.textContent = 'Pronto';\n                        topo.appendChild(est);\n                    }\n                    div.appendChild(topo);\n\n                    const svc = document.createElement('div');\n                    svc.className = 'lf-ag-svc';\n                    svc.textContent = a.servicos;\n                    div.appendChild(svc);\n\n                    const datas = document.createElement('div');\n                    datas.className = 'lf-ag-datas';\n                    datas.textContent = 'Costura ' + a.execucao + ' \u00b7 Cliente ' + a.entrega + ' \u00b7 ' + a.minutos\n                                      + (a.vendedor ? ' \u00b7 ' + a.vendedor : '');\n                    div.appendChild(datas);\n\n                    const acoes = document.createElement('div');\n                    acoes.className = 'lf-ag-acoes';\n\n                    const bImp = document.createElement('button');\n                    bImp.type = 'button'; bImp.className = 'lf-ag-btn'; bImp.textContent = 'Reimprimir';\n                    bImp.addEventListener('click', function(){ reimprimir(a.id, bImp); });\n\n                    const bEd = document.createElement('button');\n                    bEd.type = 'button'; bEd.className = 'lf-ag-btn principal'; bEd.textContent = 'Corrigir';\n                    bEd.addEventListener('click', function(){ editarAgendamento(a.id, bEd); });\n\n                    const bDel = document.createElement('button');\n                    bDel.type = 'button'; bDel.className = 'lf-ag-btn apagar'; bDel.textContent = 'Apagar';\n                    bDel.addEventListener('click', function(){ apagarAgendamento(a, div); });\n\n                    \/\/ O vendedor tamb\u00e9m fecha o servi\u00e7o e avisa o cliente (email + WhatsApp)\n                    if (!a.pronto) {\n                        const bPr = document.createElement('button');\n                        bPr.type = 'button'; bPr.className = 'lf-ag-btn pronto'; bPr.textContent = 'Pronto \u2014 avisar';\n                        bPr.addEventListener('click', function(){ prontoAgendamento(a, bPr); });\n                        acoes.appendChild(bPr);\n                    }\n\n                    acoes.appendChild(bImp); acoes.appendChild(bEd); acoes.appendChild(bDel);\n                    if (a.whatsapp) acoes.appendChild(botaoWhatsApp(a.whatsapp, null, { id: a.id, tipo: a.pronto ? 'pronto' : 'registo' }));\n                    div.appendChild(acoes);\n\n                    return div;\n                }\n\n                async function prontoAgendamento(a, btn){\n                    if (!confirm('Marcar o tal\u00e3o #' + a.n_talao + ' como pronto e avisar ' + (a.cliente || 'o cliente') + '?')) return;\n\n                    btn.disabled = true;\n                    btn.textContent = 'A avisar...';\n\n                    async function pedir(){\n                        const corpo = new URLSearchParams();\n                        corpo.set('action', 'londrina_pronto');\n                        corpo.set('nonce', nonce);\n                        corpo.set('token', guardar.ler('lf_token') || '');\n                        corpo.set('id', a.id);\n                        const res = await fetch(ajaxUrl, { method:'POST', credentials:'same-origin', body: corpo });\n                        return res.json();\n                    }\n\n                    try {\n                        let json = await pedir();\n                        if (pedidoRecusadoPorNonce(json) && await renovarNonces()) json = await pedir();\n\n                        if (json && json.success) {\n                            const d = json.data;\n                            showToast(d.message,\n                                      d.estado === 'avisado' ? 'success' : 'error',\n                                      d.estado === 'avisado' ? null : acaoWhatsApp(d.whatsapp, null, { id: d.id, tipo: 'pronto' }));\n                            carregarAgendamentos();\n                            return;\n                        }\n                        showToast((json && json.data && json.data.message) ? json.data.message : 'N\u00e3o foi poss\u00edvel fechar o servi\u00e7o.', 'error');\n                    } catch(e) {\n                        showToast('Sem liga\u00e7\u00e3o. Tenta outra vez.', 'error');\n                    }\n\n                    btn.disabled = false;\n                    btn.textContent = 'Pronto \u2014 avisar';\n                }\n\n                \/* ---------- caixa de mensagens dos clientes ---------- *\/\n                const elMsgCard   = document.getElementById('lfMsgCard');\n                const elMsgLista  = document.getElementById('lfMsgLista');\n                const elMsgConv   = document.getElementById('lfMsgConversa');\n                const elMsgFio    = document.getElementById('lfMsgFio');\n                const elMsgAviso  = document.getElementById('lfMsgAviso');\n                const elMsgTexto  = document.getElementById('lfMsgTexto');\n                const elMsgEnviar = document.getElementById('lfMsgEnviar');\n                const elMsgTitulo = document.getElementById('lfMsgTitulo');\n                const elMsgVoltar = document.getElementById('lfMsgVoltar');\n                const elMsgBadge  = document.getElementById('lfMsgBadge');\n\n                let conversaAberta = '';\n                let msgTimer = null;\n\n                function urlMsg(accao, extra){\n                    return ajaxUrl + '?action=' + accao + '&nonce=' + encodeURIComponent(nonce)\n                         + '&token=' + encodeURIComponent(guardar.ler('lf_token') || '') + (extra || '');\n                }\n\n                function pintarBadge(n){\n                    if (!elMsgBadge) return;\n                    elMsgBadge.textContent = n > 99 ? '99+' : n;\n                    elMsgBadge.hidden = !n;\n                }\n\n                async function contarPorLer(){\n                    if (!WA_API || !elMsgBadge) return;\n                    try {\n                        const res  = await fetch(urlMsg('londrina_wa_conversas', '&so_contagem=1'), { credentials:'same-origin' });\n                        const json = await res.json();\n                        if (json && json.success) pintarBadge(json.data.por_ler || 0);\n                    } catch(e) {}\n                }\n\n                async function carregarConversas(){\n                    if (!elMsgLista) return;\n                    conversaAberta = '';\n                    elMsgConv.hidden = true;\n                    elMsgLista.hidden = false;\n                    elMsgTitulo.textContent = 'Conversas';\n                    if (!elMsgLista.children.length) elMsgLista.innerHTML = '<p class=\"lf-msg-vazio\">A carregar...<\/p>';\n\n                    try {\n                        const res  = await fetch(urlMsg('londrina_wa_conversas'), { credentials:'same-origin' });\n                        const json = await res.json();\n\n                        if (!json || !json.success) {\n                            elMsgLista.innerHTML = '<p class=\"lf-msg-vazio\">N\u00e3o foi poss\u00edvel carregar as mensagens.<\/p>';\n                            return;\n                        }\n\n                        pintarBadge(json.data.por_ler || 0);\n                        const lista = json.data.conversas || [];\n\n                        if (!lista.length) {\n                            elMsgLista.innerHTML = '<p class=\"lf-msg-vazio\">Ainda n\u00e3o h\u00e1 mensagens de clientes.<\/p>';\n                            return;\n                        }\n\n                        elMsgLista.innerHTML = '';\n                        lista.forEach(function(c){\n                            const b = document.createElement('button');\n                            b.type = 'button';\n                            b.className = 'lf-conv' + (c.por_ler ? ' novas' : '');\n\n                            const txt = document.createElement('span');\n                            txt.className = 'lf-conv-txt';\n                            const nome = document.createElement('span');\n                            nome.className = 'lf-conv-nome';\n                            nome.textContent = c.nome;\n                            const ult = document.createElement('span');\n                            ult.className = 'lf-conv-ultima';\n                            ult.textContent = (c.minha ? 'N\u00f3s: ' : '') + c.ultima;\n                            txt.appendChild(nome); txt.appendChild(ult);\n\n                            const hora = document.createElement('span');\n                            hora.className = 'lf-conv-hora';\n                            hora.textContent = c.quando;\n\n                            b.appendChild(txt);\n                            b.appendChild(hora);\n                            if (c.por_ler) {\n                                const n = document.createElement('span');\n                                n.className = 'lf-badge';\n                                n.textContent = c.por_ler;\n                                b.appendChild(n);\n                            }\n\n                            b.addEventListener('click', function(){ abrirConversa(c.numero); });\n                            elMsgLista.appendChild(b);\n                        });\n                    } catch(e) {\n                        elMsgLista.innerHTML = '<p class=\"lf-msg-vazio\">Sem liga\u00e7\u00e3o.<\/p>';\n                    }\n                }\n\n                async function abrirConversa(numero){\n                    conversaAberta = numero;\n                    elMsgLista.hidden = true;\n                    elMsgConv.hidden  = false;\n\n                    try {\n                        const res  = await fetch(urlMsg('londrina_wa_conversa', '&numero=' + encodeURIComponent(numero)), { credentials:'same-origin' });\n                        const json = await res.json();\n\n                        if (!json || !json.success) {\n                            showToast('N\u00e3o foi poss\u00edvel abrir a conversa.', 'error');\n                            return;\n                        }\n\n                        const d = json.data;\n                        pintarBadge(d.por_ler || 0);\n                        elMsgTitulo.textContent = d.nome;\n                        elMsgAviso.textContent  = d.aviso || '';\n                        elMsgTexto.disabled  = !d.aberta;\n                        elMsgEnviar.disabled = !d.aberta;\n\n                        elMsgFio.innerHTML = '';\n                        (d.mensagens || []).forEach(function(m){ elMsgFio.appendChild(balao(m)); });\n                        elMsgFio.scrollTop = elMsgFio.scrollHeight;\n                        if (elMsgFio.lastElementChild) elMsgFio.lastElementChild.scrollIntoView({ block:'nearest' });\n                    } catch(e) {\n                        showToast('Sem liga\u00e7\u00e3o.', 'error');\n                    }\n                }\n\n                function balao(m){\n                    const div = document.createElement('div');\n                    div.className = 'lf-msg ' + (m.minha ? 'nossa' : 'deles');\n                    div.textContent = m.texto;\n                    const sm = document.createElement('small');\n                    sm.textContent = m.quando + (m.minha && m.vendedor ? ' \u00b7 ' + m.vendedor : '');\n                    div.appendChild(sm);\n                    return div;\n                }\n\n                async function enviarResposta(){\n                    const texto = (elMsgTexto.value || '').trim();\n                    if (!conversaAberta || !texto) return;\n\n                    elMsgEnviar.disabled = true;\n                    const original = elMsgEnviar.textContent;\n                    elMsgEnviar.textContent = 'A enviar...';\n\n                    async function pedir(){\n                        const corpo = new URLSearchParams();\n                        corpo.set('action', 'londrina_wa_responder');\n                        corpo.set('nonce', nonce);\n                        corpo.set('token', guardar.ler('lf_token') || '');\n                        corpo.set('numero', conversaAberta);\n                        corpo.set('texto', texto);\n                        const res = await fetch(ajaxUrl, { method:'POST', credentials:'same-origin', body: corpo });\n                        return res.json();\n                    }\n\n                    try {\n                        let json = await pedir();\n                        if (pedidoRecusadoPorNonce(json) && await renovarNonces()) json = await pedir();\n\n                        if (json && json.success) {\n                            elMsgTexto.value = '';\n                            const b = balao({ minha:true, texto: json.data.texto, quando: json.data.quando, vendedor: json.data.vendedor });\n                            elMsgFio.appendChild(b);\n                            b.scrollIntoView({ block:'nearest' });\n                        } else {\n                            showToast((json && json.data && json.data.message) ? json.data.message : 'A mensagem n\u00e3o foi enviada.', 'error');\n                        }\n                    } catch(e) {\n                        showToast('Sem liga\u00e7\u00e3o. A mensagem n\u00e3o foi enviada.', 'error');\n                    }\n\n                    elMsgEnviar.textContent = original;\n                    elMsgEnviar.disabled = false;\n                }\n\n                if (elMsgEnviar) elMsgEnviar.addEventListener('click', enviarResposta);\n                if (elMsgVoltar) elMsgVoltar.addEventListener('click', function(){\n                    if (conversaAberta) carregarConversas();\n                    else mostrarPainel('vendedor');\n                });\n\n                \/* Com o ecr\u00e3 aberto, vai buscando o que chega de novo *\/\n                function vigiarMensagens(ligar){\n                    clearInterval(msgTimer);\n                    if (!ligar) return;\n                    msgTimer = setInterval(function(){\n                        if (document.hidden) return;\n                        if (conversaAberta) abrirConversa(conversaAberta);\n                        else carregarConversas();\n                    }, 20000);\n                }\n\n                async function pedirAgendamento(id){\n                    const url = ajaxUrl + '?action=londrina_agendamento&nonce=' + encodeURIComponent(nonce)\n                              + '&token=' + encodeURIComponent(guardar.ler('lf_token') || '') + '&id=' + id;\n                    const res  = await fetch(url, { credentials:'same-origin' });\n                    const json = await res.json();\n                    return (json && json.success) ? json.data : null;\n                }\n\n                async function reimprimir(id, btn){\n                    btn.disabled = true;\n                    const antes = btn.textContent;\n                    btn.textContent = 'A obter...';\n                    try {\n                        const d = await pedirAgendamento(id);\n                        if (d && d.print_docs) {\n                            ultimosDocs = d.print_docs;\n                            ultimoId = d.id;\n                            lfImprimir(d.print_docs);\n                            if (imprimirAqui()) marcarImpresso(d.id);\n                            else showToast('Tal\u00e3o enviado para a impressora do caixa.', 'success');\n                        } else {\n                            showToast('N\u00e3o foi poss\u00edvel obter o tal\u00e3o.', 'error');\n                        }\n                    } catch(e) {\n                        showToast('Sem liga\u00e7\u00e3o.', 'error');\n                    } finally {\n                        btn.disabled = false;\n                        btn.textContent = antes;\n                    }\n                }\n\n                async function apagarAgendamento(a, cartao){\n                    if (!confirm('Apagar o tal\u00e3o #' + a.n_talao + ' de ' + a.cliente + '?\\n\\nDeixa de contar para a carga das costureiras e desaparece das listas.')) return;\n\n                    try {\n                        const corpo = new URLSearchParams();\n                        corpo.set('action', 'londrina_apagar');\n                        corpo.set('nonce', nonce);\n                        corpo.set('token', guardar.ler('lf_token') || '');\n                        corpo.set('id', a.id);\n\n                        const res  = await fetch(ajaxUrl, { method:'POST', credentials:'same-origin', body: corpo });\n                        const json = await res.json();\n\n                        if (json && json.success) {\n                            cartao.remove();\n                            showToast(json.data.message, 'success');\n                        } else {\n                            showToast('N\u00e3o foi poss\u00edvel apagar.', 'error');\n                        }\n                    } catch(e) {\n                        showToast('Sem liga\u00e7\u00e3o.', 'error');\n                    }\n                }\n\n                \/** Carrega um agendamento no formul\u00e1rio para ser corrigido *\/\n                async function editarAgendamento(id, btn){\n                    btn.disabled = true;\n                    btn.textContent = 'A abrir...';\n\n                    try {\n                        const d = await pedirAgendamento(id);\n                        if (!d) { showToast('N\u00e3o foi poss\u00edvel abrir o agendamento.', 'error'); return; }\n\n                        const dados = d.dados;\n\n                        form.reset();\n                        elPecas.innerHTML = '';\n                        proximaPeca = 0;\n\n                        form.querySelector('[name=\"nome_completo\"]').value = dados.nome_completo || '';\n                        form.querySelector('[name=\"nif\"]').value           = dados.nif || '';\n                        form.querySelector('[name=\"email\"]').value         = dados.email || '';\n                        preencherTelefone(dados);\n                        form.querySelector('[name=\"pago\"]').value          = dados.pago || '';\n                        const obs = form.querySelector('[name=\"observacoes\"]');\n                        if (obs) obs.value = dados.observacoes || '';\n\n                        (dados.pecas || []).forEach(function(peca){\n                            adicionarPeca(peca.artigo);\n                            const caixa = elPecas.lastElementChild;\n                            if (!caixa) return;\n\n                            (peca.servicos || []).forEach(function(it){\n                                const chk = caixa.querySelector('.lf-svc-check[value=\"' + it.key + '\"]');\n                                if (!chk) return;\n                                chk.checked = true;\n                                const linha = chk.closest('.lf-svc');\n                                linha.hidden = false;\n                                const qtd = linha.querySelector('.lf-svc-qtd');\n                                if (qtd) qtd.value = it.qtd || 1;\n                            });\n                        });\n\n                        elWork.value = dados.data_costureira || '';\n                        elClient.min = elWork.value;\n                        elClient.value = dados.previsto || '';\n\n                        elEditarId.value = d.id;\n                        marcarModoEdicao(dados.n_talao);\n\n                        totalMinutos();\n                        carregarAgenda();\n                        mostrarPainel('vendedor');\n                        irParaPasso(1);\n                    } catch(e) {\n                        showToast('Sem liga\u00e7\u00e3o.', 'error');\n                    } finally {\n                        btn.disabled = false;\n                        btn.textContent = 'Corrigir';\n                    }\n                }\n\n                function marcarModoEdicao(talao){\n                    let aviso = document.getElementById('lfEditarAviso');\n                    if (!aviso) {\n                        aviso = document.createElement('div');\n                        aviso.id = 'lfEditarAviso';\n                        aviso.className = 'lf-editar-aviso';\n                        const txt = document.createElement('span');\n                        const btn = document.createElement('button');\n                        btn.type = 'button';\n                        btn.className = 'lf-ag-btn';\n                        btn.textContent = 'Cancelar';\n                        btn.addEventListener('click', function(){ sairDaEdicao(); });\n                        aviso.appendChild(txt);\n                        aviso.appendChild(btn);\n                        form.insertBefore(aviso, form.firstChild);\n                    }\n                    aviso.firstChild.textContent = 'A corrigir o tal\u00e3o #' + talao + '. O n\u00famero mant\u00e9m-se e o cliente n\u00e3o recebe novo email.';\n                    aviso.hidden = false;\n                    if (elRegistar) elRegistar.textContent = 'Guardar e reimprimir';\n                }\n\n                function sairDaEdicao(){\n                    if (elEditarId) elEditarId.value = '';\n                    const aviso = document.getElementById('lfEditarAviso');\n                    if (aviso) aviso.hidden = true;\n                    if (elRegistar) elRegistar.textContent = 'Registar e imprimir';\n\n                    form.reset();\n                    if (elIndValor) escolherIndicativo(elIndValor.value);\n                    if (elPecas) { elPecas.innerHTML = ''; proximaPeca = 0; }\n                    totalMinutos();\n                    if (elCap) elCap.hidden = true;\n                    if (elWeek) elWeek.innerHTML = '';\n                    irParaPasso(1);\n                }\n\n                function terminarSessao(){\n                    guardar.tira('lf_token');\n                    guardar.tira('lf_nome');\n                    guardar.tira('lf_funcao');\n                    guardar.tira('lf_bio');\n                    if (elToken) elToken.value = '';\n                    pedirCodigo('');\n                    if (elGateErro) elGateErro.hidden = true;\n                }\n\n                \/** Decide que ecr\u00e3 abrir consoante a fun\u00e7\u00e3o de quem entrou *\/\n                function mostrarPainel(modo){\n                    if (elGate) elGate.hidden = true;\n                    abrirMenu(false);\n\n                    const ehCostura = (modo === 'costureira');\n                    const ehAgenda  = (modo === 'agendamentos');\n                    const ehMsg     = (modo === 'mensagens');\n\n                    if (elCostura) elCostura.hidden = !ehCostura;\n                    if (elAgCard)  elAgCard.hidden  = !ehAgenda;\n                    if (elMsgCard) elMsgCard.hidden = !ehMsg;\n                    if (elCard)    elCard.hidden    = ehCostura || ehAgenda || ehMsg;\n\n                    if (ehCostura) {\n\n                        carregarTrabalhos();\n                    }\n                    if (ehAgenda) carregarAgendamentos();\n\n                    vigiarMensagens(ehMsg);\n                    if (ehMsg) carregarConversas();\n                    else if (WA_API) contarPorLer();\n                }\n\n                function abrirFormulario(nome, funcao){\n                    funcaoAtual = funcao || 'vendedor';\n                    if (elUserNome) elUserNome.textContent = nome;\n                    if (elCostNome) elCostNome.textContent = nome;\n\n                    if (elDrawNome) elDrawNome.textContent = nome;\n                    if (elDrawIni)  elDrawIni.textContent  = (nome || '?').trim().charAt(0).toUpperCase();\n                    if (elDrawFunc) elDrawFunc.textContent = funcaoAtual === 'ambos' ? 'Vendedor e costureira' : funcaoAtual;\n                    if (elDrawTrab) elDrawTrab.hidden = (funcaoAtual === 'vendedor');\n\n                    mostrarPainel(funcaoAtual === 'costureira' ? 'costureira' : 'vendedor');\n                }\n\n                function pedirCodigo(msg){\n                    if (elCard) elCard.hidden = true;\n                    if (elCostura) elCostura.hidden = true;\n                    if (elAgCard) elAgCard.hidden = true;\n                    if (elMsgCard) elMsgCard.hidden = true;\n                    vigiarMensagens(false);\n                    abrirMenu(false);\n                    if (elGate) elGate.hidden = false;\n                    pin = '';\n                    pintarPin();\n                    if (msg) mostrarErroGate(msg);\n                    if (elKeyBio) elKeyBio.hidden = !guardar.ler('lf_bio');\n                }\n\n                let pin = '';\n                let aVerificar = false;\n\n                function pintarPin(){\n                    if (!elPinDots) return;\n                    const dots = elPinDots.querySelectorAll('i');\n                    for (let i = 0; i < dots.length; i++) dots[i].classList.toggle('on', i < pin.length);\n                }\n\n                async function validarPin(){\n                    if (aVerificar) return;\n                    aVerificar = true;\n\n                    try {\n                        async function tentarPin(){\n                            const body = new URLSearchParams();\n                            body.set('action', 'londrina_pin');\n                            body.set('nonce', nonce);\n                            body.set('pin', pin);\n                            const res = await fetch(ajaxUrl, { method:'POST', credentials:'same-origin', body: body });\n                            return res.json();\n                        }\n\n                        let json = await tentarPin();\n\n                        \/\/ Ecr\u00e3 do c\u00f3digo aberto h\u00e1 mais de um dia: renova a chave e tenta outra vez, sem o vendedor notar\n                        if (pedidoRecusadoPorNonce(json) && await renovarNonces()) json = await tentarPin();\n\n                        if (json && json.success) {\n                            guardar.por('lf_token', json.data.token);\n                            guardar.por('lf_nome', json.data.vendedor);\n                            guardar.por('lf_funcao', json.data.funcao || 'vendedor');\n                            elToken.value = json.data.token;\n                            if (elGateErro) elGateErro.hidden = true;\n                            abrirFormulario(json.data.vendedor, json.data.funcao);\n\n                            if (temWebAuthn() && !guardar.ler('lf_bio')) {\n                                if (confirm('Queres passar a entrar com a impress\u00e3o digital neste telem\u00f3vel?')) {\n                                    await bioRegistar(json.data.vendedor);\n                                }\n                            }\n                        } else {\n                            pin = '';\n                            pintarPin();\n                            mostrarErroGate((json && json.data && json.data.message) ? json.data.message : 'C\u00f3digo n\u00e3o reconhecido.');\n                        }\n                    } catch(e){\n                        pin = '';\n                        pintarPin();\n                        mostrarErroGate('Sem liga\u00e7\u00e3o. Tenta outra vez.');\n                    } finally {\n                        aVerificar = false;\n                    }\n                }\n\n                if (usaPin && elKeys) {\n                    elKeys.addEventListener('click', async function(e){\n                        const btn = e.target.closest('button');\n                        if (!btn) return;\n                        const k = btn.dataset.k;\n\n                        if (k === 'del')      { pin = pin.slice(0, -1); pintarPin(); return; }\n                        if (k === 'bio')      { if (await bioEntrar()) entrarComSessaoGuardada(true); return; }\n                        if (pin.length >= 4)  return;\n\n                        pin += k;\n                        pintarPin();\n                        if (pin.length === 4) validarPin();\n                    });\n\n                    document.addEventListener('keydown', function(e){\n                        if (elGate.hidden) return;\n                        if (e.key >= '0' && e.key <= '9' && pin.length < 4) {\n                            pin += e.key; pintarPin();\n                            if (pin.length === 4) validarPin();\n                        } else if (e.key === 'Backspace') {\n                            pin = pin.slice(0, -1); pintarPin();\n                        }\n                    });\n                }\n\n                if (elSair) elSair.addEventListener('click', terminarSessao);\n\n                \/** Confirma no servidor se a sess\u00e3o guardada ainda vale *\/\n                async function entrarComSessaoGuardada(jaDesbloqueado){\n                    const token = guardar.ler('lf_token');\n                    if (!token) { pedirCodigo(''); return; }\n\n                    try {\n                        const url  = ajaxUrl + '?action=londrina_sessao&nonce=' + encodeURIComponent(nonce) + '&token=' + encodeURIComponent(token);\n                        const res  = await fetch(url, { credentials:'same-origin' });\n                        const json = await res.json();\n\n                        if (!json || !json.success) {\n                            guardar.tira('lf_token');\n                            pedirCodigo('A sess\u00e3o expirou. Marca o teu c\u00f3digo.');\n                            return;\n                        }\n\n                        elToken.value = token;\n\n                        \/\/ Com biometria ativa, o telem\u00f3vel confirma quem \u00e9 antes de abrir\n                        if (!jaDesbloqueado && guardar.ler('lf_bio')) {\n                            if (elGateSub) elGateSub.textContent = 'Confirma com a impress\u00e3o digital';\n                            if (elKeyBio) elKeyBio.hidden = false;\n                            if (!(await bioEntrar())) {\n                                pedirCodigo('');\n                                if (elGateSub) elGateSub.textContent = 'Toca no bot\u00e3o da impress\u00e3o digital ou marca o c\u00f3digo';\n                                return;\n                            }\n                        }\n\n                        abrirFormulario(json.data.vendedor, json.data.funcao);\n                    } catch(e){\n                        \/\/ Sem rede: deixa entrar com o nome guardado; o servidor valida na submiss\u00e3o\n                        const nome = guardar.ler('lf_nome');\n                        if (nome) { elToken.value = token; abrirFormulario(nome, guardar.ler('lf_funcao') || 'vendedor'); }\n                        else pedirCodigo('');\n                    }\n                }\n\n                \/* ---------- passos (telem\u00f3vel e app) ---------- *\/\n                const paineis   = Array.from(form.querySelectorAll('.lf-step'));\n                const cabecalho = form.querySelector('.lf-steps-head');\n                const barraP    = document.getElementById('lfStepsBar');\n                const elVoltar  = document.getElementById('lfVoltar');\n                const elSeguinte= document.getElementById('lfSeguinte');\n                const elRegistar= document.getElementById('lfRegistar');\n                const elResFinal= document.getElementById('lfResumoFinal');\n                const navItens  = Array.from(form.querySelectorAll('.lf-steps-nav li'));\n\n                let passoAtual = 1;\n\n                function porPassos(){\n                    return window.matchMedia('(max-width:720px)').matches || naApp;\n                }\n\n                \/**\n                 * A barra \u00e9 fixa, por isso tapa sempre a faixa de baixo do ecr\u00e3. O cart\u00e3o tem de\n                 * reservar exatamente a altura dela \u2014 que muda com o n\u00famero de bot\u00f5es e com o\n                 * texto do resumo \u2014 sen\u00e3o o fim do conte\u00fado fica escondido por tr\u00e1s.\n                 *\/\n                function ajustarEspacoBarra(){\n                    const barra = form.querySelector('.lf-actions');\n                    if (!barra) return;\n\n                    const cartao = document.getElementById('lfCard');\n                    if (!cartao) return;\n\n                    if (!porPassos()) { cartao.style.removeProperty('padding-bottom'); return; }\n\n                    const altura = Math.round(barra.getBoundingClientRect().height);\n                    if (altura <= 0) return;\n\n                    \/* O important \u00e9 preciso: h\u00e1 CSS no site com !important sobre .lf-card que,\n                       sem isto, apaga a reserva e deixa o fim do formul\u00e1rio debaixo da barra. *\/\n                    let reserva = altura + 40;\n                    cartao.style.setProperty('padding-bottom', reserva + 'px', 'important');\n\n                    \/* Num passo curto \u2014 o \"Cliente\", por exemplo \u2014 a p\u00e1gina pode n\u00e3o ter scroll\n                       nenhum. A\u00ed n\u00e3o basta reservar espa\u00e7o: sem nada para rolar, o \u00faltimo campo\n                       fica debaixo da barra e n\u00e3o h\u00e1 como o subir. Acrescenta-se o que falta. *\/\n                    const rolavel = document.documentElement.scrollHeight - window.innerHeight;\n                    if (rolavel < altura) {\n                        reserva += (altura - rolavel);\n                        cartao.style.setProperty('padding-bottom', reserva + 'px', 'important');\n                    }\n                }\n\n                function aplicarModo(){\n                    const ativo = porPassos();\n                    form.classList.toggle('lf-com-passos', ativo);\n                    if (cabecalho) cabecalho.hidden = !ativo;\n                    if (elVoltar)  elVoltar.hidden  = !ativo || passoAtual === 1;\n                    if (elSeguinte)elSeguinte.hidden= !ativo || passoAtual === paineis.length;\n                    if (elRegistar)elRegistar.hidden= ativo && passoAtual !== paineis.length;\n\n                    paineis.forEach(function(p){\n                        p.hidden = ativo && parseInt(p.dataset.step,10) !== passoAtual;\n                    });\n\n                    navItens.forEach(function(li){\n                        const n = parseInt(li.dataset.para,10);\n                        li.classList.toggle('is-on', n === passoAtual);\n                        li.classList.toggle('is-feito', n < passoAtual);\n                    });\n\n                    if (barraP) barraP.style.width = Math.round((passoAtual \/ paineis.length) * 100) + '%';\n\n                    ajustarEspacoBarra();\n                }\n\n                function validarPasso(n){\n                    const painel = paineis.find(function(p){ return parseInt(p.dataset.step,10) === n; });\n                    if (!painel) return true;\n\n                    const campos = painel.querySelectorAll('input, select, textarea');\n                    for (const campo of campos) {\n                        if (campo.disabled || campo.type === 'hidden' || campo.readOnly) continue;\n                        if (!campo.checkValidity()) {\n                            campo.reportValidity();\n                            return false;\n                        }\n                    }\n\n                    if (n === 2) {\n                        if (!form.querySelector('.lf-peca')) {\n                            showToast('Escolhe o que est\u00e1s a vender: fato, camisa, cal\u00e7a...', 'error');\n                            return false;\n                        }\n                        if (totalMinutos() <= 0) {\n                            showToast('Falta escolher os servi\u00e7os de cada pe\u00e7a.', 'error');\n                            return false;\n                        }\n                    }\n\n                    return true;\n                }\n\n                function irParaPasso(n){\n                    passoAtual = Math.max(1, Math.min(paineis.length, n));\n                    if (passoAtual === paineis.length) construirResumoFinal();\n                    aplicarModo();\n                    const topo = document.querySelector('.lf-card');\n                    if (topo) topo.scrollIntoView({block:'start', behavior:'smooth'});\n                }\n\n                function construirResumoFinal(){\n                    if (!elResFinal) return;\n\n                    const linhas = [];\n                    form.querySelectorAll('.lf-peca').forEach(function(caixa){\n                        const nome = caixa.querySelector('.lf-peca-nome').textContent;\n                        const svcs = [];\n                        caixa.querySelectorAll('.lf-svc').forEach(function(box){\n                            const chk = box.querySelector('.lf-svc-check');\n                            if (!chk.checked) return;\n                            const q = parseInt(box.querySelector('.lf-svc-qtd').value,10) || 1;\n                            svcs.push((q > 1 ? q + 'x ' : '') + box.querySelector('.lf-svc-nome').textContent);\n                        });\n                        linhas.push({ nome: nome, svcs: svcs, min: caixa.querySelector('.lf-peca-min').textContent });\n                    });\n\n                    const cliente = (form.querySelector('[name=\"nome_completo\"]').value || '').trim();\n                    const dataC   = elWork.value ? dataCurta(elWork.value) : '\u2014';\n                    const dataE   = elClient.value ? dataCurta(elClient.value) : '\u2014';\n\n                    let html = '<div class=\"lf-rf-topo\"><strong><\/strong><span>' + fmtMin(totalMinutos()) + ' de costura<\/span><\/div>';\n                    html += '<ul class=\"lf-rf-lista\"><\/ul>';\n                    html += '<div class=\"lf-rf-datas\"><div><span>Costureiras<\/span><strong>' + dataC + '<\/strong><\/div>'\n                          + '<div><span>Cliente levanta<\/span><strong>' + dataE + '<\/strong><\/div><\/div>';\n\n                    elResFinal.innerHTML = html;\n                    elResFinal.hidden = false;\n                    elResFinal.querySelector('.lf-rf-topo strong').textContent = cliente || 'Cliente';\n\n                    const ul = elResFinal.querySelector('.lf-rf-lista');\n                    linhas.forEach(function(l){\n                        const li = document.createElement('li');\n                        const b  = document.createElement('b');\n                        b.textContent = l.nome;\n                        const sp = document.createElement('span');\n                        sp.textContent = l.svcs.length ? l.svcs.join(', ') : 'sem servi\u00e7os';\n                        const em = document.createElement('em');\n                        em.textContent = l.min;\n                        li.appendChild(b); li.appendChild(sp); li.appendChild(em);\n                        ul.appendChild(li);\n                    });\n                }\n\n                if (elSeguinte) {\n                    elSeguinte.addEventListener('click', function(){\n                        if (!validarPasso(passoAtual)) return;\n                        irParaPasso(passoAtual + 1);\n                    });\n                }\n                if (elVoltar) {\n                    elVoltar.addEventListener('click', function(){ irParaPasso(passoAtual - 1); });\n                }\n                navItens.forEach(function(li){\n                    li.addEventListener('click', function(){\n                        const n = parseInt(li.dataset.para,10);\n                        if (n < passoAtual) irParaPasso(n);\n                        else if (n === passoAtual + 1 && validarPasso(passoAtual)) irParaPasso(n);\n                    });\n                });\n\n                window.addEventListener('resize', function(){ aplicarModo(); ajustarEspacoBarra(); });\n\n                \/* ---------- impress\u00e3o (um trabalho por tal\u00e3o, para a impressora cortar) ---------- *\/\n                function lfImprimir(docs){\n            var i = 0;\n            function seguinte(){\n                if (i >= docs.length) return;\n                var html = docs[i++];\n                var frame = document.createElement(\"iframe\");\n                frame.setAttribute(\"aria-hidden\",\"true\");\n                frame.style.cssText = \"position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden\";\n                document.body.appendChild(frame);\n                frame.addEventListener(\"load\", function(){\n                    var w = frame.contentWindow, avancou = false;\n                    function avancar(){\n                        if (avancou) return;\n                        avancou = true;\n                        setTimeout(function(){ frame.remove(); seguinte(); }, 500);\n                    }\n                    try {\n                        w.addEventListener(\"afterprint\", avancar);\n                        w.focus();\n                        w.print();\n                    } catch(e){}\n                    setTimeout(avancar, 1500);\n                });\n                frame.srcdoc = html;\n            }\n            seguinte();\n        }\n                async function marcarImpresso(id){\n                    if (!id) return;\n                    try {\n                        const body = new URLSearchParams();\n                        body.set('action', 'londrina_impresso');\n                        body.set('nonce', nonce);\n                        body.set('id', id);\n                        body.set('token', elToken ? elToken.value : '');\n                        await fetch(ajaxUrl, { method:'POST', credentials:'same-origin', body: body });\n                    } catch(e){}\n                }\n\n                \/* ---------- eventos ---------- *\/\n                form.addEventListener('change', function(e){\n                    if (e.target.matches('.lf-svc-check, .lf-svc-qtd, [name=\"outro_servico\"], [name=\"outro_minutos\"]')) {\n                        totalMinutos();\n                        carregarAgenda();\n                    }\n                    if (e.target === elWork) { sincronizarCliente(); carregarAgenda(); }\n                });\n\n                form.addEventListener('input', function(e){\n                    if (e.target.matches('.lf-svc-qtd, [name=\"outro_minutos\"], [name=\"outro_servico\"]')) totalMinutos();\n                });\n\n                if (elReprint) {\n                    elReprint.addEventListener('click', function(){\n                        if (!ultimosDocs) return;\n                        lfImprimir(ultimosDocs);\n                        marcarImpresso(ultimoId);\n                    });\n                }\n\n                form.addEventListener('submit', async (e)=>{\n                    e.preventDefault();\n                    \/\/ O primeiro .lf-btn passou a ser o \"Voltar\"; o que se bloqueia \u00e9 o de registar\n                    const submitBtn = document.getElementById('lfRegistar') || form.querySelector('button[type=\"submit\"]');\n                    if (submitBtn.disabled) return;\n                    submitBtn.disabled = true;\n\n                    try{\n                        async function enviar(){\n                            const res = await fetch(ajaxUrl, {\n                                method: 'POST',\n                                credentials: 'same-origin',\n                                body: new FormData(form)\n                            });\n                            return res.json();\n                        }\n\n                        let json = await enviar();\n\n                        \/* Chave caducada (app aberta h\u00e1 muito tempo): renova e envia outra vez.\n                           Sem isto perdia-se o formul\u00e1rio inteiro com \"falha de seguran\u00e7a\". *\/\n                        if (pedidoRecusadoPorNonce(json) && await renovarNonces()) json = await enviar();\n\n                        if (json && json.success){\n                            const d = json.data || {};\n                            ultimoId = d.id || 0;\n\n                            if (d.print_docs && d.print_docs.length) {\n                                ultimosDocs = d.print_docs;\n                                elReprint.hidden = false;\n\n                                \/* O vendedor pode sempre mandar o registo por WhatsApp. Sem email \u00e9 a\n                                   \u00fanica forma de o cliente ficar com os dados; com email, \u00e9 o canal\n                                   que muita gente l\u00ea primeiro. *\/\n                                const acao = acaoWhatsApp(d.whatsapp,\n                                                          d.editado ? 'Enviar corre\u00e7\u00e3o por WhatsApp'\n                                                                    : 'Enviar por WhatsApp',\n                                                          { id: d.id, tipo: 'registo' });\n\n                                if (imprimirAqui()) {\n                                    showToast(d.message || 'Servi\u00e7o registado. A imprimir tal\u00f5es...', 'success', acao);\n                                    lfImprimir(d.print_docs);\n                                    marcarImpresso(ultimoId);\n                                } else {\n                                    showToast('Tal\u00e3o #' + (d.n_talao || '') + (d.editado ? ' corrigido.' : ' registado.')\n                                            + ' Os tal\u00f5es v\u00e3o sair na impressora do caixa.'\n                                            + (d.wa_nota ? ' ' + d.wa_nota : ''), 'success', acao);\n                                }\n                            } else {\n                                showToast(d.message || 'Servi\u00e7o registado.', 'success');\n                            }\n\n                            if (elResFinal) { elResFinal.hidden = true; elResFinal.innerHTML = ''; }\n                            elForceW.hidden = true;\n                            sairDaEdicao();\n                        } else {\n                            const payload = json ? json.data : null;\n                            const msg = (payload && payload.message) ? payload.message\n                                      : (typeof payload === 'string' ? payload : 'Ocorreu um erro. Tenta novamente.');\n                            showToast(msg, 'error');\n                            if (payload && payload.code === 'sem_capacidade') {\n                                elForceW.hidden = false;\n                                carregarAgenda();\n                            }\n                            if (payload && payload.code === 'sem_sessao') {\n                                guardar.tira('lf_token');\n                                pedirCodigo('A sess\u00e3o expirou. Marca o teu c\u00f3digo.');\n                            }\n                        }\n                    } catch(err){\n                        showToast('Falha de rede. Verifica a liga\u00e7\u00e3o.', 'error');\n                    } finally{\n                        submitBtn.disabled = false;\n                    }\n                });\n\n                totalMinutos();\n                aplicarModo();\n\n                if (usaPin) {\n                    if (elKeyBio) elKeyBio.hidden = !guardar.ler('lf_bio');\n                    entrarComSessaoGuardada(false);\n                }\n            })();\n        <\/script>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-445152","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Costura - Londrina<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/londrinapdl.com\/en\/costura\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Costura - Londrina\" \/>\n<meta property=\"og:url\" content=\"https:\/\/londrinapdl.com\/en\/costura\/\" \/>\n<meta property=\"og:site_name\" content=\"Londrina\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/londrinapdl\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-04T15:10:27+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/costura\\\/\",\"url\":\"https:\\\/\\\/londrinapdl.com\\\/costura\\\/\",\"name\":\"Costura - Londrina\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/#website\"},\"datePublished\":\"2025-11-04T13:27:36+00:00\",\"dateModified\":\"2025-11-04T15:10:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/costura\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/londrinapdl.com\\\/costura\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/costura\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/londrinapdl.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Costura\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/#website\",\"url\":\"https:\\\/\\\/londrinapdl.com\\\/\",\"name\":\"Londrina\",\"description\":\"O S\u00edmbolo da Moda Masculina\",\"publisher\":{\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/londrinapdl.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/#organization\",\"name\":\"Londrina\",\"url\":\"https:\\\/\\\/londrinapdl.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/londrinapdl.com\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/londrinapdl.com\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/logo.png\",\"width\":991,\"height\":447,\"caption\":\"Londrina\"},\"image\":{\"@id\":\"https:\\\/\\\/londrinapdl.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/londrinapdl\",\"https:\\\/\\\/www.instagram.com\\\/londrinapdl\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Costura - Londrina","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:\/\/londrinapdl.com\/en\/costura\/","og_locale":"en_GB","og_type":"article","og_title":"Costura - Londrina","og_url":"https:\/\/londrinapdl.com\/en\/costura\/","og_site_name":"Londrina","article_publisher":"https:\/\/www.facebook.com\/londrinapdl","article_modified_time":"2025-11-04T15:10:27+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/londrinapdl.com\/costura\/","url":"https:\/\/londrinapdl.com\/costura\/","name":"Costura - Londrina","isPartOf":{"@id":"https:\/\/londrinapdl.com\/#website"},"datePublished":"2025-11-04T13:27:36+00:00","dateModified":"2025-11-04T15:10:27+00:00","breadcrumb":{"@id":"https:\/\/londrinapdl.com\/costura\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/londrinapdl.com\/costura\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/londrinapdl.com\/costura\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/londrinapdl.com\/"},{"@type":"ListItem","position":2,"name":"Costura"}]},{"@type":"WebSite","@id":"https:\/\/londrinapdl.com\/#website","url":"https:\/\/londrinapdl.com\/","name":"Londrina","description":"O S\u00edmbolo da Moda Masculina","publisher":{"@id":"https:\/\/londrinapdl.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/londrinapdl.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/londrinapdl.com\/#organization","name":"Londrina","url":"https:\/\/londrinapdl.com\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/londrinapdl.com\/#\/schema\/logo\/image\/","url":"https:\/\/londrinapdl.com\/wp-content\/uploads\/2020\/09\/logo.png","contentUrl":"https:\/\/londrinapdl.com\/wp-content\/uploads\/2020\/09\/logo.png","width":991,"height":447,"caption":"Londrina"},"image":{"@id":"https:\/\/londrinapdl.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/londrinapdl","https:\/\/www.instagram.com\/londrinapdl\/"]}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/pages\/445152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/comments?post=445152"}],"version-history":[{"count":7,"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/pages\/445152\/revisions"}],"predecessor-version":[{"id":445162,"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/pages\/445152\/revisions\/445162"}],"wp:attachment":[{"href":"https:\/\/londrinapdl.com\/en\/wp-json\/wp\/v2\/media?parent=445152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}