{"id":12170,"date":"2026-09-17T10:11:04","date_gmt":"2026-09-17T10:11:04","guid":{"rendered":"https:\/\/germannewsnetwork.com\/?page_id=12170"},"modified":"2026-09-26T17:06:19","modified_gmt":"2026-09-26T17:06:19","slug":"ai-pr-generator-testing","status":"publish","type":"page","link":"https:\/\/germannewsnetwork.com\/de\/ai-pr-generator-testing\/","title":{"rendered":"AI PR Generator (Test)"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12170\" class=\"elementor elementor-12170\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-63810b9 e-con e-atomic-element e-flexbox-base e-default-div e-63810b9-ca1b4b3 \" data-id=\"63810b9\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"63810b9\" data-e-type=\"e-flexbox\" data-id=\"63810b9\">\n    <div class=\"elementor-element elementor-element-a07fec0 e-flex e-con-boxed e-con e-parent\" data-id=\"a07fec0\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4acacd0 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"4acacd0\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">AI PR Generator<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-912a7d1 elementor-widget elementor-widget-text-editor\" data-id=\"912a7d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"5,1\">Turn your raw company news, product announcements, or milestones into professional, media-ready press releases instantly with our AI integration. Our advanced copywriting engine structures your submission into a crisp, authoritative journalistic format following the inverted-pyramid standard.<\/p><p data-path-to-node=\"5,2\">\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-533143e e-con e-atomic-element e-flexbox-base e-default-div e-533143e-1e4ca71 \" data-id=\"533143e\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"533143e\" data-e-type=\"e-flexbox\" data-id=\"533143e\">\n    <div class=\"elementor-element elementor-element-00c59ff e-con-full e-flex e-con e-parent\" data-id=\"00c59ff\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ed6aea elementor-button-align-stretch elementor-invisible elementor-widget elementor-widget-form\" data-id=\"6ed6aea\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;button_width&quot;:&quot;30&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;,&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" id=\"pr_generator_form\" name=\"New Form\" aria-label=\"New Form\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"12170\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"6ed6aea\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"\" \/>\n\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-company_name elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-company_name\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tOrganization Name\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[company_name]\" id=\"form-field-company_name\" class=\"elementor-field elementor-size-sm  elementor-field-textual\" placeholder=\"company_name\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-headline elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-headline\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tHeadline\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[headline]\" id=\"form-field-headline\" class=\"elementor-field elementor-size-sm  elementor-field-textual\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-sub_headline elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-sub_headline\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tSub Headline\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[sub_headline]\" id=\"form-field-sub_headline\" class=\"elementor-field elementor-size-sm  elementor-field-textual\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-select elementor-field-group elementor-column elementor-field-group-announcement_type elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-announcement_type\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tAnnouncement Type\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field elementor-select-wrapper remove-before \">\n\t\t\t<div class=\"select-caret-down-wrapper\">\n\t\t\t\t<i aria-hidden=\"true\" class=\"eicon-caret-down\"><\/i>\t\t\t<\/div>\n\t\t\t<select name=\"form_fields[announcement_type]\" id=\"form-field-announcement_type\" class=\"elementor-field-textual elementor-size-sm\" required=\"required\">\n\t\t\t\t\t\t\t\t\t<option value=\"-Select-\">-Select-<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Product Launch \">Product Launch <\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Recognition &amp; Milestones\">Recognition &amp; Milestones<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Finance &amp; Investment\">Finance &amp; Investment<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"People &amp; Organization\">People &amp; Organization<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Corporate &amp; Business\">Corporate &amp; Business<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Technology &amp; Innovation\">Technology &amp; Innovation<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Events &amp; Initiatives\">Events &amp; Initiatives<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Customer \/ Client Announcement\">Customer \/ Client Announcement<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Contract \/ Agreement\">Contract \/ Agreement<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Company Update\">Company Update<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Collaboration Announcement\">Collaboration Announcement<\/option>\n\t\t\t\t\t\t\t\t\t<option value=\"Other\">Other<\/option>\n\t\t\t\t\t\t\t<\/select>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-city elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-city\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tCity\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[city]\" id=\"form-field-city\" class=\"elementor-field elementor-size-sm  elementor-field-textual\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-core_message elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-core_message\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tCore Message\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-sm\" name=\"form_fields[core_message]\" id=\"form-field-core_message\" rows=\"4\" placeholder=\"Paste your rough notes, bullet points, or raw draft here. The more details you provide, the better the output.\" required=\"required\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-key_points elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-key_points\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tKey Points\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-sm\" name=\"form_fields[key_points]\" id=\"form-field-key_points\" rows=\"4\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-checkbox elementor-field-group elementor-column elementor-field-group-target_audience elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-target_audience\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tTarget Audience\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<div class=\"elementor-field-subgroup  elementor-subgroup-inline\"><span class=\"elementor-field-option\"><input type=\"checkbox\" value=\"General Public\" id=\"form-field-target_audience-0\" name=\"form_fields[target_audience][]\"> <label for=\"form-field-target_audience-0\">General Public<\/label><\/span><span class=\"elementor-field-option\"><input type=\"checkbox\" value=\"Industry Investors\" id=\"form-field-target_audience-1\" name=\"form_fields[target_audience][]\"> <label for=\"form-field-target_audience-1\">Industry Investors<\/label><\/span><span class=\"elementor-field-option\"><input type=\"checkbox\" value=\"Tech Specialists\" id=\"form-field-target_audience-2\" name=\"form_fields[target_audience][]\"> <label for=\"form-field-target_audience-2\">Tech Specialists<\/label><\/span><span class=\"elementor-field-option\"><input type=\"checkbox\" value=\"Local Community\" id=\"form-field-target_audience-3\" name=\"form_fields[target_audience][]\"> <label for=\"form-field-target_audience-3\">Local Community<\/label><\/span><\/div>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-executive_quote elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-executive_quote\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tExecutive Quote (Optional)\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-sm\" name=\"form_fields[executive_quote]\" id=\"form-field-executive_quote\" rows=\"4\" placeholder=\"e.g., John Doe (CEO) said: &quot;We are thrilled to expand our network across...&quot;\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-email elementor-field-group elementor-column elementor-field-group-user_email elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-user_email\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tBusiness Email\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"email\" name=\"form_fields[user_email]\" id=\"form-field-user_email\" class=\"elementor-field elementor-size-sm  elementor-field-textual\" placeholder=\"Email Address\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-about_company elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-about_company\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tAbout Company\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[about_company]\" id=\"form-field-about_company\" class=\"elementor-field elementor-size-sm  elementor-field-textual\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-date elementor-field-group elementor-column elementor-field-group-announcement_date elementor-col-100 elementor-field-required elementor-mark-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-announcement_date\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tAnnouncement Date\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\n\t\t<input type=\"date\" name=\"form_fields[announcement_date]\" id=\"form-field-announcement_date\" class=\"elementor-field elementor-size-sm  elementor-field-textual elementor-date-field\" required=\"required\" pattern=\"[0-9]{4}-[0-9]{2}-[0-9]{2}\">\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-url elementor-field-group elementor-column elementor-field-group-pr_image elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-pr_image\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tImage\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"url\" name=\"form_fields[pr_image]\" id=\"form-field-pr_image\" class=\"elementor-field elementor-size-sm  elementor-field-textual\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-relevant_links elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-relevant_links\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tRelevant Website \/ Links\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-sm\" name=\"form_fields[relevant_links]\" id=\"form-field-relevant_links\" rows=\"4\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-30 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-md elementor-animation-grow\" type=\"submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-bolt\"><\/i>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Generate Your PR<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-73a7aca e-flex e-con-boxed e-con e-parent\" data-id=\"73a7aca\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a3b3075 elementor-widget elementor-widget-html\" data-id=\"a3b3075\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"gnn-pr-output\" aria-live=\"polite\">\r\n  <div class=\"gnn-pr-empty-state\">\r\n    <span class=\"gnn-pr-empty-state__label\">PRESS RELEASE PREVIEW<\/span>\r\n    <strong>Your generated press release will appear here.<\/strong>\r\n    <p>Complete the form above and select \u201cGenerate Your PR\u201d.<\/p>\r\n  <\/div>\r\n<\/div>\r\n\r\n\r\n<!-- PR ACTION BUTTONS \u2014 MUST BE OUTSIDE gnn-pr-output -->\r\n<div id=\"gnn-pr-actions\" class=\"gnn-pr-actions\" hidden>\r\n\r\n  <button type=\"button\" id=\"gnn-pr-email\" class=\"gnn-pr-action gnn-pr-action--email\">\r\n    <span>\u2709<\/span>\r\n    Email Press Release\r\n  <\/button>\r\n\r\n  <button type=\"button\" id=\"gnn-pr-whatsapp\" class=\"gnn-pr-action gnn-pr-action--whatsapp\">\r\n    <span>\u25c9<\/span>\r\n    Send via WhatsApp\r\n  <\/button>\r\n\r\n  <button type=\"button\" id=\"gnn-pr-download\" class=\"gnn-pr-action gnn-pr-action--download\">\r\n    <span>\u2193<\/span>\r\n    Download .DOC\r\n  <\/button>\r\n\r\n<\/div>\r\n\r\n<style>\r\n  \/* =========================================================\r\n     GNN AI PRESS RELEASE GENERATOR\r\n     Output + Loading UI\r\n     ========================================================= *\/\r\n\r\n  #gnn-pr-output {\r\n    width: 100%;\r\n    max-width: 920px;\r\n    min-height: 300px;\r\n    box-sizing: border-box;\r\n    margin: 34px auto 0;\r\n    padding: clamp(24px, 5vw, 48px);\r\n    background: #ffffff;\r\n    border: 1px solid #ded9d5;\r\n    border-top: 5px solid #e27d14;\r\n    border-radius: 12px;\r\n    box-shadow: 0 14px 36px rgba(37, 35, 39, .09);\r\n    color: #55525a;\r\n    font-size: clamp(16px, 2vw, 17px);\r\n    line-height: 1.8;\r\n  }\r\n\r\n  \/* =========================================================\r\n     EMPTY STATE\r\n     ========================================================= *\/\r\n\r\n  .gnn-pr-empty-state {\r\n    min-height: 200px;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    justify-content: center;\r\n    text-align: center;\r\n  }\r\n\r\n  .gnn-pr-empty-state__label {\r\n    display: inline-block;\r\n    margin-bottom: 12px;\r\n    color: #bd6510;\r\n    font-size: 12px;\r\n    font-weight: 700;\r\n    letter-spacing: .1em;\r\n  }\r\n\r\n  .gnn-pr-empty-state strong {\r\n    color: #252327;\r\n    font-size: clamp(20px, 3vw, 25px);\r\n    line-height: 1.3;\r\n  }\r\n\r\n  .gnn-pr-empty-state p {\r\n    margin: 10px 0 0;\r\n  }\r\n\r\n  \/* =========================================================\r\n     AI LOADING EXPERIENCE\r\n     ========================================================= *\/\r\n\r\n  .gnn-pr-loading {\r\n    min-height: 340px;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    justify-content: center;\r\n    text-align: center;\r\n    position: relative;\r\n    overflow: hidden;\r\n  }\r\n\r\n  .gnn-pr-loading::before {\r\n    content: \"\";\r\n    position: absolute;\r\n    width: 230px;\r\n    height: 230px;\r\n    border-radius: 50%;\r\n    border: 1px solid rgba(226, 125, 20, .18);\r\n    animation: gnnPulse 2.2s ease-in-out infinite;\r\n  }\r\n\r\n  .gnn-pr-loading::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    width: 150px;\r\n    height: 150px;\r\n    border-radius: 50%;\r\n    border: 1px solid rgba(226, 125, 20, .12);\r\n    animation: gnnPulse 2.2s ease-in-out .5s infinite;\r\n  }\r\n\r\n  .gnn-pr-ai-orb {\r\n    width: 64px;\r\n    height: 64px;\r\n    border-radius: 50%;\r\n    background: linear-gradient(\r\n      135deg,\r\n      #e27d14,\r\n      #bd6510\r\n    );\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    color: #ffffff;\r\n    font-size: 26px;\r\n    font-weight: 700;\r\n    box-shadow:\r\n      0 0 0 8px rgba(226, 125, 20, .08),\r\n      0 8px 30px rgba(189, 101, 16, .25);\r\n    animation: gnnOrb 1.8s ease-in-out infinite;\r\n    z-index: 2;\r\n  }\r\n\r\n  .gnn-pr-loading__label {\r\n    margin-top: 28px;\r\n    color: #bd6510;\r\n    font-size: 11px;\r\n    font-weight: 800;\r\n    letter-spacing: .13em;\r\n    text-transform: uppercase;\r\n    z-index: 2;\r\n  }\r\n\r\n  .gnn-pr-loading__title {\r\n    margin-top: 8px;\r\n    color: #252327;\r\n    font-size: clamp(21px, 3vw, 28px);\r\n    font-weight: 700;\r\n    line-height: 1.3;\r\n    z-index: 2;\r\n  }\r\n\r\n  .gnn-pr-loading__status {\r\n    min-height: 28px;\r\n    margin-top: 8px;\r\n    color: #55525a;\r\n    font-size: 15px;\r\n    z-index: 2;\r\n    transition: opacity .25s ease;\r\n  }\r\n\r\n  .gnn-pr-loading__steps {\r\n    width: min(420px, 90%);\r\n    margin-top: 22px;\r\n    z-index: 2;\r\n  }\r\n\r\n  .gnn-pr-loading__step {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 10px;\r\n    margin: 9px 0;\r\n    color: #8a878c;\r\n    font-size: 13px;\r\n    text-align: left;\r\n    transition: all .3s ease;\r\n  }\r\n\r\n  .gnn-pr-loading__step.is-active {\r\n    color: #252327;\r\n    font-weight: 600;\r\n  }\r\n\r\n  .gnn-pr-loading__step.is-complete {\r\n    color: #bd6510;\r\n  }\r\n\r\n  .gnn-pr-loading__dot {\r\n    width: 9px;\r\n    height: 9px;\r\n    flex: 0 0 9px;\r\n    border-radius: 50%;\r\n    background: #d7d2ce;\r\n  }\r\n\r\n  .gnn-pr-loading__step.is-active .gnn-pr-loading__dot {\r\n    background: #e27d14;\r\n    box-shadow: 0 0 0 5px rgba(226, 125, 20, .10);\r\n    animation: gnnDot 1s ease-in-out infinite;\r\n  }\r\n\r\n  .gnn-pr-loading__step.is-complete .gnn-pr-loading__dot {\r\n    background: #bd6510;\r\n  }\r\n\r\n  \/* =========================================================\r\n     INDETERMINATE AI ACTIVITY BAR\r\n     ========================================================= *\/\r\n\r\n  .gnn-pr-progress {\r\n    position: relative;\r\n    width: min(420px, 90%);\r\n    height: 5px;\r\n    margin-top: 18px;\r\n    background: #eee9e5;\r\n    border-radius: 20px;\r\n    overflow: hidden;\r\n    z-index: 2;\r\n  }\r\n\r\n  .gnn-pr-progress__bar {\r\n    position: absolute;\r\n    top: 0;\r\n    left: -35%;\r\n    width: 35%;\r\n    height: 100%;\r\n    background: linear-gradient(\r\n      90deg,\r\n      transparent,\r\n      #bd6510,\r\n      #e27d14,\r\n      transparent\r\n    );\r\n    border-radius: inherit;\r\n    animation: gnnProgressSweep 1.8s ease-in-out infinite;\r\n  }\r\n\r\n  @keyframes gnnProgressSweep {\r\n    0% {\r\n      left: -35%;\r\n    }\r\n\r\n    100% {\r\n      left: 100%;\r\n    }\r\n  }\r\n\r\n  .gnn-pr-loading__timer {\r\n    margin-top: 9px;\r\n    color: #999398;\r\n    font-size: 11px;\r\n    z-index: 2;\r\n  }\r\n\r\n  \/* =========================================================\r\n     GENERATED ARTICLE\r\n     ========================================================= *\/\r\n\r\n  #gnn-pr-output article {\r\n    max-width: 820px;\r\n    margin: 0 auto;\r\n  }\r\n\r\n  #gnn-pr-output h1 {\r\n    margin: 0 0 12px;\r\n    color: #252327;\r\n    font-size: clamp(28px, 5vw, 40px);\r\n    line-height: 1.18;\r\n    font-weight: 800;\r\n  }\r\n\r\n  #gnn-pr-output .gnn-pr-subheadline {\r\n    margin: 0 0 28px;\r\n    color: #55525a;\r\n    font-size: clamp(18px, 2.5vw, 22px);\r\n    line-height: 1.5;\r\n    font-weight: 500;\r\n  }\r\n\r\n  #gnn-pr-output .gnn-pr-release-line {\r\n    margin-bottom: 6px;\r\n    color: #252327;\r\n    font-size: 14px;\r\n    font-weight: 700;\r\n  }\r\n\r\n  #gnn-pr-output .gnn-pr-meta {\r\n    margin-bottom: 22px;\r\n    color: #bd6510;\r\n    font-size: 13px;\r\n    font-weight: 700;\r\n    letter-spacing: .07em;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  #gnn-pr-output .gnn-pr-image {\r\n    width: 100%;\r\n    max-height: 520px;\r\n    object-fit: cover;\r\n    display: block;\r\n    margin: 24px 0 30px;\r\n    border-radius: 8px;\r\n  }\r\n\r\n  #gnn-pr-output p {\r\n    margin: 0 0 18px;\r\n  }\r\n\r\n  #gnn-pr-output h2 {\r\n    margin: 34px 0 13px;\r\n    padding-bottom: 9px;\r\n    border-bottom: 1px solid #ded9d5;\r\n    color: #252327;\r\n    font-size: clamp(21px, 3vw, 24px);\r\n    line-height: 1.3;\r\n    font-weight: 750;\r\n  }\r\n\r\n  #gnn-pr-output .gnn-pr-section {\r\n    margin-top: 28px;\r\n  }\r\n\r\n  #gnn-pr-output .gnn-pr-section h2 {\r\n    margin-top: 0;\r\n  }\r\n\r\n  #gnn-pr-output .gnn-pr-section + .gnn-pr-section {\r\n    margin-top: 34px;\r\n  }\r\n\r\n  #gnn-pr-output ul {\r\n    margin: 0 0 20px;\r\n    padding-left: 24px;\r\n  }\r\n\r\n  #gnn-pr-output li {\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  #gnn-pr-output blockquote {\r\n    margin: 26px 0;\r\n    padding: 18px 22px;\r\n    border-left: 4px solid #e27d14;\r\n    border-radius: 0 7px 7px 0;\r\n    background: #fffaf5;\r\n    color: #252327;\r\n    font-style: italic;\r\n  }\r\n\r\n  .gnn-pr-contact {\r\n    margin-top: 26px;\r\n    padding-top: 20px;\r\n    border-top: 1px solid #ded9d5;\r\n  }\r\n\r\n  .gnn-pr-contact strong {\r\n    color: #252327;\r\n  }\r\n\r\n  .gnn-pr-links {\r\n    margin-top: 12px;\r\n  }\r\n\r\n  .gnn-pr-links a {\r\n    color: #bd6510;\r\n    text-decoration: underline;\r\n  }\r\n\r\n  .gnn-pr-word-count {\r\n    margin-top: 30px;\r\n    color: #999398;\r\n    font-size: 11px;\r\n    text-transform: uppercase;\r\n    letter-spacing: .08em;\r\n  }\r\n\r\n  \/* =========================================================\r\n     ANIMATIONS\r\n     ========================================================= *\/\r\n\r\n  @keyframes gnnOrb {\r\n    0%, 100% {\r\n      transform: scale(1);\r\n      box-shadow:\r\n        0 0 0 8px rgba(226, 125, 20, .08),\r\n        0 8px 30px rgba(189, 101, 16, .25);\r\n    }\r\n\r\n    50% {\r\n      transform: scale(1.08);\r\n      box-shadow:\r\n        0 0 0 14px rgba(226, 125, 20, .05),\r\n        0 12px 38px rgba(189, 101, 16, .30);\r\n    }\r\n  }\r\n\r\n  @keyframes gnnPulse {\r\n    0%, 100% {\r\n      transform: scale(.85);\r\n      opacity: .2;\r\n    }\r\n\r\n    50% {\r\n      transform: scale(1.08);\r\n      opacity: .65;\r\n    }\r\n  }\r\n\r\n  @keyframes gnnDot {\r\n    0%, 100% {\r\n      transform: scale(1);\r\n    }\r\n\r\n    50% {\r\n      transform: scale(1.45);\r\n    }\r\n  }\r\n\r\n  \/* =========================================================\r\n     MOBILE\r\n     ========================================================= *\/\r\n\r\n  @media (max-width: 767px) {\r\n\r\n    #gnn-pr-output {\r\n      min-height: 250px;\r\n      margin-top: 24px;\r\n      padding: 28px 20px;\r\n      border-radius: 9px;\r\n    }\r\n\r\n    .gnn-pr-loading {\r\n      min-height: 380px;\r\n    }\r\n\r\n    #gnn-pr-output h1 {\r\n      font-size: 29px;\r\n    }\r\n\r\n    #gnn-pr-output .gnn-pr-subheadline {\r\n      font-size: 18px;\r\n    }\r\n\r\n    #gnn-pr-output .gnn-pr-image {\r\n      max-height: 360px;\r\n    }\r\n  }\r\n\r\n  \/* Reduced motion accessibility *\/\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .gnn-pr-loading *,\r\n    .gnn-pr-loading::before,\r\n    .gnn-pr-loading::after {\r\n      animation: none !important;\r\n      transition: none !important;\r\n    }\r\n  }\r\n  \r\n  \/* =========================================================\r\n   GENERATED PR ACTION BUTTONS\r\n   ========================================================= *\/\r\n\r\n.gnn-pr-actions {\r\n    width: min(920px, 100%);\r\n    margin: 22px auto 40px;\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    justify-content: center;\r\n    gap: 12px;\r\n    box-sizing: border-box;\r\n}\r\n\r\n.gnn-pr-actions[hidden] {\r\n    display: none !important;\r\n}\r\n\r\n.gnn-pr-action {\r\n    appearance: none;\r\n    border: 1px solid #ded9d5;\r\n    border-radius: 7px;\r\n    padding: 13px 20px;\r\n    min-height: 48px;\r\n    background: #ffffff;\r\n    color: #252327;\r\n    font-family: inherit;\r\n    font-size: 14px;\r\n    font-weight: 700;\r\n    line-height: 1.2;\r\n    cursor: pointer;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 9px;\r\n    transition:\r\n        background .2s ease,\r\n        color .2s ease,\r\n        border-color .2s ease,\r\n        transform .2s ease,\r\n        box-shadow .2s ease;\r\n}\r\n\r\n.gnn-pr-action span {\r\n    font-size: 17px;\r\n    line-height: 1;\r\n}\r\n\r\n.gnn-pr-action:hover {\r\n    transform: translateY(-1px);\r\n    box-shadow: 0 6px 18px rgba(37, 35, 39, .10);\r\n}\r\n\r\n\/* Email *\/\r\n.gnn-pr-action--email:hover {\r\n    background: #252327;\r\n    border-color: #252327;\r\n    color: #ffffff;\r\n}\r\n\r\n\/* WhatsApp *\/\r\n.gnn-pr-action--whatsapp:hover {\r\n    background: #25d366;\r\n    border-color: #25d366;\r\n    color: #ffffff;\r\n}\r\n\r\n\/* Download *\/\r\n.gnn-pr-action--download {\r\n    background: #e27d14;\r\n    border-color: #e27d14;\r\n    color: #ffffff;\r\n}\r\n\r\n.gnn-pr-action--download:hover {\r\n    background: #bd6510;\r\n    border-color: #bd6510;\r\n    color: #ffffff;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   MOBILE ACTION BUTTONS\r\n   ========================================================= *\/\r\n\r\n@media (max-width: 767px) {\r\n\r\n    .gnn-pr-actions {\r\n        margin: 18px auto 30px;\r\n        padding: 0 15px;\r\n        flex-direction: column;\r\n    }\r\n\r\n    .gnn-pr-action {\r\n        width: 100%;\r\n    }\r\n\r\n}\r\n<\/style>\r\n\r\n<script>\r\njQuery(function ($) {\r\n\r\n   const form = document.getElementById('pr_generator_form');\r\nconst output = document.getElementById('gnn-pr-output');\r\nconst actions = document.getElementById('gnn-pr-actions');\r\n\r\nif (!form || !output) return;\r\n\r\n\r\n    \/* =========================================================\r\n       FIELD READER\r\n       ========================================================= *\/\r\n\r\n    function getValue(fieldId) {\r\n\r\n        const field = document.getElementById(\r\n            'form-field-' + fieldId\r\n        );\r\n\r\n        return field\r\n            ? String(field.value || '').trim()\r\n            : '';\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       TARGET AUDIENCE\r\n       ========================================================= *\/\r\n\r\n    function getTargetAudience() {\r\n\r\n        const values = [];\r\n\r\n        form.querySelectorAll(\r\n            'input[id*=\"target_audience\"],' +\r\n            'select[id*=\"target_audience\"],' +\r\n            'textarea[id*=\"target_audience\"]'\r\n        ).forEach(function (field) {\r\n\r\n            if (\r\n                field.type === 'checkbox' &&\r\n                !field.checked\r\n            ) {\r\n                return;\r\n            }\r\n\r\n            if (\r\n                field.value &&\r\n                String(field.value).trim()\r\n            ) {\r\n                values.push(\r\n                    String(field.value).trim()\r\n                );\r\n            }\r\n\r\n        });\r\n\r\n        return values.join(', ');\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       HTML ESCAPE\r\n       ========================================================= *\/\r\n\r\n    function escapeHtml(value) {\r\n\r\n        const div =\r\n            document.createElement('div');\r\n\r\n        div.textContent =\r\n            value || '';\r\n\r\n        return div.innerHTML;\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       LINK PARSER\r\n       ========================================================= *\/\r\n\r\n    function normalizeUrl(url) {\r\n\r\n        if (!url) return '';\r\n\r\n        url = String(url).trim();\r\n\r\n        if (!\/^https?:\\\/\\\/\/i.test(url)) {\r\n            url = 'https:\/\/' + url;\r\n        }\r\n\r\n        try {\r\n            const parsed = new URL(url);\r\n\r\n            if (\r\n                parsed.protocol !== 'http:' &&\r\n                parsed.protocol !== 'https:'\r\n            ) {\r\n                return '';\r\n            }\r\n\r\n            return parsed.href;\r\n\r\n        } catch (e) {\r\n            return '';\r\n        }\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       LOADING EXPERIENCE\r\n       ========================================================= *\/\r\n\r\n    \/* =========================================================\r\n       LOADING EXPERIENCE\r\n       ========================================================= *\/\r\n\r\n    let loadingInterval = null;\r\n    let loadingStep = 0;\r\n    let loadingStart = 0;\r\n    let isGenerating = false;\r\n\r\n    const loadingMessages = [\r\n        'Reviewing the information you provided\u2026',\r\n        'Structuring the announcement\u2026',\r\n        'Writing the press release\u2026',\r\n        'Refining the newsroom language\u2026',\r\n        'Improving clarity and flow\u2026',\r\n        'Checking the release for repetition\u2026',\r\n        'Finalising your press release\u2026'\r\n    ];\r\n\r\n    const loadingSteps = [\r\n        'Reviewing your information',\r\n        'Structuring the announcement',\r\n        'Writing the release',\r\n        'Refining language',\r\n        'Checking quality',\r\n        'Finalising the release'\r\n    ];\r\n\r\n\r\n    function showLoading() {\r\n\r\n        loadingStep = 0;\r\n        loadingStart = Date.now();\r\n        isGenerating = true;\r\n        \r\n         if (actions) {\r\n        actions.hidden = true;\r\n    }\r\n\r\n        output.innerHTML = `\r\n            <div class=\"gnn-pr-loading\">\r\n\r\n                <div class=\"gnn-pr-ai-orb\">\r\n                    \u2726\r\n                <\/div>\r\n\r\n                <div class=\"gnn-pr-loading__label\">\r\n                    GNN AI PRESS RELEASE GENERATOR\r\n                <\/div>\r\n\r\n                <div class=\"gnn-pr-loading__title\">\r\n                    Preparing your press release\r\n                <\/div>\r\n\r\n                <div\r\n                    class=\"gnn-pr-loading__status\"\r\n                    id=\"gnn-pr-loading-status\"\r\n                >\r\n                    ${loadingMessages[0]}\r\n                <\/div>\r\n\r\n                <div class=\"gnn-pr-loading__steps\">\r\n\r\n                    ${loadingSteps.map(function (step, index) {\r\n\r\n                        return `\r\n                            <div\r\n                                class=\"gnn-pr-loading__step ${\r\n                                    index === 0\r\n                                        ? 'is-active'\r\n                                        : ''\r\n                                }\"\r\n                                data-step=\"${index}\"\r\n                            >\r\n                                <span class=\"gnn-pr-loading__dot\"><\/span>\r\n                                ${step}\r\n                            <\/div>\r\n                        `;\r\n\r\n                    }).join('')}\r\n\r\n                <\/div>\r\n\r\n                <div\r\n                    class=\"gnn-pr-progress\"\r\n                    aria-hidden=\"true\"\r\n                >\r\n                    <div class=\"gnn-pr-progress__bar\"><\/div>\r\n                <\/div>\r\n\r\n                <div\r\n                    class=\"gnn-pr-loading__timer\"\r\n                    id=\"gnn-pr-loading-timer\"\r\n                >\r\n                    0 seconds\r\n                <\/div>\r\n\r\n            <\/div>\r\n        `;\r\n\r\n\r\n        const status =\r\n            document.getElementById(\r\n                'gnn-pr-loading-status'\r\n            );\r\n\r\n        const timer =\r\n            document.getElementById(\r\n                'gnn-pr-loading-timer'\r\n            );\r\n\r\n        const steps =\r\n            output.querySelectorAll(\r\n                '.gnn-pr-loading__step'\r\n            );\r\n\r\n\r\n        \/*\r\n         * This animation is deliberately independent\r\n         * of the actual AI process.\r\n         *\r\n         * It indicates activity rather than claiming\r\n         * that a specific AI operation has completed.\r\n         *\/\r\n\r\n        loadingInterval = setInterval(function () {\r\n\r\n            const elapsed =\r\n                Math.floor(\r\n                    (Date.now() - loadingStart) \/ 1000\r\n                );\r\n\r\n\r\n            \/* Elapsed time *\/\r\n\r\n            if (timer) {\r\n\r\n                timer.textContent =\r\n                    elapsed +\r\n                    (\r\n                        elapsed === 1\r\n                            ? ' second'\r\n                            : ' seconds'\r\n                    );\r\n            }\r\n\r\n\r\n            \/*\r\n             * Rotate the visual workflow.\r\n             *\r\n             * We intentionally do not display a\r\n             * numerical completion percentage.\r\n             *\/\r\n\r\n            const nextStep =\r\n                Math.min(\r\n                    5,\r\n                    Math.floor(elapsed \/ 6)\r\n                );\r\n\r\n\r\n            if (\r\n                nextStep !== loadingStep\r\n            ) {\r\n\r\n                loadingStep =\r\n                    nextStep;\r\n\r\n\r\n                steps.forEach(\r\n                    function (step, index) {\r\n\r\n                        step.classList.remove(\r\n                            'is-active',\r\n                            'is-complete'\r\n                        );\r\n\r\n\r\n                        if (\r\n                            index < loadingStep\r\n                        ) {\r\n\r\n                            step.classList.add(\r\n                                'is-complete'\r\n                            );\r\n                        }\r\n\r\n\r\n                        if (\r\n                            index === loadingStep\r\n                        ) {\r\n\r\n                            step.classList.add(\r\n                                'is-active'\r\n                            );\r\n                        }\r\n\r\n                    }\r\n                );\r\n\r\n\r\n                if (status) {\r\n\r\n                    status.style.opacity =\r\n                        '0';\r\n\r\n\r\n                    setTimeout(function () {\r\n\r\n                        status.textContent =\r\n                            loadingMessages[\r\n                                Math.min(\r\n                                    loadingStep,\r\n                                    loadingMessages.length - 1\r\n                                )\r\n                            ];\r\n\r\n\r\n                        status.style.opacity =\r\n                            '1';\r\n\r\n                    }, 180);\r\n                }\r\n            }\r\n\r\n        }, 1000);\r\n    }\r\n\r\n\r\n    function stopLoading() {\r\n\r\n        if (loadingInterval) {\r\n\r\n            clearInterval(\r\n                loadingInterval\r\n            );\r\n\r\n            loadingInterval = null;\r\n        }\r\n\r\n        isGenerating = false;\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       ERROR\r\n       ========================================================= *\/\r\n\r\n    function showError(message) {\r\n\r\n        stopLoading();\r\n        \r\n         if (actions) {\r\n        actions.hidden = true;\r\n    }\r\n\r\n        output.innerHTML = `\r\n            <div class=\"gnn-pr-empty-state\">\r\n\r\n                <span class=\"gnn-pr-empty-state__label\">\r\n                    GENERATION ERROR\r\n                <\/span>\r\n\r\n                <strong>\r\n                    We couldn't generate the press release.\r\n                <\/strong>\r\n\r\n                <p>\r\n                    ${escapeHtml(message)}\r\n                <\/p>\r\n\r\n                <p style=\"margin-top:14px;\">\r\n                    Please review the information and try again.\r\n                <\/p>\r\n\r\n            <\/div>\r\n        `;\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       PARAGRAPHS\r\n       ========================================================= *\/\r\n\r\n    function addParagraphs(parent, paragraphs) {\r\n\r\n        if (!Array.isArray(paragraphs)) {\r\n            return;\r\n        }\r\n\r\n        paragraphs.forEach(function (text) {\r\n\r\n            if (\r\n                !text ||\r\n                !String(text).trim()\r\n            ) {\r\n                return;\r\n            }\r\n\r\n            const p =\r\n                document.createElement('p');\r\n\r\n            p.textContent =\r\n                String(text).trim();\r\n\r\n            parent.appendChild(p);\r\n\r\n        });\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       STRUCTURED SECTIONS\r\n       ========================================================= *\/\r\n\r\n    function renderSections(parent, sections) {\r\n\r\n        if (!Array.isArray(sections)) {\r\n            return false;\r\n        }\r\n\r\n        let rendered = false;\r\n\r\n        sections.forEach(function (section) {\r\n\r\n            if (!section) {\r\n                return;\r\n            }\r\n\r\n            const headingText =\r\n                section.heading\r\n                    ? String(section.heading).trim()\r\n                    : '';\r\n\r\n            const paragraphs =\r\n                Array.isArray(section.paragraphs)\r\n                    ? section.paragraphs\r\n                    : [];\r\n\r\n\r\n            if (\r\n                !headingText &&\r\n                !paragraphs.length\r\n            ) {\r\n                return;\r\n            }\r\n\r\n\r\n            const wrapper =\r\n                document.createElement('section');\r\n\r\n            wrapper.className =\r\n                'gnn-pr-section';\r\n\r\n\r\n            if (headingText) {\r\n\r\n                const heading =\r\n                    document.createElement('h2');\r\n\r\n                heading.textContent =\r\n                    headingText;\r\n\r\n                wrapper.appendChild(\r\n                    heading\r\n                );\r\n            }\r\n\r\n\r\n            addParagraphs(\r\n                wrapper,\r\n                paragraphs\r\n            );\r\n\r\n\r\n            parent.appendChild(\r\n                wrapper\r\n            );\r\n\r\n            rendered = true;\r\n\r\n        });\r\n\r\n        return rendered;\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       GENERATED ARTICLE\r\n       ========================================================= *\/\r\n\r\n    function renderArticle(data) {\r\n\r\n        stopLoading();\r\n\r\n        output.replaceChildren();\r\n\r\n        const article =\r\n            document.createElement('article');\r\n\r\n\r\n        \/* =====================================================\r\n           FOR IMMEDIATE RELEASE + DATE\r\n           ===================================================== *\/\r\n\r\n        const releaseLine =\r\n            document.createElement('div');\r\n\r\n        releaseLine.className =\r\n            'gnn-pr-release-line';\r\n\r\n        releaseLine.textContent =\r\n            'For Immediate Release' +\r\n            (\r\n                data.date\r\n                    ? ' \u00b7 ' + data.date\r\n                    : ''\r\n            );\r\n\r\n        article.appendChild(\r\n            releaseLine\r\n        );\r\n\r\n\r\n        \/* =====================================================\r\n           CITY \/ ANNOUNCEMENT TYPE\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            data.announcement_type ||\r\n            data.city\r\n        ) {\r\n\r\n            const meta =\r\n                document.createElement('div');\r\n\r\n            meta.className =\r\n                'gnn-pr-meta';\r\n\r\n            const metaParts = [];\r\n\r\n            if (data.announcement_type) {\r\n                metaParts.push(\r\n                    data.announcement_type\r\n                );\r\n            }\r\n\r\n            if (data.city) {\r\n                metaParts.push(\r\n                    data.city\r\n                );\r\n            }\r\n\r\n            meta.textContent =\r\n                metaParts.join(' \u00b7 ');\r\n\r\n            article.appendChild(\r\n                meta\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           MAIN HEADLINE\r\n           ===================================================== *\/\r\n\r\n        const title =\r\n            document.createElement('h1');\r\n\r\n        title.textContent =\r\n            data.headline ||\r\n            'Generated Press Release';\r\n\r\n        article.appendChild(\r\n            title\r\n        );\r\n\r\n\r\n        \/* =====================================================\r\n           SUBHEADLINE\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            data.sub_headline\r\n        ) {\r\n\r\n            const subheadline =\r\n                document.createElement('div');\r\n\r\n            subheadline.className =\r\n                'gnn-pr-subheadline';\r\n\r\n            subheadline.textContent =\r\n                data.sub_headline;\r\n\r\n            article.appendChild(\r\n                subheadline\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           IMAGE\r\n           ===================================================== *\/\r\n\r\n        if (data.image_url) {\r\n\r\n            const imageUrl =\r\n                normalizeUrl(\r\n                    data.image_url\r\n                );\r\n\r\n            if (imageUrl) {\r\n\r\n                const image =\r\n                    document.createElement('img');\r\n\r\n                image.className =\r\n                    'gnn-pr-image';\r\n\r\n                image.src =\r\n                    imageUrl;\r\n\r\n                image.alt =\r\n                    data.headline ||\r\n                    'Press release image';\r\n\r\n                image.loading =\r\n                    'lazy';\r\n\r\n                image.referrerPolicy =\r\n                    'no-referrer';\r\n\r\n                image.onerror =\r\n                    function () {\r\n                        image.remove();\r\n                    };\r\n\r\n                article.appendChild(\r\n                    image\r\n                );\r\n            }\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           DATELINE\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            data.dateline\r\n        ) {\r\n\r\n            const dateline =\r\n                document.createElement('p');\r\n\r\n            dateline.textContent =\r\n                data.dateline;\r\n\r\n            article.appendChild(\r\n                dateline\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           BODY \/ STRUCTURED SECTIONS\r\n           ===================================================== *\/\r\n\r\n        const hasStructuredSections =\r\n            renderSections(\r\n                article,\r\n                data.sections\r\n            );\r\n\r\n\r\n        \/*\r\n         * Backward compatibility:\r\n         * If the backend does not yet return\r\n         * structured sections, continue using\r\n         * the existing body array.\r\n         *\/\r\n\r\n        if (!hasStructuredSections) {\r\n\r\n            addParagraphs(\r\n                article,\r\n                data.body\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           KEY HIGHLIGHTS\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            Array.isArray(\r\n                data.key_highlights\r\n            ) &&\r\n            data.key_highlights.length\r\n        ) {\r\n\r\n            const heading =\r\n                document.createElement('h2');\r\n\r\n            heading.textContent =\r\n                'Key Highlights';\r\n\r\n            article.appendChild(\r\n                heading\r\n            );\r\n\r\n\r\n            const list =\r\n                document.createElement('ul');\r\n\r\n\r\n            data.key_highlights.forEach(\r\n                function (point) {\r\n\r\n                    if (!point) return;\r\n\r\n                    const item =\r\n                        document.createElement('li');\r\n\r\n                    item.textContent =\r\n                        String(point).trim();\r\n\r\n                    list.appendChild(\r\n                        item\r\n                    );\r\n\r\n                }\r\n            );\r\n\r\n\r\n            article.appendChild(\r\n                list\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           EXECUTIVE COMMENT\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            data.executive_comment\r\n        ) {\r\n\r\n            const heading =\r\n                document.createElement('h2');\r\n\r\n            heading.textContent =\r\n                'Executive Comment';\r\n\r\n            article.appendChild(\r\n                heading\r\n            );\r\n\r\n\r\n            const quote =\r\n                document.createElement(\r\n                    'blockquote'\r\n                );\r\n\r\n            quote.textContent =\r\n                data.executive_comment;\r\n\r\n            article.appendChild(\r\n                quote\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           ABOUT COMPANY\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            data.about_company\r\n        ) {\r\n\r\n            const company =\r\n                data.company_name ||\r\n                getValue('company_name') ||\r\n                'Company';\r\n\r\n\r\n            const heading =\r\n                document.createElement('h2');\r\n\r\n            heading.textContent =\r\n                'About ' + company;\r\n\r\n            article.appendChild(\r\n                heading\r\n            );\r\n\r\n\r\n            const about =\r\n                document.createElement('p');\r\n\r\n            about.textContent =\r\n                data.about_company;\r\n\r\n            article.appendChild(\r\n                about\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           MEDIA CONTACT\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            data.business_email\r\n        ) {\r\n\r\n            const contact =\r\n                document.createElement(\r\n                    'div'\r\n                );\r\n\r\n            contact.className =\r\n                'gnn-pr-contact';\r\n\r\n            contact.innerHTML =\r\n                '<strong>Media Contact<\/strong><br>' +\r\n                escapeHtml(\r\n                    data.business_email\r\n                );\r\n\r\n            article.appendChild(\r\n                contact\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           RELEVANT LINKS\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            Array.isArray(\r\n                data.relevant_links\r\n            ) &&\r\n            data.relevant_links.length\r\n        ) {\r\n\r\n            const linksWrapper =\r\n                document.createElement(\r\n                    'div'\r\n                );\r\n\r\n            linksWrapper.className =\r\n                'gnn-pr-links';\r\n\r\n            const heading =\r\n                document.createElement(\r\n                    'strong'\r\n                );\r\n\r\n            heading.textContent =\r\n                'More Information';\r\n\r\n            linksWrapper.appendChild(\r\n                heading\r\n            );\r\n\r\n\r\n            data.relevant_links.forEach(\r\n                function (url) {\r\n\r\n                    const normalized =\r\n                        normalizeUrl(url);\r\n\r\n                    if (!normalized) {\r\n                        return;\r\n                    }\r\n\r\n                    const br =\r\n                        document.createElement(\r\n                            'br'\r\n                        );\r\n\r\n                    const link =\r\n                        document.createElement(\r\n                            'a'\r\n                        );\r\n\r\n                    link.href =\r\n                        normalized;\r\n\r\n                    link.target =\r\n                        '_blank';\r\n\r\n                    link.rel =\r\n                        'noopener noreferrer';\r\n\r\n                    link.textContent =\r\n                        normalized;\r\n\r\n                    linksWrapper.appendChild(\r\n                        br\r\n                    );\r\n\r\n                    linksWrapper.appendChild(\r\n                        link\r\n                    );\r\n                }\r\n            );\r\n\r\n\r\n            article.appendChild(\r\n                linksWrapper\r\n            );\r\n        }\r\n\r\n\r\n        \/* =====================================================\r\n           WORD COUNT\r\n           ===================================================== *\/\r\n\r\n        if (\r\n            typeof data.word_count !==\r\n            'undefined'\r\n        ) {\r\n\r\n            const count =\r\n                document.createElement(\r\n                    'div'\r\n                );\r\n\r\n            count.className =\r\n                'gnn-pr-word-count';\r\n\r\n            count.textContent =\r\n                data.word_count +\r\n                ' words';\r\n\r\n            article.appendChild(\r\n                count\r\n            );\r\n        }\r\n\r\n\r\n        output.appendChild(\r\n            article\r\n        );\r\n        \r\n        \/* Show action buttons after successful generation *\/\r\nif (actions) {\r\n    actions.hidden = false;\r\n}\r\n\r\n\r\n        window.scrollTo({\r\n\r\n            top:\r\n                output.getBoundingClientRect()\r\n                    .top +\r\n                window.scrollY -\r\n                80,\r\n\r\n            behavior:\r\n                'smooth'\r\n        });\r\n    }\r\n\r\n\r\n    \/* =========================================================\r\n       SUBMIT\r\n       ========================================================= *\/\r\n\r\n    form.addEventListener(\r\n        'submit',\r\n        async function (event) {\r\n\r\n            event.preventDefault();\r\n            event.stopImmediatePropagation();\r\n\r\n            if (isGenerating) {\r\n                return;\r\n            }\r\n\r\n\r\n            if (\r\n                !form.reportValidity()\r\n            ) {\r\n                return;\r\n            }\r\n\r\n\r\n            \/* =================================================\r\n               PAYLOAD\r\n               ================================================= *\/\r\n\r\n            const payload = {\r\n\r\n                \/* Existing fields *\/\r\n\r\n                company_name:\r\n                    getValue(\r\n                        'company_name'\r\n                    ),\r\n\r\n                headline:\r\n                    getValue(\r\n                        'headline'\r\n                    ),\r\n\r\n                announcement_type:\r\n                    getValue(\r\n                        'announcement_type'\r\n                    ),\r\n\r\n                city:\r\n                    getValue(\r\n                        'city'\r\n                    ),\r\n\r\n                core_message:\r\n                    getValue(\r\n                        'core_message'\r\n                    ),\r\n\r\n                key_points:\r\n                    getValue(\r\n                        'key_points'\r\n                    ),\r\n\r\n                target_audience:\r\n                    getTargetAudience(),\r\n\r\n                executive_quote:\r\n                    getValue(\r\n                        'executive_quote'\r\n                    ),\r\n\r\n                business_email:\r\n                    getValue(\r\n                        'business_email'\r\n                    ),\r\n\r\n                about_company:\r\n                    getValue(\r\n                        'about_company'\r\n                    ),\r\n\r\n\r\n                \/* New fields *\/\r\n\r\n                announcement_date:\r\n                    getValue(\r\n                        'announcement_date'\r\n                    ),\r\n\r\n                sub_headline:\r\n                    getValue(\r\n                        'sub_headline'\r\n                    ),\r\n\r\n                image_url:\r\n                    getValue(\r\n                        'pr_image'\r\n                    ),\r\n\r\n                relevant_links:\r\n                    getValue(\r\n                        'relevant_links'\r\n                    )\r\n\r\n            };\r\n\r\n\r\n            showLoading();\r\n\r\n\r\n            \/*\r\n             * Frontend safety timeout.\r\n             *\r\n             * The WordPress AI Client remains configured\r\n             * for the longer server-side timeout.\r\n             *\r\n             * This limits the visitor-facing wait to\r\n             * 60 seconds without changing the backend\r\n             * AI timeout.\r\n             *\/\r\n\r\n            const controller =\r\n                new AbortController();\r\n\r\n            const timeoutId =\r\n                setTimeout(\r\n                    function () {\r\n                        controller.abort();\r\n                    },\r\n                    120000\r\n                );\r\n\r\n\r\n            try {\r\n\r\n                const response =\r\n                    await fetch(\r\n                        '\/wp-json\/gnn\/v1\/generate-pr',\r\n                        {\r\n                            method: 'POST',\r\n\r\n                            headers: {\r\n                                'Content-Type':\r\n                                    'application\/json'\r\n                            },\r\n\r\n                            signal:\r\n                                controller.signal,\r\n\r\n                            body:\r\n                                JSON.stringify(\r\n                                    payload\r\n                                )\r\n                        }\r\n                    );\r\n\r\n\r\n                clearTimeout(\r\n                    timeoutId\r\n                );\r\n\r\n\r\n                let result;\r\n\r\n                try {\r\n\r\n                    result =\r\n                        await response.json();\r\n\r\n                } catch (jsonError) {\r\n\r\n                    throw new Error(\r\n                        'The generator returned an invalid response.'\r\n                    );\r\n                }\r\n\r\n\r\n                if (\r\n                    !response.ok ||\r\n                    !result.success\r\n                ) {\r\n\r\n                    throw new Error(\r\n                        result.message ||\r\n                        'AI generation failed.'\r\n                    );\r\n                }\r\n\r\n\r\n                if (\r\n                    !result.press_release\r\n                ) {\r\n\r\n                    throw new Error(\r\n                        'The AI returned an incomplete press release.'\r\n                    );\r\n                }\r\n\r\n\r\n                renderArticle({\r\n\r\n                    ...result.press_release,\r\n\r\n                    word_count:\r\n                        result.word_count\r\n\r\n                });\r\n\r\n\r\n            } catch (error) {\r\n\r\n                clearTimeout(\r\n                    timeoutId\r\n                );\r\n\r\n                console.error(\r\n                    'GNN AI Generator:',\r\n                    error\r\n                );\r\n\r\n\r\n                if (\r\n                    error.name ===\r\n                    'AbortError'\r\n                ) {\r\n\r\n                    showError(\r\n                        'The generation request took longer than 120 seconds. Please try again. Your information has not been lost.'\r\n                    );\r\n\r\n                } else {\r\n\r\n                    showError(\r\n                        error.message ||\r\n                        'Please try again.'\r\n                    );\r\n                }\r\n            }\r\n\r\n        },\r\n        true\r\n    );\r\n\r\n});\r\n<\/script>\r\n\r\n\r\n\r\n<script>\r\njQuery(function ($) {\r\n  const output = document.getElementById('gnn-pr-output');\r\n\r\n  \/* Replace these values *\/\r\n  const adminEmail = 'hello@germannewsnetwork.com';\r\n  const adminWhatsApp = '919870527870';\r\n  \/* Example WhatsApp format: 919876543210 \u2014 no +, spaces, or symbols *\/\r\n\r\n  function getGeneratedArticle() {\r\n    return output ? output.querySelector('article') : null;\r\n  }\r\n\r\n  function getGeneratedText() {\r\n    const article = getGeneratedArticle();\r\n    return article ? article.innerText.trim() : '';\r\n  }\r\n\r\n  function requireGeneratedOutput() {\r\n    const text = getGeneratedText();\r\n\r\n    if (!text) {\r\n      alert('Please generate your press release before using this option.');\r\n      output.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      return null;\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n  \/* Opens a prefilled email draft for the visitor to review and send *\/\r\n  $('#gnn-pr-email').on('click', function (event) {\r\n    event.preventDefault();\r\n\r\n    const text = requireGeneratedOutput();\r\n    if (!text) return;\r\n\r\n    const headline =\r\n      getGeneratedArticle().querySelector('h1')?.innerText ||\r\n      'Generated Press Release';\r\n\r\n    const subject = 'Press Release Submission: ' + headline;\r\n    const body = 'A press release was generated on German News Network:\\n\\n' + text;\r\n\r\n    window.location.href =\r\n      'mailto:' + adminEmail +\r\n      '?subject=' + encodeURIComponent(subject) +\r\n      '&body=' + encodeURIComponent(body);\r\n  });\r\n\r\n  \/* Opens a WhatsApp message for the visitor to review and send *\/\r\n  $('#gnn-pr-whatsapp').on('click', function (event) {\r\n    event.preventDefault();\r\n\r\n    const text = requireGeneratedOutput();\r\n    if (!text) return;\r\n\r\n    const message =\r\n      'Press Release Submission \u2013 German News Network\\n\\n' + text;\r\n\r\n    window.open(\r\n      'https:\/\/wa.me\/' + adminWhatsApp +\r\n      '?text=' + encodeURIComponent(message),\r\n      '_blank',\r\n      'noopener'\r\n    );\r\n  });\r\n\r\n  \/* Downloads a Word-compatible .doc document *\/\r\n  $('#gnn-pr-download').on('click', function (event) {\r\n    event.preventDefault();\r\n\r\n    const article = getGeneratedArticle();\r\n    const text = requireGeneratedOutput();\r\n    if (!article || !text) return;\r\n\r\n    const headline =\r\n      article.querySelector('h1')?.innerText ||\r\n      'press-release';\r\n\r\n    const documentHtml = `\r\n      <!DOCTYPE html>\r\n      <html>\r\n      <head>\r\n        <meta charset=\"utf-8\">\r\n        <title>${headline}<\/title>\r\n        <style>\r\n          body {\r\n            font-family: Arial, sans-serif;\r\n            max-width: 760px;\r\n            margin: 45px auto;\r\n            color: #252327;\r\n            font-size: 12pt;\r\n            line-height: 1.7;\r\n          }\r\n          h1 {\r\n            font-size: 25pt;\r\n            line-height: 1.2;\r\n            margin-bottom: 12px;\r\n          }\r\n          h2 {\r\n            font-size: 16pt;\r\n            margin-top: 28px;\r\n          }\r\n          .gnn-pr-meta {\r\n            color: #bd6510;\r\n            font-weight: bold;\r\n            text-transform: uppercase;\r\n          }\r\n          blockquote {\r\n            margin: 20px 0;\r\n            padding: 14px;\r\n            border-left: 4px solid #e27d14;\r\n            background: #fffaf5;\r\n            font-style: italic;\r\n          }\r\n        <\/style>\r\n      <\/head>\r\n      <body>${article.innerHTML}<\/body>\r\n      <\/html>`;\r\n\r\n    const blob = new Blob(\r\n      ['\\ufeff', documentHtml],\r\n      { type: 'application\/msword' }\r\n    );\r\n\r\n    const downloadLink = document.createElement('a');\r\n    const safeFilename = headline\r\n      .replace(\/[^a-z0-9]+\/gi, '-')\r\n      .replace(\/^-+|-+$\/g, '')\r\n      .toLowerCase();\r\n\r\n    downloadLink.href = URL.createObjectURL(blob);\r\n    downloadLink.download = (safeFilename || 'press-release') + '.doc';\r\n    document.body.appendChild(downloadLink);\r\n    downloadLink.click();\r\n    downloadLink.remove();\r\n\r\n    setTimeout(() => URL.revokeObjectURL(downloadLink.href), 1000);\r\n  });\r\n});\r\n<\/script>\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":"<p>AI PR Generator Turn your raw company news, product announcements, or milestones into professional, media-ready press releases instantly with our AI integration. Our advanced copywriting engine structures your submission into a crisp, authoritative journalistic format following the inverted-pyramid standard. \u00a0 PRESS RELEASE PREVIEW Your generated press release will appear here. Complete the form above and [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-12170","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/pages\/12170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/comments?post=12170"}],"version-history":[{"count":53,"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/pages\/12170\/revisions"}],"predecessor-version":[{"id":13218,"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/pages\/12170\/revisions\/13218"}],"wp:attachment":[{"href":"https:\/\/germannewsnetwork.com\/de\/wp-json\/wp\/v2\/media?parent=12170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}