=== Launch Curtain ===
Contributors: hookmaster
Tags: coming soon, maintenance mode, under construction
Requires at least: 5.8
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 4.10.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

A polished, fully customizable "Coming Soon" page for sites under construction — four built-in themes, no code required.

== Description ==

Launch Curtain shows visitors a branded "Coming Soon" page while a site is being built, while logged-in administrators keep browsing the live site as usual. Everything is configured from one settings screen — no code editing required — which makes the plugin equally suited to a single site or a whole roster of client projects.

**Design**
* Four built-in themes — Classic, Minimal, Dark, Split — switchable in one click.
* Customizable heading, subtitle, badges/tags, call-to-action button, image and color palette.
* Clickable social media icons (Instagram, Telegram, WhatsApp, Facebook, VK, YouTube, TikTok, X, LinkedIn, email, phone).
* The stub is a normal WordPress page with no theme header/footer, so it can be further refined in Elementor or the block editor.

**Access & SEO**
* Administrators (manage_options) always see the real site.
* Optional list of IP addresses that always see the real site (client, designer, contractors).
* Two display modes: a simple redirect (302), or an in-place stub with a proper HTTP 503 status and Retry-After header — recommended for SEO during a temporary outage.
* Automatic noindex on the stub page while it's active.
* Optional auto-disable on a scheduled date/time.

**Multilingual**
* Fully translatable (WordPress i18n standard) — ships with an English source and a Russian translation; add more via the included .pot file.

== Installation ==

1. Upload the `launch-curtain` folder to `/wp-content/plugins/`, or install the plugin directly through the "Plugins → Add New" screen in WordPress.
2. Activate the plugin through the "Plugins" screen.
3. On activation, the plugin automatically creates a "Coming Soon" page and turns the stub on.
4. Go to "Settings → Launch Curtain" to choose a theme, edit the text/image/colors, add social links, and adjust access settings.
5. Click "Save" — the stub page is rebuilt with your changes and is live immediately for anyone who isn't logged in as an administrator.

= Updating from a previous version =

Just replace the plugin files as usual (or update through the Plugins screen once the plugin is listed in the directory). Existing settings are preserved; only newly added fields get their default value.

== Frequently Asked Questions ==

= Will visitors really not notice anything is wrong? =

Yes. Regular visitors are shown the stub page instead of the rest of the site. Anyone logged into WordPress as an administrator keeps seeing the real site as normal, so you can keep building without switching accounts or using a private/incognito window.

= Can I edit the stub page's design directly, instead of using the settings fields? =

Yes. The stub is a normal WordPress page with no theme header/footer, so you can open it in Elementor or the block editor and change anything by hand. Just keep in mind that clicking "Save" on the settings screen rebuilds the page from the settings fields again, which would overwrite manual edits — use the settings fields for day-to-day changes, and manual page editing for one-off design tweaks you don't want the plugin to touch again.

= Does this create a real redirect, and is that bad for SEO? =

You choose. "Redirect (302)" sends visitors to the stub page's own URL — simple, but the address bar changes. "No redirect (503 + Retry-After)" shows the stub at whatever URL the visitor requested, with a proper HTTP 503 status — the approach generally recommended for a temporary outage, since search engines understand the site is only temporarily unavailable instead of treating it as a permanent change.

= Can I let specific people (client, designer, QA) see the real site without logging in? =

Yes — add their IP address under "Always show the real site to" in the settings.

= What happens to my content if I deactivate or delete the plugin? =

Deactivating just stops the redirect; the stub page itself stays in your Pages list untouched. Deleting the plugin removes its settings but does not delete the stub page — you can keep, edit, or delete that page like any other.

= Does this plugin link back to the developer anywhere? =

Yes — a small, unobtrusive "Powered by Hookmaster" text link appears at the bottom of the stub page, pointing to the developer's wordpress.org profile. It doesn't collect or send any data, doesn't affect functionality or performance, and isn't an advertisement for a third party.

== Screenshots ==

1. The "Classic" theme — centered card, round image, pill-shaped badges.
2. The "Minimal" theme — large typography, no image, understated call-to-action link.
3. The "Dark" theme — glowing heading, accent-colored badge outlines and button.
4. The "Split" theme — full-height image (or gradient) on one side, content on the other.

