File manager - Edit - /home/opticamezl/www/newok/theme-joomla.zip
Back
PK i��\i <�C C config/theme.jsonnu �[��� { "defaults": { "menu": { "positions": { "navbar": { "menu": "mainmenu" }, "dialog-mobile": { "menu": "mainmenu" } } }, "post": { "width": "default", "padding": "", "content_width": "", "image_align": "top", "image_margin": "medium", "image_width": "", "image_height": "", "header_align": 0, "title_margin": "default", "meta_margin": "default", "meta_style": "sentence", "content_margin": "medium", "content_dropcap": 0 }, "blog": { "width": "default", "padding": "", "grid_column_gap": "", "grid_row_gap": "", "grid_breakpoint": "m", "image_align": "top", "image_margin": "medium", "image_width": "", "image_height": "", "header_align": 0, "title_style": "", "title_margin": "default", "meta_margin": "default", "content_excerpt": 0, "content_length": "", "content_margin": "medium", "content_align": 0, "button_style": "default", "button_margin": "medium", "navigation": "pagination" }, "media_folder": "yootheme", "search_module": "mod_search", "bootstrap": true, "fontawesome": true } } PK i��\!����� �� config/customizer.jsonnu �[��� { "id": "${theme.id}", "title": "${theme.title}", "cookie": "${theme.cookie}", "default": "${theme.default}", "template": "${theme.template}", "admin": "${app.isAdmin}", "root": "${req.baseUrl}", "site": "${req.rootUrl}/index.php", "token": "${session.token}", "sections": { "layout": { "help": [ { "title": "Using the Sidebar", "src": "https://www.youtube-nocookie.com/watch?v=nZm-qEyGaP4&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:55", "documentation": "support/yootheme-pro/joomla/customizer#save,-cancel-and-close", "support": "support/search?tags=125&q=customizer%20save" }, { "title": "Using the Contextual Help", "src": "https://www.youtube-nocookie.com/watch?v=BGgRZvlJVXI&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:37", "documentation": "support/yootheme-pro/joomla/customizer#contextual-help", "support": "support/search?tags=125&q=contextual%20help" }, { "title": "Using the Device Preview Buttons", "src": "https://www.youtube-nocookie.com/watch?v=hGErRJcl9ts&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:42", "documentation": "support/yootheme-pro/joomla/customizer#device-preview-buttons", "support": "support/search?tags=125&q=customizer%20device%20preview" }, { "title": "Hide and Adjust the Sidebar", "src": "https://www.youtube-nocookie.com/watch?v=xzc6tuF500w&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:34", "documentation": "support/yootheme-pro/joomla/customizer#hide-and-adjust-sidebar", "support": "support/search?tags=125&q=customizer%20hide%20sidebar" } ] }, "builder-pages": { "help": { "Pages": [ { "title": "Managing Pages", "src": "https://www.youtube-nocookie.com/watch?v=o20CQhzLP1k&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:57", "documentation": "support/yootheme-pro/joomla/pages", "support": "support/search?tags=125&q=pages%20builder" }, { "title": "Adding a New Page", "src": "https://www.youtube-nocookie.com/watch?v=0VbdT8usYvY&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:25", "documentation": "support/yootheme-pro/joomla/pages#add-a-new-page", "support": "support/search?tags=125&q=page%20builder" }, { "title": "Creating Individual Post Layouts", "src": "https://www.youtube-nocookie.com/watch?v=Fr7dXusK9xI&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "2:22", "documentation": "support/yootheme-pro/joomla/pages#individual-post-layout", "support": "support/search?tags=125&q=post%20builder" } ], "Customizer": [ { "title": "Using the Sidebar", "src": "https://www.youtube-nocookie.com/watch?v=nZm-qEyGaP4&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:55", "documentation": "support/yootheme-pro/joomla/customizer#save,-cancel-and-close", "support": "support/search?tags=125&q=customizer%20save" }, { "title": "Using the Contextual Help", "src": "https://www.youtube-nocookie.com/watch?v=BGgRZvlJVXI&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:37", "documentation": "support/yootheme-pro/joomla/customizer#contextual-help", "support": "support/search?tags=125&q=contextual%20help" }, { "title": "Using the Device Preview Buttons", "src": "https://www.youtube-nocookie.com/watch?v=hGErRJcl9ts&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:42", "documentation": "support/yootheme-pro/joomla/customizer#device-preview-buttons", "support": "support/search?tags=125&q=customizer%20device%20preview" }, { "title": "Hide and Adjust the Sidebar", "src": "https://www.youtube-nocookie.com/watch?v=xzc6tuF500w&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:34", "documentation": "support/yootheme-pro/joomla/customizer#hide-and-adjust-sidebar", "support": "support/search?tags=125&q=customizer%20hide%20sidebar" } ] } }, "builder-templates": { "help": { "Templates": [ { "title": "Managing Templates", "src": "https://www.youtube-nocookie.com/watch?v=tNpo1YYWWas&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:46", "documentation": "support/yootheme-pro/joomla/templates", "support": "support/search?tags=125&q=templates" }, { "title": "Assigning Templates to Pages", "src": "https://www.youtube-nocookie.com/watch?v=d2WX0hGXsDE&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "4:38", "documentation": "support/yootheme-pro/joomla/templates#page-assignment", "support": "support/search?tags=125&q=template%20page%20assigment" }, { "title": "Setting the Template Loading Priority", "src": "https://www.youtube-nocookie.com/watch?v=03aUKEABQNQ&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:41", "documentation": "support/yootheme-pro/joomla/templates#loading-priority", "support": "support/search?tags=125&q=template%20priority" }, { "title": "Setting the Template Status", "src": "https://www.youtube-nocookie.com/watch?v=VxuDCh-NE_U&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:02", "documentation": "support/yootheme-pro/joomla/templates#status", "support": "support/search?tags=125&q=template%20status" } ] } }, "settings": { "help": [ { "title": "Using the Sidebar", "src": "https://www.youtube-nocookie.com/watch?v=nZm-qEyGaP4&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:55", "documentation": "support/yootheme-pro/joomla/customizer#save,-cancel-and-close", "support": "support/search?tags=125&q=customizer%20save" }, { "title": "Using the Contextual Help", "src": "https://www.youtube-nocookie.com/watch?v=BGgRZvlJVXI&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:37", "documentation": "support/yootheme-pro/joomla/customizer#contextual-help", "support": "support/search?tags=125&q=contextual%20help" }, { "title": "Using the Device Preview Buttons", "src": "https://www.youtube-nocookie.com/watch?v=hGErRJcl9ts&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:42", "documentation": "support/yootheme-pro/joomla/customizer#device-preview-buttons", "support": "support/search?tags=125&q=customizer%20device%20preview" }, { "title": "Hide and Adjust the Sidebar", "src": "https://www.youtube-nocookie.com/watch?v=xzc6tuF500w&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:34", "documentation": "support/yootheme-pro/joomla/customizer#hide-and-adjust-sidebar", "support": "support/search?tags=125&q=customizer%20hide%20sidebar" } ] } }, "panels": { "site": { "help": { "Site": [ { "title": "Adding the Logo", "src": "https://www.youtube-nocookie.com/watch?v=UItCS_pSAXA&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "2:25", "documentation": "support/yootheme-pro/joomla/site-and-logo#logo", "support": "support/search?tags=125&q=logo" }, { "title": "Setting the Page Layout", "src": "https://www.youtube-nocookie.com/watch?v=ScYJ-bVJ94s&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:35", "documentation": "support/yootheme-pro/joomla/site-and-logo#layout", "support": "support/search?tags=125&q=site%20layout" }, { "title": "Using the Toolbar", "src": "https://www.youtube-nocookie.com/watch?v=uigKZP3xu-4&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:58", "documentation": "support/yootheme-pro/joomla/site-and-logo#toolbar", "support": "support/search?tags=125&q=toolbar" }, { "title": "Displaying the Breadcrumbs", "src": "https://www.youtube-nocookie.com/watch?v=Eiw_1rf3hHE&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:04", "documentation": "support/yootheme-pro/joomla/site-and-logo#breadcrumbs", "support": "support/search?tags=125&q=breadcrumbs" }, { "title": "Setting the Main Section Height", "src": "https://www.youtube-nocookie.com/watch?v=CDeYl5TIfZQ&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:46", "documentation": "support/yootheme-pro/joomla/site-and-logo#main-section", "support": "support/search?tags=125&q=main%20section" } ], "Image Field": [ { "title": "Using Images", "src": "https://www.youtube-nocookie.com/watch?v=NHpFpn4UiUM&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "4:37", "documentation": "support/yootheme-pro/joomla/files-and-images#images", "support": "support/search?tags=125&q=image%20field" }, { "title": "Using the Media Manager", "src": "https://www.youtube-nocookie.com/watch?v=2Sgp4BBMTc8&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:32", "documentation": "support/yootheme-pro/joomla/files-and-images#media-manager", "support": "support/search?tags=125&q=media%20manager" }, { "title": "Using the Unsplash Library", "src": "https://www.youtube-nocookie.com/watch?v=6piYezAI4dU&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:50", "documentation": "support/yootheme-pro/joomla/files-and-images#unsplash-library", "support": "support/search?tags=125&q=unsplash" } ] } }, "header": { "help": [ { "title": "Setting the Header Layout", "src": "https://www.youtube-nocookie.com/watch?v=5KazxjAM_TA&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "3:51", "documentation": "support/yootheme-pro/joomla/header-and-navbar#header-layout", "support": "support/search?tags=125&q=header%20layout" }, { "title": "Setting the Navbar", "src": "https://www.youtube-nocookie.com/watch?v=oQ1ja29Tl1Y&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:09", "documentation": "support/yootheme-pro/joomla/header-and-navbar#navbar", "support": "support/search?tags=125&q=navbar" }, { "title": "Using the Dropdown Menu", "src": "https://www.youtube-nocookie.com/watch?v=98MdMe3CVFM&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:12", "documentation": "support/yootheme-pro/joomla/header-and-navbar#dropdown", "support": "support/search?tags=125&q=navbar%20dropdown" }, { "title": "Setting the Dialog Layout", "src": "https://www.youtube-nocookie.com/watch?v=UFx8UeiZv04&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "5:07", "documentation": "support/yootheme-pro/joomla/header-and-navbar#dialog-layouts", "support": "support/search?tags=125&q=dialog%20layout" }, { "title": "Adding the Search", "src": "https://www.youtube-nocookie.com/watch?v=rxmuuMeWWoo&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:12", "documentation": "support/yootheme-pro/joomla/header-and-navbar#search", "support": "support/search?tags=125&q=header%20search" }, { "title": "Adding the Social Icons", "src": "https://www.youtube-nocookie.com/watch?v=dlZA9cGlsOg&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:55", "documentation": "support/yootheme-pro/joomla/header-and-navbar#social-icons", "support": "support/search?tags=125&q=header%20social" } ] }, "mobile": { "help": [ { "title": "Displaying the Mobile Header", "src": "https://www.youtube-nocookie.com/watch?v=CDmPjGek9gU&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:59", "documentation": "support/yootheme-pro/joomla/mobile-header#visibility", "support": "support/search?tags=125&q=mobile%20header%20visibility" }, { "title": "Setting the Mobile Header Layout", "src": "https://www.youtube-nocookie.com/watch?v=M7lmXtclWaI&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:43", "documentation": "support/yootheme-pro/joomla/mobile-header#header-layout", "support": "support/search?tags=125&q=mobile%20header%20layout" }, { "title": "Setting the Mobile Navbar", "src": "https://www.youtube-nocookie.com/watch?v=LfmHQnco4_s&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:58", "documentation": "support/yootheme-pro/joomla/mobile-header#navbar", "support": "support/search?tags=125&q=mobile%20header%20navbar" }, { "title": "Setting the Mobile Dialog Layout", "src": "https://www.youtube-nocookie.com/watch?v=dkbYQgttefg&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "4:23", "documentation": "support/yootheme-pro/joomla/mobile-header#dialog-layout", "support": "support/search?tags=125&q=mobile%20dialog%20layouts" }, { "title": "Setting the Mobile Search", "src": "https://www.youtube-nocookie.com/watch?v=KDbITztgtTE&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:59", "documentation": "support/yootheme-pro/joomla/mobile-header#search", "support": "support/search?tags=125&q=mobile%20search" }, { "title": "Adding the Social Icons", "src": "https://www.youtube-nocookie.com/watch?v=uVSjfP4kNqM&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:29", "documentation": "support/yootheme-pro/joomla/mobile-header#social-icons", "support": "support/search?tags=125&q=mobile%20social%20icons" } ] }, "top": { "help": { "Top and Bottom": [ { "title": "Setting the Top and Bottom Positions", "src": "https://www.youtube-nocookie.com/watch?v=aTsFHYaS9Z8&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:42", "documentation": "support/yootheme-pro/joomla/top-bottom-and-sidebar#top-and-bottom", "support": "support/search?tags=125&q=top%20bottom%20position%20settings" } ], "Image Field": [ { "title": "Using Images", "src": "https://www.youtube-nocookie.com/watch?v=NHpFpn4UiUM&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "4:37", "documentation": "support/yootheme-pro/joomla/files-and-images#images", "support": "support/search?tags=125&q=image%20field" }, { "title": "Using the Media Manager", "src": "https://www.youtube-nocookie.com/watch?v=2Sgp4BBMTc8&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:32", "documentation": "support/yootheme-pro/joomla/files-and-images#media-manager", "support": "support/search?tags=125&q=media%20manager" }, { "title": "Using the Unsplash Library", "src": "https://www.youtube-nocookie.com/watch?v=6piYezAI4dU&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:50", "documentation": "support/yootheme-pro/joomla/files-and-images#unsplash-library", "support": "support/search?tags=125&q=unsplash" } ], "Builder": [ { "title": "The Position Element", "src": "https://www.youtube-nocookie.com/watch?v=DsFY9zkG7Vk&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:55", "documentation": "support/yootheme-pro/joomla/system-elements#position-element", "support": "support/search?tags=125&q=position%20element" }, { "title": "Collapsing Layouts", "src": "https://www.youtube-nocookie.com/watch?v=UT6PODf7p3o&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:44", "documentation": "support/yootheme-pro/joomla/collapsing-layouts", "support": "support/search?tags=125&q=collapsing" } ] } }, "sidebar": { "help": { "Sidebar": [ { "title": "Setting the Sidebar Position", "src": "https://www.youtube-nocookie.com/watch?v=_U5BgaiM4RI&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:31", "documentation": "support/yootheme-pro/joomla/top-bottom-and-sidebar#sidebar", "support": "support/search?tags=125&q=sidebar%20position%20settings" } ], "Builder": [ { "title": "The Position Element", "src": "https://www.youtube-nocookie.com/watch?v=DsFY9zkG7Vk&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:55", "documentation": "support/yootheme-pro/joomla/system-elements#position-element", "support": "support/search?tags=125&q=position%20element" }, { "title": "Collapsing Layouts", "src": "https://www.youtube-nocookie.com/watch?v=UT6PODf7p3o&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:44", "documentation": "support/yootheme-pro/joomla/collapsing-layouts", "support": "support/search?tags=125&q=collapsing" } ] } }, "bottom": { "help": { "Top and Bottom": [ { "title": "Setting the Top and Bottom Positions", "src": "https://www.youtube-nocookie.com/watch?v=aTsFHYaS9Z8&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:42", "documentation": "support/yootheme-pro/joomla/top-bottom-and-sidebar#top-and-bottom", "support": "support/search?tags=125&q=top%20bottom%20position%20settings" } ], "Image Field": [ { "title": "Using Images", "src": "https://www.youtube-nocookie.com/watch?v=NHpFpn4UiUM&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "4:37", "documentation": "support/yootheme-pro/joomla/files-and-images#images", "support": "support/search?tags=125&q=image%20field" }, { "title": "Using the Media Manager", "src": "https://www.youtube-nocookie.com/watch?v=2Sgp4BBMTc8&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:32", "documentation": "support/yootheme-pro/joomla/files-and-images#media-manager", "support": "support/search?tags=125&q=media%20manager" }, { "title": "Using the Unsplash Library", "src": "https://www.youtube-nocookie.com/watch?v=6piYezAI4dU&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:50", "documentation": "support/yootheme-pro/joomla/files-and-images#unsplash-library", "support": "support/search?tags=125&q=unsplash" } ], "Builder": [ { "title": "The Position Element", "src": "https://www.youtube-nocookie.com/watch?v=DsFY9zkG7Vk&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:55", "documentation": "support/yootheme-pro/joomla/system-elements#position-element", "support": "support/search?tags=125&q=position%20element" }, { "title": "Collapsing Layouts", "src": "https://www.youtube-nocookie.com/watch?v=UT6PODf7p3o&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:44", "documentation": "support/yootheme-pro/joomla/collapsing-layouts", "support": "support/search?tags=125&q=collapsing" } ] } }, "footer-builder": { "help": { "Footer Builder": [ { "title": "Using the Footer Builder", "src": "https://www.youtube-nocookie.com/watch?v=vcfQUk7uDlQ&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:59", "documentation": "support/yootheme-pro/joomla/footer-builder", "support": "support/search?tags=125&q=footer%20builder" } ], "Builder Module": [ { "title": "Using the Builder Module", "src": "https://www.youtube-nocookie.com/watch?v=msRBkqxnZ18&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:58", "documentation": "support/yootheme-pro/joomla/widgets-and-modules#builder-module", "support": "support/search?tags=125&q=builder%20module" }, { "title": "Creating Advanced Module Layouts", "src": "https://www.youtube-nocookie.com/watch?v=jr09mnXDbIA&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "4:16", "documentation": "support/yootheme-pro/joomla/widgets-and-modules#advanced-layouts", "support": "support/search?tags=125&q=builder%20module" } ] } }, "api-key": { "help": [ { "title": "Updating YOOtheme Pro", "src": "https://www.youtube-nocookie.com/watch?v=ErgFc1Zq9j4&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:20", "documentation": "support/yootheme-pro/joomla/updating", "support": "support/search?tags=125&q=update%20yootheme%20pro" }, { "title": "Setting the Minimum Stability", "src": "https://www.youtube-nocookie.com/watch?v=MOc5vLImCLw&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:47", "documentation": "support/yootheme-pro/joomla/updating#minimum-stability", "support": "support/search?tags=125&q=minimum%20stability" } ] }, "advanced": { "fields": { "child_theme": { "label": "Child Theme", "description": "Select a child theme. Note that different template files will be loaded, and theme settings will be updated respectively. To create a child theme, add a new folder <code>yootheme_NAME</code> in the templates directory, for example <code>yootheme_mytheme</code>.", "type": "select", "options": "${theme.child_themes}" }, "media_folder": { "label": "Media Folder", "description": "This folder stores images that you download when using layouts from the YOOtheme Pro library. It's located inside the Joomla images folder." }, "page_category": { "label": "Page Category", "description": "By default, only uncategorized articles are referred as pages. Alternatively, define articles from a specific category as pages.", "type": "select", "options": [ { "text": "None", "value": "" }, { "evaluate": "yootheme.builder.categories" } ] }, "search_module": { "label": "Search Component", "description": "Select whether the default Search or Smart Search is used by the search module and builder element.", "type": "select", "options": { "Search": "mod_search", "Smart Search": "mod_finder" } }, "com_finder_filter": { "label": "Search Filter", "description": "Select the smart search filter.", "type": "select", "options": [ { "text": "None", "value": "" }, { "evaluate": "yootheme.builder['com_finder.filters']" } ] }, "bootstrap": { "label": "System Assets", "text": "Load Bootstrap", "type": "checkbox" }, "fontawesome": { "text": "Load Font Awesome", "type": "checkbox" }, "jquery": { "description": "Bootstrap is only required when default Joomla template files are loaded, for example for the Joomla frontend editing. Load jQuery to write custom code based on the jQuery JavaScript library.", "text": "Load jQuery", "type": "checkbox" } } }, "about": { "help": [ { "title": "Opening the Changelog", "src": "https://www.youtube-nocookie.com/watch?v=qK4D2RsfBY4&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:05", "documentation": "support/yootheme-pro/joomla/updating#changelog", "support": "support/search?tags=125&q=changelog" } ] }, "system-post": { "title": "Post", "width": 400, "fields": { "post.width": { "label": "Width", "description": "Set the post width. The image and content can't expand beyond this width.", "type": "select", "options": { "X-Small": "xsmall", "Small": "small", "Default": "default", "Large": "large", "X-Large": "xlarge", "Expand": "expand", "None": "" } }, "post.padding": { "label": "Padding", "description": "Set the vertical padding.", "type": "select", "options": { "Default": "", "X-Small": "xsmall", "Small": "small", "Large": "large", "X-Large": "xlarge" } }, "post.padding_remove": { "type": "checkbox", "text": "Remove top padding" }, "post.content_width": { "label": "Content Width", "description": "Set an optional content width which doesn't affect the image.", "type": "select", "options": { "Auto": "", "X-Small": "xsmall", "Small": "small" }, "enable": "post.width != 'xsmall'" }, "post.image_align": { "label": "Image Alignment", "description": "Align the image to the top or place it between the title and the content.", "type": "select", "options": { "Top": "top", "Between": "between" } }, "post.image_margin": { "label": "Image Margin", "description": "Set the top margin if the image is aligned between the title and the content.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" }, "enable": "post.image_align == 'between'" }, "post.image_dimension": { "type": "grid", "description": "Setting just one value preserves the original proportions. The image will be resized and cropped automatically, and where possible, high resolution images will be auto-generated.", "fields": { "post.image_width": { "label": "Image Width", "width": "1-2", "attrs": { "placeholder": "auto", "lazy": true } }, "post.image_height": { "label": "Image Height", "width": "1-2", "attrs": { "placeholder": "auto", "lazy": true } } } }, "post.header_align": { "label": "Alignment", "description": "Align the title and meta text.", "type": "checkbox", "text": "Center the title and meta text" }, "post.title_margin": { "label": "Title Margin", "description": "Set the top margin.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" } }, "post.meta_margin": { "label": "Meta Margin", "description": "Set the top margin.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" } }, "post.meta_style": { "label": "Meta Style", "description": "Display the meta text in a sentence or a horizontal list.", "type": "select", "options": { "List": "list", "Sentence": "sentence" } }, "post.content_margin": { "label": "Content Margin", "description": "Set the top margin.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" } }, "post.content_dropcap": { "label": "Drop Cap", "description": "Set a large initial letter that drops below the first line of the first paragraph.", "type": "checkbox", "text": "Show drop cap" } }, "help": { "Post": [ { "title": "Setting the Post Layout", "src": "https://www.youtube-nocookie.com/watch?v=pb9MCdJOz7U&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:48", "documentation": "support/yootheme-pro/joomla/blog-and-post#post-layout", "support": "support/search?tags=125&q=post" }, { "title": "Setting the Post Image", "src": "https://www.youtube-nocookie.com/watch?v=6EZtYya-gEY&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:54", "documentation": "support/yootheme-pro/joomla/blog-and-post#post-image", "support": "support/search?tags=125&q=post" }, { "title": "Setting the Post Content", "src": "https://www.youtube-nocookie.com/watch?v=R-d6cuP0l9Y&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:50", "documentation": "support/yootheme-pro/joomla/blog-and-post#post-content", "support": "support/search?tags=125&q=post" } ], "Creating Individual Post Layouts": [ { "title": "Creating Individual Post Layouts", "src": "https://www.youtube-nocookie.com/watch?v=Fr7dXusK9xI&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "2:22", "documentation": "support/yootheme-pro/joomla/pages#individual-post-layout", "support": "support/search?tags=125&q=builder" } ] } }, "system-blog": { "title": "Blog", "width": 400, "fields": { "blog.width": { "label": "Width", "description": "Set the blog width.", "type": "select", "options": { "Default": "default", "Small": "small", "Large": "large", "X-Large": "xlarge", "Expand": "expand" } }, "blog.padding": { "label": "Padding", "description": "Set the vertical padding.", "type": "select", "options": { "Default": "", "X-Small": "xsmall", "Small": "small", "Large": "large", "X-Large": "xlarge" } }, "blog.grid_column_gap": { "label": "Column Gap", "description": "Set the size of the gap between the grid columns. Define the number of columns in the <a href=\"index.php?option=com_config&view=component&component=com_content#blog_default_parameters\">Blog/Featured Layout</a> settings in Joomla.", "type": "select", "options": { "Small": "small", "Medium": "medium", "Default": "", "Large": "large", "None": "collapse" } }, "blog.grid_row_gap": { "label": "Row Gap", "description": "Set the size of the gap between the grid rows.", "type": "select", "options": { "Small": "small", "Medium": "medium", "Default": "", "Large": "large", "None": "collapse" } }, "blog.grid_breakpoint": { "label": "Breakpoint", "description": "Set the breakpoint from which grid items will stack.", "type": "select", "options": { "Small (Phone Landscape)": "s", "Medium (Tablet Landscape)": "m", "Large (Desktop)": "l", "X-Large (Large Screens)": "xl" } }, "blog.grid_masonry": { "label": "Masonry", "description": "The masonry effect creates a layout free of gaps even if grid items have different heights. ", "type": "checkbox", "text": "Enable masonry effect" }, "blog.grid_parallax": { "label": "Parallax", "description": "The parallax animation moves single grid columns at different speeds while scrolling. Define the vertical parallax offset in pixels.", "type": "range", "attrs": { "min": 0, "max": 600, "step": 10 } }, "blog.image_align": { "label": "Image Alignment", "description": "Align the image to the top or place it between the title and the content.", "type": "select", "options": { "Top": "top", "Between": "between" } }, "blog.image_margin": { "label": "Image Margin", "description": "Set the top margin if the image is aligned between the title and the content.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" }, "enable": "blog.image_align == 'between'" }, "blog.image_dimension": { "type": "grid", "description": "Setting just one value preserves the original proportions. The image will be resized and cropped automatically, and where possible, high resolution images will be auto-generated.", "fields": { "blog.image_width": { "label": "Image Width", "width": "1-2", "attrs": { "placeholder": "auto", "lazy": true } }, "blog.image_height": { "label": "Image Height", "width": "1-2", "attrs": { "placeholder": "auto", "lazy": true } } } }, "blog.header_align": { "label": "Alignment", "description": "Align the title and meta text as well as the continue reading button.", "type": "checkbox", "text": "Center the title, meta text and button" }, "blog.title_style": { "label": "Title Style", "description": "Title styles differ in font-size but may also come with a predefined color, size and font.", "type": "select", "options": { "None": "", "H1": "h1", "H2": "h2", "H3": "h3", "H4": "h4" } }, "blog.title_margin": { "label": "Title Margin", "description": "Set the top margin.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" } }, "blog.meta_margin": { "label": "Meta Margin", "description": "Set the top margin.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" } }, "blog.content_length": { "label": "Content Length", "description": "Limit the content length to a number of characters. All HTML elements will be stripped.", "type": "number", "attrs": { "placeholder": "No limit." } }, "blog.content_margin": { "label": "Content Margin", "description": "Set the top margin.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" } }, "blog.content_align": { "label": "Content Alignment", "type": "checkbox", "text": "Center the content" }, "blog.button_style": { "label": "Button", "description": "Select a style for the continue reading button.", "type": "select", "options": { "Default": "default", "Primary": "primary", "Secondary": "secondary", "Danger": "danger", "Text": "text" } }, "blog.button_margin": { "label": "Button Margin", "description": "Set the top margin.", "type": "select", "options": { "Small": "small", "Default": "default", "Medium": "medium", "Large": "large", "X-Large": "xlarge", "None": "remove" } }, "blog.navigation": { "label": "Navigation", "description": "Use a numeric pagination or previous/next links to move between blog pages.", "type": "select", "options": { "Pagination": "pagination", "Previous/Next": "previous/next" } }, "blog.pagination_startend": { "type": "checkbox", "text": "Show Start/End links", "show": "blog.navigation == 'pagination'" } }, "help": { "Blog": [ { "title": "Setting the Blog Layout", "src": "https://www.youtube-nocookie.com/watch?v=ZFRieS43jv8&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "2:14", "documentation": "support/yootheme-pro/joomla/blog-and-post#blog-layout", "support": "support/search?tags=125&q=blog" }, { "title": "Setting the Blog Image", "src": "https://www.youtube-nocookie.com/watch?v=vCx5khrkzuc&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:54", "documentation": "support/yootheme-pro/joomla/blog-and-post#blog-image", "support": "support/search?tags=125&q=blog" }, { "title": "Setting the Blog Content", "src": "https://www.youtube-nocookie.com/watch?v=h6zX_rMe1K4&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:05", "documentation": "support/yootheme-pro/joomla/blog-and-post#blog-content", "support": "support/search?tags=125&q=blog" }, { "title": "Setting the Blog Navigation", "src": "https://www.youtube-nocookie.com/watch?v=mT0hItNR4C8&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "0:18", "documentation": "support/yootheme-pro/joomla/blog-and-post#blog-navigation", "support": "support/search?tags=125&q=navigation" }, { "title": "Displaying the Excerpt", "src": "https://www.youtube-nocookie.com/watch?v=96pqkDnG74g&list=PLrqT0WH0HPdPfykSwhMt6Jl2_RgJ6ixU-", "duration": "1:14", "documentation": "support/yootheme-pro/joomla/blog-and-post#excerpt", "support": "support/search?tags=125&q=excerpt" } ] } } } } PK i��\��E�� � bootstrap.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Version; use YOOtheme\Config; use YOOtheme\Theme\SystemCheck as BaseSystemCheck; use YOOtheme\Theme\Updater; use YOOtheme\Theme\ViewHelper as BaseViewHelper; use YOOtheme\View; return [ 'theme' => function (Config $config) { $config->set('theme.styles.vars.@internal-joomla-version', (string) Version::MAJOR_VERSION); return $config->loadFile(__DIR__ . '/config/theme.json'); }, 'routes' => [ ['get', '/customizer', [CustomizerController::class, 'index'], ['customizer' => true]], ['post', '/customizer', [CustomizerController::class, 'save']], ], 'events' => [ 'app.request' => [Listener\CheckUserPermission::class => '@handle'], 'url.resolve' => [Listener\AddCustomizeParameter::class => '@handle'], 'theme.head' => [ Listener\LoadThemeI18n::class => '@handle', Listener\LoadFontAwesome::class => '@handle', ], 'theme.init' => [ Listener\LoadViewsObject::class => ['@handle', 20], Listener\AddPageCategory::class => ['@handle', 10], Listener\LoadChildTheme::class => ['@handle', -10], Listener\LoadCustomizerSession::class => ['@handle', -20], ], 'customizer.init' => [ Listener\LoadCustomizer::class => ['@handle', 10], Listener\LoadCustomizerScript::class => ['@handle', 30], Listener\LoadChildThemeNames::class => ['@handle', 20], ], 'config.save' => [ Listener\AlterParamsColumnType::class => '@handle', Listener\SaveInstallerApiKey::class => '@handle', ], 'styler.imports' => [Listener\LoadStylerImports::class => '@handle'], // Joomla 3.x only (see ViewsObject) 'view.init' => [ Listener\LoadTemplate::class => ['@handle', -10], Listener\LoadChildThemeTemplate::class => '@handle', ], ], 'actions' => [ 'onAfterRoute' => [ThemeLoader::class => ['initTheme', 50]], 'onBeforeDisplay' => [ Listener\LoadTemplate::class => ['@handle', -10], Listener\LoadChildThemeTemplate::class => '@handle', ], 'onLoadTemplate' => [ Listener\AddPageLayout::class => '@handle', Listener\LoadAssets::class => ['@handle', -20], Listener\LoadConfigCache::class => ['@handle', -20], ], 'onAfterDispatch' => [ Listener\LoadConfigCache::class => '@load', Listener\LoadThemeHead::class => '@handle', Listener\LoadChildThemeConfig::class => '@handle', ], 'onBeforeCompileHead' => [Listener\LoadCustomizerData::class => '@handle'], 'onContentPrepareData' => [Listener\LoadCustomizerContext::class => '@handle'], 'onAfterCleanModuleList' => [ Listener\AddSiteUrl::class => '@handle', Listener\LoadChildThemeModules::class => ['@handle', -5], ], ], 'extend' => [ View::class => function (View $view, $app) { $view->addLoader([UrlLoader::class, 'resolveRelativeUrl']); $view->addLoader($app(PositionLoader::class), '~theme/templates/position'); $view->addFunction('trans', [Text::class, '_']); $view->addFunction( 'formatBytes', fn($bytes, $precision = 0) => HTMLHelper::_( 'number.bytes', $bytes, 'auto', $precision, ), ); // cleanImageURL shim for Joomla 3.x if (version_compare(JVERSION, '4.0', '<')) { HTMLHelper::register('cleanImageURL', fn($url) => (object) ['url' => $url]); } }, Updater::class => function (Updater $updater) { $updater->add(__DIR__ . '/updates.php'); }, ], 'services' => [ ThemeLoader::class => '', BaseViewHelper::class => ViewHelper::class, BaseSystemCheck::class => SystemCheck::class, Listener\AddCustomizeParameter::class => '', ], 'loaders' => [ 'theme' => [ThemeLoader::class, 'load'], ], ]; PK i��\o��n n updates.phpnu �[��� <?php namespace YOOtheme; use Joomla\Database\DatabaseDriver; return [ '3.0.0-beta.1.5' => function ($config) { /** @var DatabaseDriver $db */ $db = app(DatabaseDriver::class); $modules = $db->setQuery('SELECT id, params FROM `#__modules`')->loadObjectList(); foreach ($modules as $module) { $params = json_decode($module->params); if (empty($params->yoo_config)) { continue; } $conf = json_decode($params->yoo_config, true); Arr::updateKeys($conf, ['menu_style' => 'menu_type']); $params->yoo_config = json_encode($conf); $module->params = json_encode($params); $db->updateObject('#__modules', $module, 'id'); } return $config; }, '2.8.0-beta.0.4' => function ($config) { Arr::updateKeys($config, ['menu.positions.mobile' => 'menu.positions.dialog-mobile']); /** @var DatabaseDriver $db */ $db = app(DatabaseDriver::class); $db->setQuery( "UPDATE `#__modules` SET position = {$db->quote( 'dialog-mobile', )} WHERE client_id=0 AND position = {$db->quote('mobile')}", )->execute(); return $config; }, '2.8.0-beta.0.1' => function ($config, array $params) { if (preg_match('/(offcanvas|modal)/', Arr::get($params['config'], 'header.layout'))) { Arr::updateKeys($config, ['menu.positions.navbar' => 'menu.positions.dialog']); // Ensure empty instead of default value Arr::set($config, 'menu.positions.navbar', ''); /** @var DatabaseDriver $db */ $db = app(DatabaseDriver::class); $db->setQuery( "UPDATE `#__modules` SET position = {$db->quote( 'dialog', )} WHERE client_id=0 AND position = {$db->quote('navbar')}", )->execute(); } // Check child theme's "theme.js" for jQuery if ( !empty($config['child_theme']) && !isset($config['jquery']) && ($contents = @file_get_contents( $params['app'](Config::class)->get('theme.rootDir') . "_{$config['child_theme']}/js/theme.js", )) && str_contains($contents, 'jQuery') ) { $config['jquery'] = true; } return $config; }, '1.20.0-beta.6' => function ($config) { // Deprecated Blog settings if (!Arr::has($config, 'post.image_margin')) { Arr::set($config, 'post.title_margin', 'large'); Arr::set($config, 'blog.title_margin', 'large'); if (Arr::get($config, 'post.content_width') === true) { Arr::set($config, 'post.content_width', 'small'); } if (Arr::get($config, 'post.content_width') === false) { Arr::set($config, 'post.content_width', ''); } if (Arr::get($config, 'post.header_align') === true) { Arr::set($config, 'blog.header_align', 1); } } return $config; }, ]; PK i��\�� �3 3 src/ThemeLoader.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; use Joomla\CMS\Application\CMSApplication; use Joomla\Database\DatabaseDriver; use Joomla\Registry\Registry; use YOOtheme\Application; use YOOtheme\Arr; use YOOtheme\Config; use YOOtheme\Container; use YOOtheme\Event; use YOOtheme\Path; use YOOtheme\Theme\Updater; class ThemeLoader { protected static $configs = []; /** * Load theme configurations. */ public static function load(Container $container, array $configs) { static::$configs = array_merge(static::$configs, $configs); } /** * Initialize current theme. */ public static function initTheme(Application $app, Config $config) { $template = static::getTemplate($app); // is template active? if (!empty($template->params['yootheme'])) { static::loadConfiguration($app, $config, $template); Event::emit('theme.init'); } } protected static function loadConfiguration(Application $app, Config $config, object $template) { // get theme config $themeConfig = $template->params->get('config', ''); $themeConfig = json_decode($themeConfig, true) ?: []; // load child theme config if (!empty($themeConfig['child_theme'])) { $app->load( Path::get( "~/templates/{$template->template}_{$themeConfig['child_theme']}/config.php", ), ); } // add configurations $config->add('theme', [ 'id' => $template->id, 'active' => true, 'default' => !empty($template->home), 'template' => $template->template, ]); foreach (static::$configs as $conf) { if ($conf instanceof \Closure) { $conf = $conf($config, $app); } $config->add('theme', (array) $conf); } // handle empty config if (empty($themeConfig)) { $themeConfig['version'] = $config('theme.version'); } // merge defaults with configuration $config->set( '~theme', Arr::merge( $config('theme.defaults', []), static::updateConfig($app, $template, $themeConfig), ), ); } /** * Gets the current template. * * @return object|null */ protected static function getTemplate(Application $app) { /** @var CMSApplication $joomla */ $joomla = $app(CMSApplication::class); $template = $joomla->getTemplate(true); // get site template if ($joomla->isClient('administrator')) { $view = $joomla->input->getCmd('view') === 'style'; $option = $joomla->input->getCmd('option') === 'com_templates'; $style = $joomla->input->getInt($view && $option ? 'id' : 'templateStyle'); /** @var DatabaseDriver $db */ $db = $app(DatabaseDriver::class); $query = 'SELECT * FROM #__template_styles WHERE ' . ($style ? "id = {$style}" : "client_id = 0 AND home = '1'"); if ($template = $db->setQuery($query)->loadObject()) { $template->params = new Registry($template->params); } } return $template; } protected static function updateConfig(Application $app, object $template, array $themeConfig) { /** @var Updater $updater */ $updater = $app(Updater::class); $version = $themeConfig['version'] ?? null; $themeConfig = $updater->update($themeConfig, ['app' => $app, 'config' => $themeConfig]); if (empty($version) || $version !== $themeConfig['version']) { $style = (object) [ 'id' => $template->id, 'params' => json_encode( [ 'config' => json_encode( $themeConfig, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES, ), ] + $template->params->toArray(), ), ]; /** @var DatabaseDriver $db */ $db = $app(DatabaseDriver::class); $db->updateObject('#__template_styles', $style, 'id'); } return $themeConfig; } } PK i��\��dc� � src/StreamWrapper.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; class StreamWrapper { /** * @var resource|null * @link https://github.com/phpspec/phpspec/pull/1435 */ public $context; /** * @var array|false */ protected $stat; /** * @var int */ protected $length; /** * @var int */ protected $position; /** * @var string */ protected $output; /** * @var string[] */ protected static $outputs = []; /** * @var callable[] */ protected static $objects = []; /** * Retrieve information about a file. */ public function url_stat($path) { if (is_callable($object = static::getObject($path))) { static::setOutput($path, $object($path)); } if (is_string($output = static::getOutput($path))) { return static::getStat($output); } return false; } /** * Function to open file or url */ public function stream_open($path) { if (!is_string($output = static::getOutput($path))) { return false; } $this->stat = static::getStat($output); $this->length = strlen($output); $this->position = 0; $this->output = $output; return true; } /** * Read stream */ public function stream_read($count) { $result = substr($this->output, $this->position, $count); $this->position += $count; return $result; } /** * Retrieve information about a file resource */ public function stream_stat() { return $this->stat; } /** * Function to get the current position of the stream */ public function stream_tell() { return $this->position; } /** * Function to test for end of file pointer */ public function stream_eof() { return $this->position >= $this->length; } /** * The read write position updates in response to $offset and $whence */ public function stream_seek($offset, $whence) { switch ($whence) { case \SEEK_SET: if ($offset < $this->length && $offset >= 0) { $this->position = $offset; return true; } break; case \SEEK_CUR: if ($offset >= 0) { $this->position += $offset; return true; } break; case \SEEK_END: if ($this->length + $offset >= 0) { $this->position = $this->length + $offset; return true; } break; } return false; } /** * Change stream options */ public function stream_set_option() { return true; } /** * Sets a object */ public static function setObject($object) { $key = spl_object_hash($object); static::$objects[$key] = $object; return $key; } /** * Gets an object */ protected static function getObject($path) { $path = substr($path, strpos($path, '://') + 3); foreach (static::$objects as $key => $object) { if (str_starts_with($path, $key)) { return $object; } } return null; } /** * Sets an output */ protected static function setOutput($path, $output) { if (is_string($output)) { $output = var_export($output, true); $output = "<?php echo $output;"; } static::$outputs[$path] = $output; } /** * Gets an output */ protected static function getOutput($path) { return static::$outputs[$path] ?? null; } /** * Retrieve file information for a string */ protected static function getStat($string) { $time = time(); $length = strlen($string); return [ 'dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 1, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $length, 'atime' => $time, 'mtime' => $time, 'ctime' => $time, 'blksize' => '512', 'blocks' => ceil($length / 512), ]; } } PK i��\gB� src/PositionLoader.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; use Joomla\CMS\Factory; use YOOtheme\Application; use YOOtheme\Config; use YOOtheme\Joomla\Platform; class PositionLoader { public Application $app; public Config $config; public function __construct(Application $app, Config $config) { $this->app = $app; $this->config = $config; } /** * Add assets for Joomla progressive caching. */ public function __invoke(string $name, array $parameters, callable $next) { $result = $next($name, $parameters); // Make assets cacheable (e.g. maps.min.js) if ((int) Factory::getApplication()->get('caching', 0) === 2) { $this->app->call([Platform::class, 'registerAssets']); } return $result; } } PK i��\R!�= = src/SystemCheck.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; use Joomla\CMS\Component\ComponentHelper; use Joomla\Database\DatabaseDriver; use YOOtheme\Theme\SystemCheck as BaseSystemCheck; use function YOOtheme\trans; class SystemCheck extends BaseSystemCheck { protected ApiKey $apiKey; protected DatabaseDriver $db; /** * Constructor. */ public function __construct(DatabaseDriver $db, ApiKey $apiKey) { $this->db = $db; $this->apiKey = $apiKey; } /** * @inheritdoc */ public function getRequirements() { $res = []; // Check for debug mode if (constant('JDEBUG')) { $res[] = trans( 'The System debug mode generates too much session data which can lead to unexpected behavior. Disable the debug mode.', ); } // Check for SEBLOD Plugin and setting $components = ComponentHelper::getComponents(); $cck = $components['com_cck'] ?? false; if ($cck && $cck->enabled == 1) { if ($cck->getParams()->get('hide_edit_icon')) { $res[] = trans( 'The SEBLOD plugin causes the builder to be unavailable. Disable the feature <em>Hide Edit Icon</em> in the <a href="index.php?option=com_config&view=component&component=com_cck" target="_blank">SEBLOD configuration</a>.', ); } } try { // Check for RSFirewall settings @TODO check if enabled? $rsfw = $this->db ->setQuery( sprintf( 'SELECT value FROM #__rsfirewall_configuration WHERE name = %s', $this->db->quote('verify_emails'), ), ) ->loadResult(); if ($rsfw == 1) { $res[] = trans( 'The RSFirewall plugin corrupts the builder content. Disable the feature <em>Convert email addresses from plain text to images</em> in the <a href="index.php?option=com_rsfirewall&view=configuration" target="_blank">RSFirewall configuration</a>.', ); } } catch (\Exception $e) { } return array_merge($res, parent::getRequirements()); } protected function hasApiKey() { return $this->apiKey->get(); } } PK i��\�Mڑ� � src/CustomizerController.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; use Joomla\CMS\Application\CMSApplication; use Joomla\CMS\Document\Document; use Joomla\CMS\Document\HtmlDocument; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\User\User; use Joomla\Database\DatabaseDriver; use YOOtheme\Config; use YOOtheme\Event; use YOOtheme\Http\Request; use YOOtheme\Path; use YOOtheme\Url; class CustomizerController { public static function index( Request $request, User $user, Config $config, Document $document, CMSApplication $joomla ) { $request->abortIf(!$document instanceof HtmlDocument, 400, 'Bad Request'); HTMLHelper::_('behavior.keepalive'); // init customizer Event::emit('customizer.init'); // init config $config->add('customizer', [ 'config' => $config('~theme'), 'return' => $request->getQueryParam('return') ?: Url::to('administrator/index.php'), ]); // api key editable? if ( !$user->authorise('core.edit', 'com_installer') || !$user->authorise('core.manage', 'com_installer') ) { $config->del('customizer.sections.settings.fields.settings.items.api-key'); } // set system template $joomla->set('theme', 'system'); $joomla->input->set('tmpl', 'component'); // set document title/icon $document->setTitle("Website Builder - {$joomla->get('sitename')}"); $document->addFavicon(Url::to(Path::get('../assets/images/favicon.png', __DIR__))); $document->setBuffer('<div id="customizer"></div>', [ 'type' => 'component', 'name' => null, 'title' => null, ]); } public static function save(Request $request, User $user, Config $config, DatabaseDriver $db) { $request->abortIf( !$user->authorise('core.edit', 'com_templates'), 403, 'Insufficient User Rights.', ); // get config values $values = Event::emit('config.save|filter', $request->getParam('config', [])); // fetch current style params $params = $db ->setQuery( sprintf('SELECT params FROM #__template_styles WHERE id = %d', $config('theme.id')), ) ->loadResult(); // prepare style params $params = ['config' => json_encode($values, JSON_UNESCAPED_SLASHES)] + (json_decode($params, true) ?: []); // update style params $style = (object) [ 'id' => $config('theme.id'), 'params' => json_encode($params, JSON_UNESCAPED_SLASHES), ]; $db->updateObject('#__template_styles', $style, 'id'); return 'success'; } } PK i��\�ջy� � src/ViewsObject.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; use Joomla\CMS\MVC\Controller\BaseController; use Joomla\Event\Event as JoomlaEvent; use YOOtheme\Event; /** * Only needed for Joomla 3.x because it has no "onBeforeDisplay" event. */ class ViewsObject extends \ArrayObject { /** * Returns the value at the specified index. * * @param string $index * * @return mixed */ #[\ReturnTypeWillChange] public function offsetGet($index) { if (!$this->offsetExists($index)) { $this->offsetSet($index, new \ArrayObject()); } $views = parent::offsetGet($index); foreach ($views['html'] ?? [] as $view) { Event::emit('view.init', new JoomlaEvent('onBeforeDisplay', ['subject' => $view])); } return $views; } /** * Register views object as cache array. * * @return void */ public static function register() { $class = new \ReflectionClass(BaseController::class); if ($class->hasProperty('views')) { $views = $class->getProperty('views'); $views->setAccessible(true); $views->setValue(new self()); } } } PK i��\]p& & src/ApiKey.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla; use Joomla\Database\DatabaseDriver; class ApiKey { public const ELEMENT = 'pkg_yootheme'; protected DatabaseDriver $db; /** * Constructor. */ public function __construct(DatabaseDriver $db) { $this->db = $db; } public function get(): string { $updateSite = $this->getUpdateSite(static::ELEMENT); parse_str($updateSite->extra_query ?? '', $params); return $params['key'] ?? ''; } public function set($key): void { $key = "key={$key}"; $updateSite = $this->getUpdateSite(static::ELEMENT); if ($updateSite && $updateSite->extra_query !== $key) { $query = $this->db ->getQuery(true) ->update('#__update_sites') ->set("extra_query = {$this->db->quote($key)}") ->where("update_site_id = {$updateSite->update_site_id}"); $this->db->setQuery($query)->execute(); } } protected function getUpdateSite( $element, $type = 'package', $folder = '', $clientId = 0 ): ?object { $query = $this->db ->getQuery(true) ->select(['us.update_site_id', 'us.extra_query']) ->from('#__extensions AS e') ->innerJoin('#__update_sites_extensions AS se ON e.extension_id = se.extension_id') ->innerJoin('#__update_sites AS us ON se.update_site_id = us.update_site_id') ->where([ "e.type = {$this->db->quote($type)}", "e.folder = {$this->db->quote($folder)}", "e.element = {$this->db->quote($element)}", "e.client_id = {$clientId}", ]); return $this->db->setQuery($query)->loadObject(); } } PK i��\*k�I� � src/Listener/LoadFontAwesome.phpnu �[��� <?php namespace YOOtheme\Theme\Joomla\Listener; use YOOtheme\Config; use YOOtheme\Metadata; class LoadFontAwesome { public Config $config; public Metadata $metadata; public function __construct(Config $config, Metadata $metadata) { $this->config = $config; $this->metadata = $metadata; } public function handle(): void { if (version_compare(JVERSION, '4.0', '<') || !$this->config->get('~theme.fontawesome')) { return; } $this->metadata->set('style:fontawesome', [ 'href' => '~/media/system/css/joomla-fontawesome.min.css', 'defer' => true, ]); } } PK i��\`w� � &