=== PFT – Widget Spacing Control ===
Contributors: piftoworks
Tags: widget, spacing, margin, responsive, sidebar
Requires at least: 5.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.2.3
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Set per-widget top and bottom margins separately for desktop and mobile. Supports negative values.

== Description ==

PFT – Widget Spacing Control adds margin-top / margin-bottom inputs (desktop and mobile, separately) to every widget's settings form. Negative values are supported, so you can both expand and tighten the space between widgets without adding empty spacer widgets.

= Features =

* Per-widget top and bottom margin (px) for desktop and mobile
* Negative values supported (e.g. `-10` to tighten the gap)
* Empty value falls back to the theme default
* No settings page — inputs appear directly inside each widget's form
* Works with any theme (sidebar / widget area)
* No external CSS file. No JavaScript. Single PHP file
* No tracking. No external requests

= How priority is guaranteed =

To make sure your margin settings always win over theme and other plugin CSS:

1. A triple-ID selector (`#id#id#id`) raises specificity to 0-3-0-0, beating typical theme selectors.
2. `!important` is added on every declaration as a second line of defense.
3. Styles are output via `wp_footer` at priority 9999, so they load after all other styles.

Media queries are used to switch between desktop and mobile values cleanly (inline styles are intentionally avoided because inline `!important` would override `@media` rules).

= Responsive breakpoints =

* Desktop: 769px and above
* Mobile: 768px and below

== Installation ==

1. Upload the `widget-spacing-control` folder to `/wp-content/plugins/`, or install via the Plugins screen in WordPress.
2. Activate the plugin through the Plugins screen.
3. Go to **Appearance → Widgets**. Each widget now has a "余白設定 (Spacing)" section at the bottom of its form.
4. Enter values (positive or negative integers) for PC and/or mobile, then save the widget.

== Frequently Asked Questions ==

= Does it work with block-based widgets / Full Site Editing? =

It targets the classic widget system that uses `in_widget_form` and `dynamic_sidebar_params`. Block widgets in FSE themes are not the target use case.

= Will it conflict with my theme's CSS? =

No. The plugin uses inline styles, a high-specificity selector, and late-loaded `<style>` output, so it overrides theme CSS in all common cases.

= Does it store any personal data? =

No. The plugin only saves margin values (integers) in the widget instance options. No personal data is collected or transmitted.

= Where are the settings saved? =

Inside each widget's instance settings (under WordPress's standard `widget_*` options), with keys `wsc_mt_pc`, `wsc_mt_sp`, `wsc_mb_pc`, `wsc_mb_sp`.

== Screenshots ==

1. Spacing inputs added to the bottom of each widget's settings form.

== Changelog ==

= 1.2.3 =
* i18n: all widget form labels are now translatable via the `pft-widget-spacing-control` text domain. English source strings; translations welcome at https://translate.wordpress.org/projects/wp-plugins/pft-widget-spacing-control/

= 1.2.2 =
* Refactor: CSS is now registered with `wp_register_style()` / `wp_enqueue_style()` and attached via `wp_add_inline_style()` (instead of being echoed directly).
* Refactor: CSS is precomputed during `wp_enqueue_scripts` by iterating widget instances, eliminating the prior `wp_footer` echo and the global variable used to accumulate styles.
* Naming: all plugin functions now use the `pftwsc_` prefix (Pifto Works WSC).
* The `dynamic_sidebar_params` filter is now used only to inject `id="{widget_id}"` into widget HTML when the active theme does not provide one (so the precomputed selectors match).

= 1.2.1 =
* Fixed: mobile margin values were ignored because inline `!important` styles overrode `@media` rules. Inline style injection has been removed; styles are now applied exclusively via the `#id#id#id !important` selector inside `<style>`, so PC and mobile values work independently as intended.
* Security: footer style output is now run through `esc_html()` to satisfy WordPress output-escaping standards.
* Renamed plugin to "PFT – Widget Spacing Control" for clearer ownership.

= 1.2.0 =
* Added GPL license headers
* Added `Requires at least` / `Tested up to` headers
* Escaped widget form field IDs and names with `esc_attr()`

= 1.1.0 =
* Triple-ID selector with `!important` for stronger CSS specificity
* Output styles via `wp_footer` at priority 9999

= 1.0.0 =
* Initial release

== Upgrade Notice ==

= 1.2.3 =
Internationalization: widget form labels are now translatable. UI displayed in user's WordPress locale when translations are available.

= 1.2.2 =
Internal refactor to align with WordPress.org plugin standards (CSS is now enqueued via `wp_add_inline_style()`, and a consistent `pftwsc_` function prefix is used). No behavior changes; recommended update.

= 1.2.1 =
Bug fix: mobile margin values are now applied correctly. Previously, PC values were leaking onto mobile due to inline-style specificity overriding the media query. Recommended update.

= 1.2.0 =
Security and standards: output escaping and license headers added. No behavior changes.

== Privacy ==

This plugin does not collect, store, or transmit any personal data. It only stores numeric margin values inside each widget's settings.