== Changelog ==

= 4.10.1 =
* The social icons block is now genuinely escaped with `wp_kses()` and a purpose-built tag/attribute allowlist (svg/path/rect/circle/text plus the wrapping div/a), instead of a `phpcs:ignore` suppression. This matters because the icon set is filterable via `launcu_social_icons` for future extensibility, so its output could no longer be assumed to always be hardcoded, trusted markup — real escaping now provides a genuine safety net if a third-party filter callback ever returns something unexpected.

= 4.10.0 =
* Addressed WordPress.org plugin review feedback:
  * All function names, constants, option names, nonce actions, hook names and form fields now use the `launcu_`/`LAUNCU_` prefix instead of the too-short `lc_`/`LC_`, to avoid collisions with other plugins/themes.
  * The stub page's base background style is now properly registered and enqueued (`wp_register_style()` + `wp_add_inline_style()`) instead of a raw `<style>` tag in the template — and now uses the actual configured background color instead of a hardcoded one.
  * The "Powered by Hookmaster" credit link is now off by default and only appears if the site administrator explicitly opts in via a checkbox in Settings — it's no longer shown automatically.

= 4.9.3 =
* Fixed a second, missed occurrence of the same Plugin Check error: the small platform icon shown next to each social link field on the settings page (not just the frontend icons) also needed the same `phpcs:ignore` documentation.

= 4.9.2 =
* Fixed the one remaining Plugin Check error: the social icon SVG output in `lc_social_html()` is now documented with `phpcs:ignore` — `lc_social_icon_svg()` only ever returns one of a small set of hardcoded, developer-authored SVG strings (never user input), so it doesn't need runtime escaping.

= 4.9.1 =
* Fixed all issues found by the official Plugin Check tool (25 errors, 7 warnings):
  * Added the required "License" field to the plugin header (was only in this readme before).
  * Removed the discouraged `load_plugin_textdomain()` call — WordPress has auto-loaded bundled plugin translations since 4.6, so this was unnecessary and is now handled automatically.
  * Nonce values read from `$_POST` are now unslashed and sanitized before verification (`wp_verify_nonce()`), per WordPress coding standards.
  * Documented (with `phpcs:ignore` + a reason) the handful of places where a helper function/variable already built from escaped pieces (`esc_html()`/`esc_attr()`/`esc_url()`) is echoed as a whole — automated scanners can't trace escaping through a variable, so these are expected, reviewed exceptions, not unescaped output.
  * The `.distignore` file (a build-tool helper, not part of the plugin itself) is no longer bundled into the distributed zip, since hidden/dot files aren't allowed in the WordPress.org package.

= 4.9.0 =
* "Powered by Hookmaster" is no longer a user-toggleable setting — the checkbox has been removed, and the credit link is always shown in the free version. The only way to remove it is the `lc_show_credit` filter, reserved for a future Pro add-on (`add_filter('lc_show_credit', '__return_false');`).
* "Powered by Hookmaster" now stays in English on every locale, including Russian — it's a brand name, not translated content.

= 4.8.1 =
* Credit link now points to the author's wordpress.org profile (https://profiles.wordpress.org/hookmaster/) instead of the plugin's own page, and reads "Powered by Hookmaster" — works as a brand credit for any future hookmaster plugin, not just this one.

= 4.8.0 =
* New developer hooks for a future Pro add-on: `lc_themes` and `lc_page_content` filters let extra themes be registered without touching core; `lc_social_platforms` / `lc_social_icons` let extra social networks be added; `lc_is_visitor_bypassed` filter for custom access rules (e.g. password protection); `lc_default_settings` / `lc_sanitize_settings` filters and `lc_settings_page_after_theme` / `lc_settings_page_end` action hooks for extra settings sections.
* New optional "Powered by Launch Curtain" credit link at the bottom of the stub page (Settings → Credit link), on by default, can be turned off. Also filterable via `lc_show_credit` for a future Pro add-on.

= 4.7.0 =
* New: "Suggest colors for this theme" button next to the theme picker — fills in background/accent/text colors with a palette suited to the selected theme (e.g. a dark background for the Dark theme). Previously, switching the theme never touched colors, so Dark/Split could end up rendered with the light Classic palette by mistake.
* Split theme: added a safety cap (max-height + align-content) on the image column so a very tall/large source image can't stretch to fill the whole viewport height on mobile.

