{"id":229,"date":"2024-12-18T17:37:00","date_gmt":"2024-12-18T17:37:00","guid":{"rendered":"http:\/\/lawyer2.mythemecloud.io\/?p=229"},"modified":"2025-01-30T07:23:19","modified_gmt":"2025-01-30T07:23:19","slug":"conubia-nostra-per-inceptos-himenaeos","status":"publish","type":"post","link":"https:\/\/gabrielgborges.com\/index.php\/2024\/12\/18\/conubia-nostra-per-inceptos-himenaeos\/","title":{"rendered":"Unity &#8211; Zenith Framework"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"229\" class=\"elementor elementor-229\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6466146f e-flex e-con-boxed e-con e-parent\" data-id=\"6466146f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bfffdd0 elementor-widget elementor-widget-html\" data-id=\"bfffdd0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n    \/\/ Select the first MenuAnchor element\n    var firstAnchor = document.querySelector(\"[id^='MenuAnchor']\");\n    \n    \/\/ Check if the element exists before scrolling\n    if (firstAnchor) {\n        firstAnchor.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    }\n});\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-84fe82f elementor-widget elementor-widget-menu-anchor\" data-id=\"84fe82f\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"MenuAnchor\" data-widget_type=\"menu-anchor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-menu-anchor\" id=\"content\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-402fd285 elementor-invisible elementor-widget elementor-widget-text-editor\" data-id=\"402fd285\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A C# project designed to help both new and experienced developers kickstart their projects quickly, while ensuring <strong>scalability, maintainability,<\/strong> and <strong>reliability<\/strong> as their codebase grows, causing less headache to developers, allowing them to code more creatively and faster. Inspired by industry-renowned books like <em>Clean Architecture<\/em>, <em>Clean Code<\/em>, and <em>Game Programming Patterns<\/em>, combined with hands-on experiences from myself and insights from talented friends in the game development industry.<\/p><h2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Making Of: The Story Behind Zenith Framework<\/h2><p data-pm-slice=\"1 1 []\">The idea for the Zenith Framework came to life during the Melbourne Games Week 2024, through engaging conversations with passionate developers, designers, and architects. We discussed Unity best practices, effective game architecture, and C# optimizations. After countless conversations, a clear vision emerged:<\/p><p><strong>What if there was a framework that minimized late-stage project limitations, reduced time spent on refactoring and bug-fixing, and promoted clean, reusable code for long-term scalability?<\/strong><\/p><p data-pm-slice=\"1 1 []\">The result is the Zenith Framework \u2014 a project built to empower developers to focus more on creative problem-solving or features and less on technical debt.<\/p><p data-pm-slice=\"1 1 []\">This project was developed independently using Unity and Rider C# IDE as core tools, with references from Unity documentation and renowned code architecture books. All the architectures were thoughtfully designed using draw.io and refined through invaluable feedback from industry professionals, to whom I am deeply grateful!<\/p><p data-pm-slice=\"1 1 []\">Project: https:\/\/github.com\/gabrielgborges\/zenith-framework<\/p><div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Introduction<\/h2><\/div><div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Why Use Zenith Framework?<\/h3><\/div><p dir=\"auto\">When developing medium-to-large-scale Unity projects, maintaining clean, modular, and scalable code becomes challenging. The Zenith Framework is built on principles derived from\u00a0<em>Clean Architecture<\/em>\u00a0to solve this problem, ensuring:<\/p><ul dir=\"auto\"><li><strong>Rapid Development:<\/strong>\u00a0Start your projects with a solid architecture and\u00a0<strong>ready-to-use systems<\/strong>, reducing the setup time.<\/li><li><strong>Maintainability:<\/strong>\u00a0Easily locate and fix bugs.<\/li><li><strong>Scalability:<\/strong>\u00a0Expand your game systems and add new features without breaking existing functionality.<\/li><li><strong>Reusability:<\/strong>\u00a0Create reusable components that can speed up future projects.<\/li><\/ul><p dir=\"auto\">The framework utilizes\u00a0<strong>Component<\/strong>\u00a0and\u00a0<strong>ServiceLocator<\/strong>\u00a0architectures to keep your code decoupled and flexible. It emphasizes creating modular systems, enabling developers to replace or extend functionality without widespread code changes.<\/p><blockquote><p>Integer lacinia sollicitudin massa. Cras metus. Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis tristique, dignissim in, ultrices sit amet, augue. Proin sodales libero eget ante.<\/p><\/blockquote><div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Core Principles<\/h2><\/div><p dir=\"auto\">Zenith Framework is grounded in these three architectural principles:<\/p><ol dir=\"auto\"><li><p dir=\"auto\"><strong>Common Closure Principle<\/strong>:<\/p><ul dir=\"auto\"><li>Group classes that change for the same reason to simplify maintenance.<\/li><\/ul><\/li><li><p dir=\"auto\"><strong>Common Reuse Principle<\/strong>:<\/p><ul dir=\"auto\"><li>Avoid dependencies on classes you don&#8217;t use.<\/li><\/ul><\/li><li><p dir=\"auto\"><strong>Reuse\/Release Equivalence Principle<\/strong>:<\/p><ul dir=\"auto\"><li>Group classes to maximize reusability and minimize unnecessary coupling.<\/li><\/ul><\/li><\/ol><p dir=\"auto\">These principles ensure that your code remains clean, adaptable, and aligned with industry standards.<\/p><p dir=\"auto\"><a href=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/blob\/main\/DOCUMENTATION\/CleanArchitectureBook.png?raw=true\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/raw\/main\/DOCUMENTATION\/CleanArchitectureBook.png?raw=true\" alt=\"alt text\" \/><\/a><\/p><blockquote><p dir=\"auto\"><em>Reference:<\/em>\u00a0&#8220;Clean Architecture: A Craftsman&#8217;s Guide to Software Structure and Design&#8221; by Robert C. Martin.<\/p><\/blockquote><div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Tip:<\/h3><\/div><p dir=\"auto\">Treat the Zenith Framework like a tool\u2014test it thoroughly before fully integrating it into your project. A long-term relationship starts with a few good dates! \ud83d\ude09<\/p><hr \/><div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Key Concepts and Components<\/h2><\/div><div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">1. Service<\/h3><\/div><p dir=\"auto\">A\u00a0<strong>Service<\/strong>\u00a0is a core system that provides functionality widely used across your game. Examples include:<\/p><ul dir=\"auto\"><li>Object Pooling<\/li><li>VFX Spawner<\/li><li>Time Manager<\/li><li>Screen Manager<\/li><\/ul><p dir=\"auto\"><strong>Why Services?<\/strong>\u00a0Services are accessed via the\u00a0<strong>ServiceLocator<\/strong>\u00a0and use interfaces to enforce limited, controlled access. This design ensures that:<\/p><ul dir=\"auto\"><li>Complex logic can be refactored without affecting dependent code.<\/li><li>Systems remain decoupled for easier maintainability, testing and bugfixing.<\/li><li>Replacement services can be easily swapped in with minimal changes.<\/li><\/ul><p dir=\"auto\"><strong>Example:<\/strong>\u00a0Switching from Asset Bundles to Addressables in your Object Pooling system requires only creating a new implementation of the same interface.<\/p><p dir=\"auto\">Before refactor:<\/p><p dir=\"auto\"><a href=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/blob\/main\/DOCUMENTATION\/Services.png?raw=true\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/raw\/main\/DOCUMENTATION\/Services.png?raw=true\" alt=\"alt text\" \/><\/a><\/p><p dir=\"auto\">After refactor:<\/p><p dir=\"auto\"><a href=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/blob\/main\/DOCUMENTATION\/ServicesNewImplementation.png?raw=true\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/raw\/main\/DOCUMENTATION\/ServicesNewImplementation.png?raw=true\" alt=\"alt text\" \/><\/a><\/p><hr \/><div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">2. Entity<\/h3><\/div><p dir=\"auto\">A\u00a0<strong>Entity<\/strong>\u00a0is a MonoBehaviour that manages events, data, and states within a specific context. It serves as the bridge between the\u00a0<strong>Services<\/strong>\u00a0and\u00a0<strong>Components<\/strong>.<\/p><p dir=\"auto\">Entitys should:<\/p><ul dir=\"auto\"><li>Hold state information relevant to a feature or system.<\/li><li>Act as a hub for other\u00a0<strong>Components<\/strong>\u00a0to update or retrieve state data.<\/li><\/ul><p dir=\"auto\">General application example:<\/p><p dir=\"auto\"><a href=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/blob\/main\/DOCUMENTATION\/GenericApplication.png?raw=true\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/raw\/main\/DOCUMENTATION\/GenericApplication.png?raw=true\" alt=\"alt text\" \/><\/a><\/p><hr \/><div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">3. Component<\/h3><\/div><p dir=\"auto\">A\u00a0<strong>Component<\/strong>\u00a0implements the primary logic of a feature while interacting with Services or Entitys. Components are designed to:<\/p><ul dir=\"auto\"><li>Focus on a single feature per class.<\/li><li>Be reusable across different systems or contexts.<\/li><\/ul><p dir=\"auto\"><strong>Relationships with Entitys:<\/strong><\/p><ol dir=\"auto\"><li>Update the Entity&#8217;s state when necessary.<\/li><li>Implement the features associated with the Entity.<\/li><\/ol><p dir=\"auto\"><a href=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/blob\/main\/DOCUMENTATION\/EntityComponentRelation.png?raw=true\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/github.com\/gabrielgborges\/zenith-framework\/raw\/main\/DOCUMENTATION\/EntityComponentRelation.png?raw=true\" alt=\"alt text\" \/><\/a><\/p><p dir=\"auto\">This separation ensures that changes to a specific feature only affect the associated Component, leaving Entitys and Services intact.<\/p><p dir=\"auto\"><strong>Example:<\/strong>\u00a0A\u00a0<code>HealthComponent<\/code>\u00a0manages the health logic, while the\u00a0<code>HealthEntity<\/code> tracks and communicates health states to other systems.<\/p><hr \/><div class=\"markdown-heading\" dir=\"auto\"><h4 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\">Additional Services<\/h4><\/div><p dir=\"auto\">The Zenith Framework includes additional ready-to-use services such as:<\/p><p dir=\"auto\"><strong>Screen Service<\/strong>: Handle all the instantiation, loading and management of UI Screens inside Unity, decoupling this process.<\/p><p dir=\"auto\"><strong>Event Service<\/strong>: Global event manager that enables decoupled and fast communication between classes in different Assemblies.<\/p><p dir=\"auto\"><strong>Object Pooling<\/strong>: Efficiently reuse objects to reduce memory allocations and improve performance.\u00a0<strong>More Services Coming Soon!<\/strong>\u00a0(Stay tuned for additional services and documentation.)<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c0199ab e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"c0199ab\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeIn&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-015763c elementor-widget elementor-widget-heading\" data-id=\"015763c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">contact<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ee189f elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"3ee189f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ec051da e-con-full e-grid e-con e-child\" data-id=\"ec051da\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-992e229 e-con-full e-flex e-con e-child\" data-id=\"992e229\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e59850d elementor-widget elementor-widget-text-editor\" data-id=\"e59850d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u00a0<\/p><div class=\"elementor-element elementor-element-439cd7c4 elementor-widget elementor-widget-heading\" data-id=\"439cd7c4\" data-element_type=\"widget\" data-widget_type=\"heading.default\"><div class=\"elementor-widget-container\"><h1 class=\"elementor-heading-title elementor-size-default\">Let&#8217;s Get in Touch<\/h1><\/div><\/div><div class=\"elementor-element elementor-element-bfaa58b elementor-widget elementor-widget-text-editor\" data-id=\"bfaa58b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\"><div class=\"elementor-widget-container\"><p>I love to connect with fun and talented people! Please don\u2019t hesitate to get in touch for a no obligations chat about yours or any other project.<\/p><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-161b0a3 elementor-widget elementor-widget-wpforms\" data-id=\"161b0a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"wpforms.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"wpforms-container wpforms-container-full wpforms-render-modern\" id=\"wpforms-1067\"><form id=\"wpforms-form-1067\" class=\"wpforms-validate wpforms-form wpforms-ajax-form\" data-formid=\"1067\" method=\"post\" enctype=\"multipart\/form-data\" action=\"\/index.php\/wp-json\/wp\/v2\/posts\/229\" data-token=\"02d881cda905ec84f7b4e6d7cb5da0a4\" data-token-time=\"1778070801\"><noscript class=\"wpforms-error-noscript\">Please enable JavaScript in your browser to complete this form.<\/noscript><div id=\"wpforms-error-noscript\" style=\"display: none;\">Please enable JavaScript in your browser to complete this form.<\/div><div class=\"wpforms-field-container\"><div id=\"wpforms-1067-field_1-container\" class=\"wpforms-field wpforms-field-name\" data-field-id=\"1\"><input type=\"text\" id=\"wpforms-1067-field_1\" class=\"wpforms-field-medium wpforms-field-required\" name=\"wpforms[fields][1]\" placeholder=\"Name\" aria-errormessage=\"wpforms-1067-field_1-error\" required><\/div>\t\t<div id=\"wpforms-1067-field_4-container\"\n\t\t\tclass=\"wpforms-field wpforms-field-text\"\n\t\t\tdata-field-type=\"text\"\n\t\t\tdata-field-id=\"4\"\n\t\t\t>\n\t\t\t<label class=\"wpforms-field-label\" for=\"wpforms-1067-field_4\" ><\/label>\n\t\t\t<input type=\"text\" id=\"wpforms-1067-field_4\" class=\"wpforms-field-medium\" name=\"wpforms[fields][4]\" >\n\t\t<\/div>\n\t\t<div id=\"wpforms-1067-field_2-container\" class=\"wpforms-field wpforms-field-email\" data-field-id=\"2\"><input type=\"email\" id=\"wpforms-1067-field_2\" class=\"wpforms-field-medium wpforms-field-required\" name=\"wpforms[fields][2]\" placeholder=\"Email\" spellcheck=\"false\" aria-errormessage=\"wpforms-1067-field_2-error\" required><\/div><div id=\"wpforms-1067-field_3-container\" class=\"wpforms-field wpforms-field-textarea\" data-field-id=\"3\"><textarea id=\"wpforms-1067-field_3\" class=\"wpforms-field-medium\" name=\"wpforms[fields][3]\" placeholder=\"Message\" aria-errormessage=\"wpforms-1067-field_3-error\" ><\/textarea><\/div><script>\n\t\t\t\t( function() {\n\t\t\t\t\tconst style = document.createElement( 'style' );\n\t\t\t\t\tstyle.appendChild( document.createTextNode( '#wpforms-1067-field_4-container { position: absolute !important; overflow: hidden !important; display: inline !important; height: 1px !important; width: 1px !important; z-index: -1000 !important; padding: 0 !important; } #wpforms-1067-field_4-container input { visibility: hidden; } #wpforms-conversational-form-page #wpforms-1067-field_4-container label { counter-increment: none; }' ) );\n\t\t\t\t\tdocument.head.appendChild( style );\n\t\t\t\t\tdocument.currentScript?.remove();\n\t\t\t\t} )();\n\t\t\t<\/script><\/div><!-- .wpforms-field-container --><div class=\"wpforms-submit-container\" ><input type=\"hidden\" name=\"wpforms[id]\" value=\"1067\"><input type=\"hidden\" name=\"page_title\" value=\"\"><input type=\"hidden\" name=\"page_url\" value=\"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/posts\/229\"><input type=\"hidden\" name=\"url_referer\" value=\"\"><button type=\"submit\" name=\"wpforms[submit]\" id=\"wpforms-submit-1067\" class=\"wpforms-submit\" data-alt-text=\"Sending...\" data-submit-text=\"Send\" aria-live=\"assertive\" value=\"wpforms-submit\">Send<\/button><img decoding=\"async\" src=\"https:\/\/gabrielgborges.com\/wp-content\/plugins\/wpforms-lite\/assets\/images\/submit-spin.svg\" class=\"wpforms-submit-spinner\" style=\"display: none;\" width=\"26\" height=\"26\" alt=\"Loading\"><\/div><\/form><\/div>  <!-- .wpforms-container -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\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>A C# Unity framework created with the best fundamentals extracted from the &#8216;Clean Architecture &#8211; Robert C. Martin&#8217; and &#8216;Game Programming Patterns &#8211; Robert Nystrom&#8217; books.\u200b<\/p>\n","protected":false},"author":1,"featured_media":905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"0","ocean_second_sidebar":"0","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"0","ocean_custom_header_template":"0","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":103,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":124,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"0","ocean_menu_typo_font_family":"0","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"0","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"off","ocean_gallery_id":[],"footnotes":""},"categories":[14],"tags":[16],"class_list":["post-229","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tricks","tag-tricks","entry","has-media"],"_links":{"self":[{"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/posts\/229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/comments?post=229"}],"version-history":[{"count":30,"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/posts\/229\/revisions"}],"predecessor-version":[{"id":1591,"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/posts\/229\/revisions\/1591"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/media\/905"}],"wp:attachment":[{"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/media?parent=229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/categories?post=229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gabrielgborges.com\/index.php\/wp-json\/wp\/v2\/tags?post=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}