refactor(toc, customizer): improve TOC architecture and reorganize customizer settings

- Reorganized Customizer structure for improved clarity and maintainability
- Introduced consistent default values for all settings to ensure stable fallbacks
  when no user preferences are defined

- Refactored scroll-driven TOC implementation:
  - Optimized scroll handling using requestAnimationFrame
  - Reduced layout thrashing and unnecessary DOM reads
  - Improved heading detection logic (deterministic viewport trigger)
  - Enhanced positioning logic (responsive alignment + sidebar awareness)
  - Improved footer collision handling for more robust layout behavior

- Added optional IntersectionObserver-based TOC implementation:
  - Event-driven alternative to scroll-based approach
  - Currently not enabled by default
  - May not be supported long-term due to less deterministic behavior

- General cleanup and internal consistency improvements

chore: bump version to 2.4.0
This commit is contained in:
2026-04-26 18:48:28 +02:00
parent 36cad12351
commit 6bf38ae05d
8 changed files with 864 additions and 91 deletions
+88 -26
View File
@@ -10,7 +10,24 @@ add_action( 'customize_register', 'zeitfresser_general_options' );
function zeitfresser_general_options( $wp_customize ) {
/**
* General Section (falls nicht schon vorhanden)
* 🔥 Custom Heading Control
*/
if ( class_exists( 'WP_Customize_Control' ) ) {
class ZTFR_Customize_Heading_Control extends WP_Customize_Control {
public $type = 'ztfr-heading';
public function render_content() {
?>
<span style="display:block; font-weight:600; font-size:14px; margin:15px 0 5px;">
<?php echo esc_html( $this->label ); ?>
</span>
<?php
}
}
}
/**
* General Section
*/
if ( ! $wp_customize->get_section( 'ztfr_general' ) ) {
$wp_customize->add_section(
@@ -23,28 +40,23 @@ function zeitfresser_general_options( $wp_customize ) {
}
/**
* Excerpt Length
* ------------------------
* HEADER
* ------------------------
*/
$wp_customize->add_setting(
'post_snippet_excerpt_size',
array(
'default' => 20,
'sanitize_callback' => 'absint',
)
);
$wp_customize->add_setting( 'ztfr_header_heading', array(
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control(
'post_snippet_excerpt_size',
array(
'type' => 'number',
'section' => 'ztfr_general',
'label' => 'Excerpt Length (Post Cards)',
'description' => 'Number of words shown in post previews.',
'input_attrs' => array(
'min' => 5,
'max' => 100,
'step' => 1,
),
new ZTFR_Customize_Heading_Control(
$wp_customize,
'ztfr_header_heading',
array(
'label' => 'Header',
'section' => 'ztfr_general',
'priority' => 1,
)
)
);
@@ -62,9 +74,10 @@ function zeitfresser_general_options( $wp_customize ) {
$wp_customize->add_control(
'show_hide_site_title',
array(
'type' => 'checkbox',
'section' => 'ztfr_general',
'label' => 'Show Site Title',
'type' => 'checkbox',
'section' => 'ztfr_general',
'label' => 'Show Site Title',
'priority' => 2,
)
);
@@ -82,9 +95,58 @@ function zeitfresser_general_options( $wp_customize ) {
$wp_customize->add_control(
'show_hide_site_tagline',
array(
'type' => 'checkbox',
'section' => 'ztfr_general',
'label' => 'Show Tagline',
'type' => 'checkbox',
'section' => 'ztfr_general',
'label' => 'Show Tagline',
'priority' => 3,
)
);
/**
* ------------------------
* GRID
* ------------------------
*/
$wp_customize->add_setting( 'ztfr_grid_heading', array(
'sanitize_callback' => 'sanitize_text_field',
));
$wp_customize->add_control(
new ZTFR_Customize_Heading_Control(
$wp_customize,
'ztfr_grid_heading',
array(
'label' => 'Grid',
'section' => 'ztfr_general',
'priority' => 20,
)
)
);
/**
* Excerpt Length
*/
$wp_customize->add_setting(
'post_snippet_excerpt_size',
array(
'default' => 25,
'sanitize_callback' => 'absint',
)
);
$wp_customize->add_control(
'post_snippet_excerpt_size',
array(
'type' => 'number',
'section' => 'ztfr_general',
'label' => 'Excerpt Length (Post Cards)',
'description' => 'Number of words shown in post previews.',
'priority' => 21,
'input_attrs' => array(
'min' => 5,
'max' => 100,
'step' => 1,
),
)
);
}