= 4.6.2 =
* Fixed: the WhatsApp field now accepts a plain phone number (like the Phone field), not just a full https://wa.me/... link. Previously, entering just a number produced a broken relative link on the site instead of opening WhatsApp. Also, any other social link field now defaults to https:// if the protocol is left out, instead of silently becoming a broken relative link.

= 4.6.1 =
* Ready for WordPress.org submission: added Installation, FAQ and Screenshots sections to this readme; added uninstall.php (removes the plugin's own settings on delete, leaves the stub page untouched); added .distignore for clean release builds; bumped "Tested up to" to 7.0.

= 4.6.0 =
* Social media links are now individual fields (one per platform, each with its own icon shown right in the settings screen) instead of a single free-form text box — clearer and less error-prone to fill in.
* Plugin description rewritten to be more professional/benefit-led (shown in the Plugins list and on this page).

= 4.5.0 =
* Кликабельные иконки соцсетей — новое поле «Social media icons» / «Иконки соцсетей», формат «платформа|url» (instagram, facebook, vk, telegram, whatsapp, youtube, tiktok, twitter/x, linkedin, email, phone; любая другая платформа получает обычную иконку-ссылку). Отображаются во всех 4 темах, цвет — акцентный.
* Elementor: содержимое заглушки — валидный самодостаточный HTML (все стили инлайн, нет внешних скриптов/шрифтов), это минимизирует риски при редактировании в любом визуальном редакторе. Важный нюанс: при первом клике «Редактировать в Elementor» на уже созданной странице Elementor обычно оборачивает имеющийся контент в один виджет Text Editor, а не разбивает его на отдельные виджеты — это поведение самого Elementor, не плагина. Для точечного редактирования (без риска, что TinyMCE что-то поправит в разметке) на странице настроек добавлена подсказка: при необходимости пересоздайте нужный блок как отдельный виджет Elementor «HTML» и вставьте туда фрагмент разметки.

= 4.4.0 =
* Новая кнопка «Reset text to defaults» / «Сбросить текст к значениям по умолчанию» — возвращает только текстовые поля (надпись, заголовок, подзаголовок, метки, кнопка, футер) к дефолтам на текущем языке сайта, не трогая цвета/тему/картинку/доступ. Пригодится, если в полях остался старый текст (например, после тестирования более ранней версии плагина до появления перевода).

= 4.3.0 =
* Плагин полностью переводимый (стандартный WP i18n): все строки интерфейса обёрнуты в функции перевода, исходный язык кода — английский.
* Добавлен launch-curtain.pot (шаблон для новых переводов) и готовый перевод на русский (languages/launch-curtain-ru_RU.mo) — на сайте с русской локалью админка выглядит как раньше, на любой другой локали (включая английскую) — на английском.
* Значения по умолчанию для текста заглушки (заголовок, подзаголовок, метки, кнопка) тоже переводятся — на новом сайте с другой локалью заглушка создаётся сразу на этом языке.

= 4.2.0 =
* Кнопка «Сохранить» теперь сразу пересоздаёт страницу-заглушку с новыми настройками (текст/картинка/тема применяются без отдельного шага, как раньше работала кнопка «Пересоздать»).
* Метки/теги по умолчанию — убраны примеры про торты, заменены на нейтральные «Сайт в разработке» / «Сообщим о запуске».

= 4.1.0 =
* Исправлена загрузка изображения в настройках — скрипт медиатеки вынесен в отдельный файл и грузится надёжнее (старая проверка hook suffix могла молча не подключать нужные скрипты).
* Добавлены 3 новые темы оформления заглушки: «Минимализм», «Тёмная», «Сплит» — плюс исходная «Классика», всего 4.

= 4.0.0 =
* Настройки содержимого заглушки (текст, картинка, цвета, кнопка, метки) через страницу настроек — больше не захардкожено под один сайт.
* Загрузка изображения через медиатеку WordPress вместо встроенной в код картинки.
* Режим показа без редиректа (HTTP 503 + Retry-After) для более бережного к SEO варианта.
* Список IP-адресов с постоянным доступом к настоящему сайту.
* Автоматическое отключение заглушки по расписанию.

= 3.0.1 =
* Первая версия.
