/** * Theme functions and definitions * * @package HelloElementor */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } define( 'HELLO_ELEMENTOR_VERSION', '3.4.6' ); define( 'EHP_THEME_SLUG', 'hello-elementor' ); define( 'HELLO_THEME_PATH', get_template_directory() ); define( 'HELLO_THEME_URL', get_template_directory_uri() ); define( 'HELLO_THEME_ASSETS_PATH', HELLO_THEME_PATH . '/assets/' ); define( 'HELLO_THEME_ASSETS_URL', HELLO_THEME_URL . '/assets/' ); define( 'HELLO_THEME_SCRIPTS_PATH', HELLO_THEME_ASSETS_PATH . 'js/' ); define( 'HELLO_THEME_SCRIPTS_URL', HELLO_THEME_ASSETS_URL . 'js/' ); define( 'HELLO_THEME_STYLE_PATH', HELLO_THEME_ASSETS_PATH . 'css/' ); define( 'HELLO_THEME_STYLE_URL', HELLO_THEME_ASSETS_URL . 'css/' ); define( 'HELLO_THEME_IMAGES_PATH', HELLO_THEME_ASSETS_PATH . 'images/' ); define( 'HELLO_THEME_IMAGES_URL', HELLO_THEME_ASSETS_URL . 'images/' ); if ( ! isset( $content_width ) ) { $content_width = 800; // Pixels. } if ( ! function_exists( 'hello_elementor_setup' ) ) { /** * Set up theme support. * * @return void */ function hello_elementor_setup() { if ( is_admin() ) { hello_maybe_update_theme_version_in_db(); } if ( apply_filters( 'hello_elementor_register_menus', true ) ) { register_nav_menus( [ 'menu-1' => esc_html__( 'Header', 'hello-elementor' ) ] ); register_nav_menus( [ 'menu-2' => esc_html__( 'Footer', 'hello-elementor' ) ] ); } if ( apply_filters( 'hello_elementor_post_type_support', true ) ) { add_post_type_support( 'page', 'excerpt' ); } if ( apply_filters( 'hello_elementor_add_theme_support', true ) ) { add_theme_support( 'post-thumbnails' ); add_theme_support( 'automatic-feed-links' ); add_theme_support( 'title-tag' ); add_theme_support( 'html5', [ 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption', 'script', 'style', 'navigation-widgets', ] ); add_theme_support( 'custom-logo', [ 'height' => 100, 'width' => 350, 'flex-height' => true, 'flex-width' => true, ] ); add_theme_support( 'align-wide' ); add_theme_support( 'responsive-embeds' ); /* * Editor Styles */ add_theme_support( 'editor-styles' ); add_editor_style( 'assets/css/editor-styles.css' ); /* * WooCommerce. */ if ( apply_filters( 'hello_elementor_add_woocommerce_support', true ) ) { // WooCommerce in general. add_theme_support( 'woocommerce' ); // Enabling WooCommerce product gallery features (are off by default since WC 3.0.0). // zoom. add_theme_support( 'wc-product-gallery-zoom' ); // lightbox. add_theme_support( 'wc-product-gallery-lightbox' ); // swipe. add_theme_support( 'wc-product-gallery-slider' ); } } } } add_action( 'after_setup_theme', 'hello_elementor_setup' ); function hello_maybe_update_theme_version_in_db() { $theme_version_option_name = 'hello_theme_version'; // The theme version saved in the database. $hello_theme_db_version = get_option( $theme_version_option_name ); // If the 'hello_theme_version' option does not exist in the DB, or the version needs to be updated, do the update. if ( ! $hello_theme_db_version || version_compare( $hello_theme_db_version, HELLO_ELEMENTOR_VERSION, '<' ) ) { update_option( $theme_version_option_name, HELLO_ELEMENTOR_VERSION ); } } if ( ! function_exists( 'hello_elementor_display_header_footer' ) ) { /** * Check whether to display header footer. * * @return bool */ function hello_elementor_display_header_footer() { $hello_elementor_header_footer = true; return apply_filters( 'hello_elementor_header_footer', $hello_elementor_header_footer ); } } if ( ! function_exists( 'hello_elementor_scripts_styles' ) ) { /** * Theme Scripts & Styles. * * @return void */ function hello_elementor_scripts_styles() { if ( apply_filters( 'hello_elementor_enqueue_style', true ) ) { wp_enqueue_style( 'hello-elementor', HELLO_THEME_STYLE_URL . 'reset.css', [], HELLO_ELEMENTOR_VERSION ); } if ( apply_filters( 'hello_elementor_enqueue_theme_style', true ) ) { wp_enqueue_style( 'hello-elementor-theme-style', HELLO_THEME_STYLE_URL . 'theme.css', [], HELLO_ELEMENTOR_VERSION ); } if ( hello_elementor_display_header_footer() ) { wp_enqueue_style( 'hello-elementor-header-footer', HELLO_THEME_STYLE_URL . 'header-footer.css', [], HELLO_ELEMENTOR_VERSION ); } } } add_action( 'wp_enqueue_scripts', 'hello_elementor_scripts_styles' ); if ( ! function_exists( 'hello_elementor_register_elementor_locations' ) ) { /** * Register Elementor Locations. * * @param ElementorPro\Modules\ThemeBuilder\Classes\Locations_Manager $elementor_theme_manager theme manager. * * @return void */ function hello_elementor_register_elementor_locations( $elementor_theme_manager ) { if ( apply_filters( 'hello_elementor_register_elementor_locations', true ) ) { $elementor_theme_manager->register_all_core_location(); } } } add_action( 'elementor/theme/register_locations', 'hello_elementor_register_elementor_locations' ); if ( ! function_exists( 'hello_elementor_content_width' ) ) { /** * Set default content width. * * @return void */ function hello_elementor_content_width() { $GLOBALS['content_width'] = apply_filters( 'hello_elementor_content_width', 800 ); } } add_action( 'after_setup_theme', 'hello_elementor_content_width', 0 ); if ( ! function_exists( 'hello_elementor_add_description_meta_tag' ) ) { /** * Add description meta tag with excerpt text. * * @return void */ function hello_elementor_add_description_meta_tag() { if ( ! apply_filters( 'hello_elementor_description_meta_tag', true ) ) { return; } if ( ! is_singular() ) { return; } $post = get_queried_object(); if ( empty( $post->post_excerpt ) ) { return; } echo '' . "\n"; } } add_action( 'wp_head', 'hello_elementor_add_description_meta_tag' ); // Settings page require get_template_directory() . '/includes/settings-functions.php'; // Header & footer styling option, inside Elementor require get_template_directory() . '/includes/elementor-functions.php'; if ( ! function_exists( 'hello_elementor_customizer' ) ) { // Customizer controls function hello_elementor_customizer() { if ( ! is_customize_preview() ) { return; } if ( ! hello_elementor_display_header_footer() ) { return; } require get_template_directory() . '/includes/customizer-functions.php'; } } add_action( 'init', 'hello_elementor_customizer' ); if ( ! function_exists( 'hello_elementor_check_hide_title' ) ) { /** * Check whether to display the page title. * * @param bool $val default value. * * @return bool */ function hello_elementor_check_hide_title( $val ) { if ( defined( 'ELEMENTOR_VERSION' ) ) { $current_doc = Elementor\Plugin::instance()->documents->get( get_the_ID() ); if ( $current_doc && 'yes' === $current_doc->get_settings( 'hide_title' ) ) { $val = false; } } return $val; } } add_filter( 'hello_elementor_page_title', 'hello_elementor_check_hide_title' ); /** * BC: * In v2.7.0 the theme removed the `hello_elementor_body_open()` from `header.php` replacing it with `wp_body_open()`. * The following code prevents fatal errors in child themes that still use this function. */ if ( ! function_exists( 'hello_elementor_body_open' ) ) { function hello_elementor_body_open() { wp_body_open(); } } require HELLO_THEME_PATH . '/theme.php'; HelloTheme\Theme::instance(); {"id":9,"date":"2026-01-21T18:02:25","date_gmt":"2026-01-21T18:02:25","guid":{"rendered":"https:\/\/derick.freelancerportfolio.me\/?page_id=9"},"modified":"2026-01-22T18:25:32","modified_gmt":"2026-01-22T18:25:32","slug":"elementor-9","status":"publish","type":"page","link":"https:\/\/derick.freelancerportfolio.me\/","title":{"rendered":"Elementor #9"},"content":{"rendered":"\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

im felipe castro<\/h2>\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t\t\r\n\r\n\r\n \r\n \r\n Curved Text Marquee<\/title>\r\n\r\n <!-- Thin + bold Inter -->\r\n <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@100;600&display=swap\" rel=\"stylesheet\">\r\n \r\n <style>\r\n * { box-sizing: border-box; }\r\n\r\n body {\r\n background-color: #111;\r\n margin: 0;\r\n padding: 0;\r\n font-family: 'Inter', sans-serif;\r\n overflow-x: hidden;\r\n }\r\n\r\n .curve-wrapper {\r\n padding: 0;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n min-height: 60vh;\r\n }\r\n\r\n .marquee-container {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n width: 100%;\r\n }\r\n\r\n .marquee {\r\n display: flex;\r\n justify-content: center;\r\n }\r\n\r\n \/* SVG takes whole viewport width; no side gaps *\/\r\n .curved-text {\r\n width: 100vw;\r\n height: 120px;\r\n display: block;\r\n }\r\n\r\n .top-marquee {\r\n margin-bottom: -90px; \/* brings both lines together *\/\r\n }\r\n\r\n \/* TOP TEXT STYLE *\/\r\n .curved-text__inner--top {\r\n fill: #FF4D29;\r\n font-family: 'Inter', sans-serif;\r\n font-size: clamp(2rem, 12vw, 3rem);\r\n font-weight: 100;\r\n letter-spacing: 0.18em;\r\n }\r\n\r\n \/* BOTTOM TEXT STYLE *\/\r\n .curved-text__inner--bottom {\r\n fill: #444;\r\n font-family: 'Inter', sans-serif;\r\n font-size: clamp(0.8rem, 2vw, 1.2rem);\r\n font-weight: 600;\r\n letter-spacing: 0.6em;\r\n text-transform: uppercase;\r\n }\r\n\r\n @media (max-width: 768px) {\r\n .curve-wrapper { padding: 40px 0; }\r\n }\r\n <\/style>\r\n<\/head>\r\n<body>\r\n\r\n <div class=\"curve-wrapper\">\r\n <div class=\"marquee-container\">\r\n \r\n <!-- TOP: DIGITAL PRODUCT DESIGNER, CURVED & MOVING LEFT -->\r\n <div class=\"marquee top-marquee\">\r\n <!-- NOTE: viewBox is wider than viewport; path starts left of screen and ends right of screen -->\r\n <svg class=\"curved-text\" viewBox=\"-200 0 1600 200\" preserveAspectRatio=\"xMidYMid slice\">\r\n <defs>\r\n <!-- Start as lower U-shape (opens down) -->\r\n <path id=\"curvePathTop\" d=\"M -200 40 Q 600 200 1400 40\">\r\n <!-- Flip to arch (opens up) -->\r\n <animate id=\"curveTopToArch\"\r\n attributeName=\"d\"\r\n dur=\"1s\"\r\n fill=\"freeze\"\r\n begin=\"indefinite\"\r\n to=\"M -200 200 Q 600 40 1400 200\" \/>\r\n <!-- Flip back to U-shape -->\r\n <animate id=\"curveTopToU\"\r\n attributeName=\"d\"\r\n dur=\"1s\"\r\n fill=\"freeze\"\r\n begin=\"indefinite\"\r\n to=\"M -200 40 Q 600 200 1400 40\" \/>\r\n <\/path>\r\n <\/defs>\r\n\r\n <text class=\"curved-text__inner--top\">\r\n <textPath href=\"#curvePathTop\" startOffset=\"0%\">\r\n <!-- Continuous movement along curve (left) -->\r\n <animate attributeName=\"startOffset\"\r\n from=\"0%\" to=\"-50%\"\r\n dur=\"20s\"\r\n repeatCount=\"indefinite\" \/>\r\n Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer\r\n <\/textPath>\r\n <\/text>\r\n <\/svg>\r\n <\/div>\r\n\r\n <!-- BOTTOM: MADE IN COLOMBIA..., CURVED & MOVING RIGHT -->\r\n <div class=\"marquee bottom-marquee\">\r\n <svg class=\"curved-text\" viewBox=\"-200 0 1600 200\" preserveAspectRatio=\"xMidYMid slice\">\r\n <defs>\r\n <!-- Same starting U-shape -->\r\n <path id=\"curvePathBottom\" d=\"M -200 40 Q 600 200 1400 40\">\r\n <!-- Flip to arch -->\r\n <animate id=\"curveBottomToArch\"\r\n attributeName=\"d\"\r\n dur=\"1s\"\r\n fill=\"freeze\"\r\n begin=\"indefinite\"\r\n to=\"M -200 200 Q 600 40 1400 200\" \/>\r\n <!-- Flip back to U-shape -->\r\n <animate id=\"curveBottomToU\"\r\n attributeName=\"d\"\r\n dur=\"1s\"\r\n fill=\"freeze\"\r\n begin=\"indefinite\"\r\n to=\"M -200 40 Q 600 200 1400 40\" \/>\r\n <\/path>\r\n <\/defs>\r\n\r\n <text class=\"curved-text__inner--bottom\">\r\n <textPath href=\"#curvePathBottom\" startOffset=\"-50%\">\r\n <!-- Continuous movement along curve (right) -->\r\n <animate attributeName=\"startOffset\"\r\n from=\"-50%\" to=\"0%\"\r\n dur=\"20s\"\r\n repeatCount=\"indefinite\" \/>\r\n MADE IN COLOMBIA \u2022 BASED IN ROTTERDAM \u2022 WORKING \u2022 MADE IN COLOMBIA \u2022 BASED IN ROTTERDAM \u2022 WORKING \u2022 MADE IN COLOMBIA \u2022 BASED IN ROTTERDAM \u2022 WORKING \u2022 MADE IN COLOMBIA \u2022 BASED IN ROTTERDAM \u2022 WORKING \u2022 MADE IN COLOMBIA \u2022 BASED IN ROTTERDAM \u2022 WORKING\r\n <\/textPath>\r\n <\/text>\r\n <\/svg>\r\n <\/div>\r\n\r\n <\/div>\r\n <\/div>\r\n\r\n <script>\r\n \/\/ Flip curves when section enters viewport; flip back when it leaves\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const wrapper = document.querySelector('.curve-wrapper');\r\n\r\n const topToArch = document.getElementById('curveTopToArch');\r\n const topToU = document.getElementById('curveTopToU');\r\n const bottomToArch = document.getElementById('curveBottomToArch');\r\n const bottomToU = document.getElementById('curveBottomToU');\r\n\r\n const io = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.target !== wrapper) return;\r\n\r\n if (entry.isIntersecting) {\r\n \/\/ In view -> flip to arch\r\n topToArch.beginElement();\r\n bottomToArch.beginElement();\r\n } else {\r\n \/\/ Out of view -> flip back to U\r\n topToU.beginElement();\r\n bottomToU.beginElement();\r\n }\r\n });\r\n }, {\r\n threshold: 0.4 \/\/ about 40% of section must be visible\r\n });\r\n\r\n if (wrapper) io.observe(wrapper);\r\n });\r\n <\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4147a73 e-con-full e-flex e-con e-parent\" data-id=\"4147a73\" data-element_type=\"container\" data-settings=\"{"background_background":"classic"}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-81e9ebe elementor-widget elementor-widget-html\" data-id=\"81e9ebe\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\" \/>\r\n <title>Scroll Reveal Heading<\/title>\r\n\r\n <!-- Serif font similar to the example -->\r\n <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:wght@400;600&display=swap\" rel=\"stylesheet\">\r\n\r\n <style>\r\n \/* Demo page setup *\/\r\n * { box-sizing: border-box; }\r\n\r\n h1 {\r\n font-size: clamp(3.5rem, 8vw, 7rem);\r\n line-height: 1.1;\r\n color: #fff;\r\n font-weight: 400;\r\n overflow: hidden;\r\n }\r\n\r\n \/* each line styled like a block heading line *\/\r\n .scroll-reveal-lines .line {\r\n display: block;\r\n opacity: 0;\r\n transform: translateY(40px);\r\n transition:\r\n opacity 0.7s ease-out,\r\n transform 0.7s ease-out;\r\n \/* spacing between the lines *\/\r\n margin-bottom: 0.6em;\r\n }\r\n\r\n \/* line becomes visible when scrolled into view *\/\r\n .scroll-reveal-lines .line.show {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n <\/style>\r\n<\/head>\r\n<body>\r\n\r\n <section class=\"hero\">\r\n <h1 class=\"scroll-reveal-lines\">\r\n <span class=\"line\">I design,<\/span>\r\n <span class=\"line\">I code,<\/span>\r\n <span class=\"line\">I design,<\/span>\r\n <span class=\"line\">I code,<\/span>\r\n <\/h1>\r\n <\/section>\r\n\r\n <script>\r\n \/\/ Reveal each line individually when it reaches the viewport\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const lines = document.querySelectorAll('.scroll-reveal-lines .line');\r\n\r\n const observer = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n entry.target.classList.add('show');\r\n observer.unobserve(entry.target); \/\/ reveal only once per line\r\n }\r\n });\r\n }, {\r\n threshold: 0.6 \/\/ 60% of the line must be visible\r\n });\r\n\r\n lines.forEach(line => observer.observe(line));\r\n });\r\n <\/script>\r\n\r\n<\/body>\r\n<\/html>\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>im felipe castro Curved Text Marquee Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer \u2022 Digital Product Designer MADE IN COLOMBIA \u2022 BASED IN ROTTERDAM \u2022 WORKING \u2022 […]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"open","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-9","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/pages\/9","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":98,"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions"}],"predecessor-version":[{"id":124,"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions\/124"}],"wp:attachment":[{"href":"https:\/\/derick.freelancerportfolio.me\/index.php\/wp-json\/wp\/v2\/media?parent=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}