Jerusalem
Account created on 4 April 2009, almost 17 years ago
  • Drupal developer - Never fast enough at Linnovate 
#

Merge Requests

More

Recent comments

🇮🇱Israel heyyo Jerusalem

I really think it's not a good option.
- LCP image should be eager even better not set at all, with fetchpriority=high
- All other canvas images should be lazy loaded (except images from like the branding logo that should be eager)

It should be easy in CMS to set eager (and fetchpriority=high) to all Hero SDC.

Also by setting eager to all images, another problem will come up if I'm not mistaken.
The property sizes="auto" won't work anymore, because it's effective only for lazy loaded images. So all eager images loaded by Browser will be 100vw on any device.
https://github.com/whatwg/html/pull/8008

🇮🇱Israel heyyo Jerusalem

I suppose this issue could be handled now :-)

🇮🇱Israel heyyo Jerusalem

But it looks like, it's already configured properly in latest CMS 2.x RC

Other things could be optimized,

all hero images should have `fetchpriority=high` in addition to eager
and images should be using AVIF not webp

But the lighthouse results are already great !

🇮🇱Israel heyyo Jerusalem

In my opinion, by default any prop images should be lazy loaded, except those at top of the page, so like any Hero, it should be eager, or not set at all, which is the same.
But this lazy option should be configurable/overridable in any prop image, like even if someone put an hero in the middle of the page(makes really little sense) he can override this value.

🇮🇱Israel heyyo Jerusalem

Just tested this MR inside Canvas 1.0.3 and Drupal 11.3.2, it works great !

Bold, italic, underline, links are working now.
Copy paste of text with HTML new lines (p, br, ul, li...) are converted into \n !
Also no class or any other attributes are copied into HTML, so loks super clean.

Awesome work Lauri ! Thanks for working on this

Tested with this prop

props:
  type: object
  required:
    - text
    - level
  properties:
    text:
      type: string
      title: Heading Text
      description: >
        The heading text.
      default: "Welcome to Linno"
      contentMediaType: text/html
      x-formatting-context: inline
      examples: ["Welcome to Linno"]
🇮🇱Israel heyyo Jerusalem

I’ll admit I missed that point—as #10 mentioned, the browser is 'lazy' and usually waits for the CSS to resolve before it actually triggers the font download, even with an inline declaration.

But I still think inlining is a big win for Core. It’s not just a 'Lighthouse trick'; it’s about earlier resource discovery. If the @font-face is buried in an external CSS file, the browser is flying blind until that file is fetched and parsed. Inlining hands the browser the 'map' instantly so it can pull the trigger the millisecond the CSS resolves.

To really nail it, we should be layering all three:

Early Hints: Starts the fetch while the server is still 'thinking' (before the first byte of HTML).

Preload: A backup 'high priority' instruction in the HTML. This is crucial because some CDNs or proxies still strip out Early Hint headers, so we need the preload in the HTML to ensure the browser doesn't go back to being 'lazy.'

Inlined @font-face: Tells the CSS engine how to use the file the moment the CSS is ready.

🇮🇱Israel heyyo Jerusalem
🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

Wouah it was quick !
I tested locally, and it did the job. I was able to set number of revisions for Canvas page to keep only 3.

After running cron, my older revisions of my canvas pages were gone !
Also I checked the presence of logs in watchdog

So it looks good to me, but maybe to ask canvas to developer to verify everything is expected.

🇮🇱Israel heyyo Jerusalem

This error is triggered only if no text to image model is set in Ai Settings page

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

What about using an ? icon to show/hide description like Gin provides.
Now my forms are quite cluttered with all the descriptions
Attached video

🇮🇱Israel heyyo Jerusalem

It can happen on any page, for example here what I see on Canvas edition page during the auto-save callback.
I also have a lot of modules

Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException: Circular reference detected for service "router.route_provider", path: "options_request_listener -> router.route_provider -> path_processor_manager -> simple_sitemap.engines.path_processor -> simple_sitemap.engines.index_now_submitter -> http_client -> http_client_factory -> GuzzleHttp\HandlerStack -> http_client_middleware.raven -> raven.request_subscriber -> logger.raven -> modeler_api.service". in Drupal\Component\DependencyInjection\Container->get() (line 147 of /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php).

Full trace if it can help

#0 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('router.route_pr...', 1)
#1 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#2 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'modeler_api.ser...')
#3 /var/www/html/web/modules/contrib/modeler_api/src/Plugin/ModelerApiModelOwner/ModelOwnerBase.php(59): Drupal\Component\DependencyInjection\Container->get('modeler_api.ser...')
#4 /var/www/html/web/core/lib/Drupal/Core/Plugin/Factory/ContainerFactory.php(21): Drupal\modeler_api\Plugin\ModelerApiModelOwner\ModelOwnerBase::create(Object(Drupal\Core\DependencyInjection\Container), Array, 'ai_agents_agent', Array)
#5 /var/www/html/web/core/lib/Drupal/Component/Plugin/PluginManagerBase.php(85): Drupal\Core\Plugin\Factory\ContainerFactory->createInstance('ai_agents_agent', Array)
#6 /var/www/html/web/modules/contrib/modeler_api/src/Plugin/ModelOwnerPluginManager.php(61): Drupal\Component\Plugin\PluginManagerBase->createInstance('ai_agents_agent')
#7 /var/www/html/web/modules/contrib/modeler_api/src/Hook/EntityHooks.php(62): Drupal\modeler_api\Plugin\ModelOwnerPluginManager->getAllInstances(true)
#8 /var/www/html/web/core/lib/Drupal/Core/Entity/EntityTypeManager.php(118): Drupal\modeler_api\Hook\EntityHooks->entityTypeBuild(Array)
#9 /var/www/html/web/core/lib/Drupal/Core/Extension/ModuleHandler.php(357): Drupal\Core\Entity\EntityTypeManager->{closure:Drupal\Core\Entity\EntityTypeManager::findDefinitions():117}(Array, 'modeler_api')
#10 /var/www/html/web/core/lib/Drupal/Core/Entity/EntityTypeManager.php(117): Drupal\Core\Extension\ModuleHandler->invokeAllWith('entity_type_bui...', Object(Closure))
#11 /var/www/html/web/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php(216): Drupal\Core\Entity\EntityTypeManager->findDefinitions()
#12 /var/www/html/web/core/lib/Drupal/Component/Plugin/Discovery/DiscoveryCachedTrait.php(25): Drupal\Core\Plugin\DefaultPluginManager->getDefinitions()
#13 /var/www/html/web/core/lib/Drupal/Core/Entity/EntityTypeManager.php(132): Drupal\Core\Plugin\DefaultPluginManager->getDefinition('user_role', false)
#14 /var/www/html/web/modules/contrib/trash/src/TrashEntityTypeManager.php(71): Drupal\Core\Entity\EntityTypeManager->getDefinition('user_role')
#15 /var/www/html/web/modules/contrib/trash/src/TrashEntityTypeManager.php(59): Drupal\trash\TrashEntityTypeManager->getHandler('user_role', 'storage')
#16 /var/www/html/web/core/lib/Drupal/Core/Session/UserRolesAccessPolicy.php(24): Drupal\trash\TrashEntityTypeManager->getStorage('user_role')
#17 /var/www/html/web/core/lib/Drupal/Core/Session/AccessPolicyProcessor.php(107): Drupal\Core\Session\UserRolesAccessPolicy->calculatePermissions(Object(Drupal\Core\Session\AnonymousUserSession), 'drupal')
#18 /var/www/html/web/core/lib/Drupal/Core/Session/PermissionChecker.php(17): Drupal\Core\Session\AccessPolicyProcessor->processAccessPolicies(Object(Drupal\Core\Session\AnonymousUserSession))
#19 /var/www/html/web/core/lib/Drupal/Core/Session/UserSession.php(125): Drupal\Core\Session\PermissionChecker->hasPermission('send logs to se...', Object(Drupal\Core\Session\AnonymousUserSession))
#20 /var/www/html/web/core/lib/Drupal/Core/Session/AccountProxy.php(121): Drupal\Core\Session\UserSession->hasPermission('send logs to se...')
#21 /var/www/html/web/modules/contrib/raven/src/Logger/Raven.php(130): Drupal\Core\Session\AccountProxy->hasPermission('send logs to se...')
#22 /var/www/html/web/modules/contrib/raven/src/Logger/Raven.php(72): Drupal\raven\Logger\Raven->getClient()
#23 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(259): Drupal\raven\Logger\Raven->__construct(Object(Drupal\Core\Config\ConfigFactory), Object(Drupal\Core\Logger\LogMessageParser), 'prod', Object(Drupal\Core\Session\AccountProxy), Object(Symfony\Component\HttpFoundation\RequestStack), Object(Drupal\Core\Site\Settings), Object(Symfony\Component\EventDispatcher\EventDispatcher), Object(Drupal\raven\Integration\RequestFetcher))
#24 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'logger.raven')
#25 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('logger.raven', 1)
#26 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#27 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'raven.request_s...')
#28 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('raven.request_s...', 1)
#29 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#30 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'http_client_mid...')
#31 /var/www/html/web/core/lib/Drupal/Core/Http/HandlerStackConfigurator.php(65): Drupal\Component\DependencyInjection\Container->get('http_client_mid...')
#32 /var/www/html/web/core/lib/Drupal/Core/Http/HandlerStackConfigurator.php(83): Drupal\Core\Http\HandlerStackConfigurator->initializeMiddlewares()
#33 [internal function]: Drupal\Core\Http\HandlerStackConfigurator->configure(Object(GuzzleHttp\HandlerStack))
#34 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(299): call_user_func(Array, Object(GuzzleHttp\HandlerStack))
#35 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'GuzzleHttp\\Hand...')
#36 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('GuzzleHttp\\Hand...', 1)
#37 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#38 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'http_client_fac...')
#39 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('http_client_fac...', 1)
#40 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(249): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#41 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'http_client')
#42 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('http_client', 1)
#43 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#44 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'simple_sitemap....')
#45 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('simple_sitemap....', 1)
#46 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#47 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'simple_sitemap....')
#48 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('simple_sitemap....', 1)
#49 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(273): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#50 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'path_processor_...')
#51 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('path_processor_...', 1)
#52 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#53 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'router.route_pr...')
#54 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('router.route_pr...', 1)
#55 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#56 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'options_request...')
#57 /var/www/html/web/core/lib/Drupal/Componen<?php
Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException: Circular reference detected for service "router.route_provider", path: "options_request_listener -> router.route_provider -> path_processor_manager -> simple_sitemap.engines.path_processor -> simple_sitemap.engines.index_now_submitter -> http_client -> http_client_factory -> GuzzleHttp\HandlerStack -> http_client_middleware.raven -> raven.request_subscriber -> logger.raven -> modeler_api.service". in Drupal\Component\DependencyInjection\Container->get() (line 147 of /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php).
?>

Full trace if it can help

<code>#0 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('router.route_pr...', 1)
#1 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#2 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'modeler_api.ser...')
#3 /var/www/html/web/modules/contrib/modeler_api/src/Plugin/ModelerApiModelOwner/ModelOwnerBase.php(59): Drupal\Component\DependencyInjection\Container->get('modeler_api.ser...')
#4 /var/www/html/web/core/lib/Drupal/Core/Plugin/Factory/ContainerFactory.php(21): Drupal\modeler_api\Plugin\ModelerApiModelOwner\ModelOwnerBase::create(Object(Drupal\Core\DependencyInjection\Container), Array, 'ai_agents_agent', Array)
#5 /var/www/html/web/core/lib/Drupal/Component/Plugin/PluginManagerBase.php(85): Drupal\Core\Plugin\Factory\ContainerFactory->createInstance('ai_agents_agent', Array)
#6 /var/www/html/web/modules/contrib/modeler_api/src/Plugin/ModelOwnerPluginManager.php(61): Drupal\Component\Plugin\PluginManagerBase->createInstance('ai_agents_agent')
#7 /var/www/html/web/modules/contrib/modeler_api/src/Hook/EntityHooks.php(62): Drupal\modeler_api\Plugin\ModelOwnerPluginManager->getAllInstances(true)
#8 /var/www/html/web/core/lib/Drupal/Core/Entity/EntityTypeManager.php(118): Drupal\modeler_api\Hook\EntityHooks->entityTypeBuild(Array)
#9 /var/www/html/web/core/lib/Drupal/Core/Extension/ModuleHandler.php(357): Drupal\Core\Entity\EntityTypeManager->{closure:Drupal\Core\Entity\EntityTypeManager::findDefinitions():117}(Array, 'modeler_api')
#10 /var/www/html/web/core/lib/Drupal/Core/Entity/EntityTypeManager.php(117): Drupal\Core\Extension\ModuleHandler->invokeAllWith('entity_type_bui...', Object(Closure))
#11 /var/www/html/web/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php(216): Drupal\Core\Entity\EntityTypeManager->findDefinitions()
#12 /var/www/html/web/core/lib/Drupal/Component/Plugin/Discovery/DiscoveryCachedTrait.php(25): Drupal\Core\Plugin\DefaultPluginManager->getDefinitions()
#13 /var/www/html/web/core/lib/Drupal/Core/Entity/EntityTypeManager.php(132): Drupal\Core\Plugin\DefaultPluginManager->getDefinition('user_role', false)
#14 /var/www/html/web/modules/contrib/trash/src/TrashEntityTypeManager.php(71): Drupal\Core\Entity\EntityTypeManager->getDefinition('user_role')
#15 /var/www/html/web/modules/contrib/trash/src/TrashEntityTypeManager.php(59): Drupal\trash\TrashEntityTypeManager->getHandler('user_role', 'storage')
#16 /var/www/html/web/core/lib/Drupal/Core/Session/UserRolesAccessPolicy.php(24): Drupal\trash\TrashEntityTypeManager->getStorage('user_role')
#17 /var/www/html/web/core/lib/Drupal/Core/Session/AccessPolicyProcessor.php(107): Drupal\Core\Session\UserRolesAccessPolicy->calculatePermissions(Object(Drupal\Core\Session\AnonymousUserSession), 'drupal')
#18 /var/www/html/web/core/lib/Drupal/Core/Session/PermissionChecker.php(17): Drupal\Core\Session\AccessPolicyProcessor->processAccessPolicies(Object(Drupal\Core\Session\AnonymousUserSession))
#19 /var/www/html/web/core/lib/Drupal/Core/Session/UserSession.php(125): Drupal\Core\Session\PermissionChecker->hasPermission('send logs to se...', Object(Drupal\Core\Session\AnonymousUserSession))
#20 /var/www/html/web/core/lib/Drupal/Core/Session/AccountProxy.php(121): Drupal\Core\Session\UserSession->hasPermission('send logs to se...')
#21 /var/www/html/web/modules/contrib/raven/src/Logger/Raven.php(130): Drupal\Core\Session\AccountProxy->hasPermission('send logs to se...')
#22 /var/www/html/web/modules/contrib/raven/src/Logger/Raven.php(72): Drupal\raven\Logger\Raven->getClient()
#23 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(259): Drupal\raven\Logger\Raven->__construct(Object(Drupal\Core\Config\ConfigFactory), Object(Drupal\Core\Logger\LogMessageParser), 'prod', Object(Drupal\Core\Session\AccountProxy), Object(Symfony\Component\HttpFoundation\RequestStack), Object(Drupal\Core\Site\Settings), Object(Symfony\Component\EventDispatcher\EventDispatcher), Object(Drupal\raven\Integration\RequestFetcher))
#24 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'logger.raven')
#25 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('logger.raven', 1)
#26 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#27 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'raven.request_s...')
#28 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('raven.request_s...', 1)
#29 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#30 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'http_client_mid...')
#31 /var/www/html/web/core/lib/Drupal/Core/Http/HandlerStackConfigurator.php(65): Drupal\Component\DependencyInjection\Container->get('http_client_mid...')
#32 /var/www/html/web/core/lib/Drupal/Core/Http/HandlerStackConfigurator.php(83): Drupal\Core\Http\HandlerStackConfigurator->initializeMiddlewares()
#33 [internal function]: Drupal\Core\Http\HandlerStackConfigurator->configure(Object(GuzzleHttp\HandlerStack))
#34 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(299): call_user_func(Array, Object(GuzzleHttp\HandlerStack))
#35 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'GuzzleHttp\\Hand...')
#36 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('GuzzleHttp\\Hand...', 1)
#37 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#38 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'http_client_fac...')
#39 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('http_client_fac...', 1)
#40 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(249): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#41 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'http_client')
#42 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('http_client', 1)
#43 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#44 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'simple_sitemap....')
#45 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('simple_sitemap....', 1)
#46 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#47 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'simple_sitemap....')
#48 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('simple_sitemap....', 1)
#49 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(273): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#50 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'path_processor_...')
#51 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('path_processor_...', 1)
#52 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#53 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'router.route_pr...')
#54 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(430): Drupal\Component\DependencyInjection\Container->get('router.route_pr...', 1)
#55 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(237): Drupal\Component\DependencyInjection\Container->resolveServicesAndParameters(Array)
#56 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(177): Drupal\Component\DependencyInjection\Container->createService(Array, 'options_request...')
#57 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(454): Drupal\Component\DependencyInjection\Container->get('options_request...', 1)
#58 /var/www/html/vendor/symfony/event-dispatcher/EventDispatcher.php(243): Drupal\Component\DependencyInjection\Container->{closure:Drupal\Component\DependencyInjection\Container::resolveServicesAndParameters():453}()
#59 /var/www/html/vendor/symfony/event-dispatcher/EventDispatcher.php(206): Symfony\Component\EventDispatcher\EventDispatcher::{closure:Symfony\Component\EventDispatcher\EventDispatcher::optimizeListeners():241}(Object(Symfony\Component\HttpKernel\Event\RequestEvent), 'kernel.request', Object(Symfony\Component\EventDispatcher\EventDispatcher))
#60 /var/www/html/vendor/symfony/event-dispatcher/EventDispatcher.php(56): Symfony\Component\EventDispatcher\EventDispatcher->callListeners(Array, 'kernel.request', Object(Symfony\Component\HttpKernel\Event\RequestEvent))
#61 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(159): Symfony\Component\EventDispatcher\EventDispatcher->dispatch(Object(Symfony\Component\HttpKernel\Event\RequestEvent), 'kernel.request')
#62 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(76): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#63 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/Session.php(53): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#64 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#65 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ContentLength.php(28): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#66 /var/www/html/web/core/modules/big_pipe/src/StackMiddleware/ContentLength.php(32): Drupal\Core\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#67 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(116): Drupal\big_pipe\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#68 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(90): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#69 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(48): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#70 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#71 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/AjaxPageState.php(53): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#72 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/StackedHttpKernel.php(51): Drupal\Core\StackMiddleware\AjaxPageState->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#73 /var/www/html/web/core/lib/Drupal/Core/DrupalKernel.php(715): Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#74 /var/www/html/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#75 {main}

t/DependencyInjection/Container.php(454): Drupal\Component\DependencyInjection\Container->get('options_request...', 1)
#58 /var/www/html/vendor/symfony/event-dispatcher/EventDispatcher.php(243): Drupal\Component\DependencyInjection\Container->{closure:Drupal\Component\DependencyInjection\Container::resolveServicesAndParameters():453}()
#59 /var/www/html/vendor/symfony/event-dispatcher/EventDispatcher.php(206): Symfony\Component\EventDispatcher\EventDispatcher::{closure:Symfony\Component\EventDispatcher\EventDispatcher::optimizeListeners():241}(Object(Symfony\Component\HttpKernel\Event\RequestEvent), 'kernel.request', Object(Symfony\Component\EventDispatcher\EventDispatcher))
#60 /var/www/html/vendor/symfony/event-dispatcher/EventDispatcher.php(56): Symfony\Component\EventDispatcher\EventDispatcher->callListeners(Array, 'kernel.request', Object(Symfony\Component\HttpKernel\Event\RequestEvent))
#61 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(159): Symfony\Component\EventDispatcher\EventDispatcher->dispatch(Object(Symfony\Component\HttpKernel\Event\RequestEvent), 'kernel.request')
#62 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(76): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#63 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/Session.php(53): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#64 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#65 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ContentLength.php(28): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#66 /var/www/html/web/core/modules/big_pipe/src/StackMiddleware/ContentLength.php(32): Drupal\Core\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#67 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(116): Drupal\big_pipe\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#68 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(90): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#69 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(48): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#70 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#71 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/AjaxPageState.php(53): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#72 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/StackedHttpKernel.php(51): Drupal\Core\StackMiddleware\AjaxPageState->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#73 /var/www/html/web/core/lib/Drupal/Core/DrupalKernel.php(715): Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#74 /var/www/html/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#75 {main}

🇮🇱Israel heyyo Jerusalem

I also see this error time to time on Drupal 11.2.8, ECA 3.0.7 , modeler_api 1.0.5

🇮🇱Israel heyyo Jerusalem

Any country that needs to communicate in multiple languages needs it.
In Israel, there at least 5 languages, RTL & LTR: Hebrew, Arabic, Russian, French, Spanish

🇮🇱Israel heyyo Jerusalem

This issue becomes really painful when the 404 page is a canvas page, where URL variation is infinite so could not be handled by just Drupal Page cache alone.

🇮🇱Israel heyyo Jerusalem

We also see long time passed in the rendering of TWIG field--component-tree.html.twig
After digging with Sentry, we are able to see that most of the time is passed on the validation of props with JSON Schema.
Caching this will really help, maybe some other fine tuning could be applied on this validation too.


In those screenshots, the request is on a canvas page, which is our 404 page, so this page displays all 404 urls. Unfortunately caused by another bug canvas pages are Uncacheable by Dynamic page cache 🐛 Canvas pages are uncacheable Active .

🇮🇱Israel heyyo Jerusalem

Relevant tags are important !

🇮🇱Israel heyyo Jerusalem

@tim.plunkett sure I wasn't aware of this workflow :-)

🇮🇱Israel heyyo Jerusalem

Also wanted to mention, this warning is displayed in the chat, only if my php.ini is configured to display error with display_errors = "On" even if Drupal is configured not to display any message in admin/config/development/logging.

🇮🇱Israel heyyo Jerusalem

Thank you I just tested your last MR, it's working nicely now.

🇮🇱Israel heyyo Jerusalem

There was a lot of work made to allow the evolution of a SDC with existing content, like adding, renaming, deleting props required or not
Look at this issue, a Mr is still in progress
https://www.drupal.org/project/canvas/issues/3532514 🐛 Deleting or renaming SDC prop will break xb pages using old version of the component Active

🇮🇱Israel heyyo Jerusalem
🇮🇱Israel heyyo Jerusalem

With the last orchestrator, I got an error when placing any SDC on a blank page without any components on it.
reference_uuid is not set

<br/><b>Warning</b>:  Undefined array key "reference_uuid" in <b>/var/www/html/web/modules/contrib/canvas/modules/canvas_ai/src/CanvasAiPageBuilderHelper.php</b> on line <b>800</b><br/>{
    "status": true,
    "operations": [
        {
            "operation": "ADD",
            "components": [
                {
                    "id": "sdc.linno_theme.container",
                    "nodePath": [
                        0,
                        0
                    ],
                    "fieldValues": {
                        "padding_top": "pt-50",
                        "padding_bottom": "pb-50"
                    }
                },

🇮🇱Israel heyyo Jerusalem

+1
We should also add available pattern to this list.

🇮🇱Israel heyyo Jerusalem

Thanks for the update @f.mazeikis,

I checked the MR!196, I confirm, I can now edit the previous version of my component which received new props !
But nothing indicates, it's an outdated version. I don't remember which issue is about this ?

🇮🇱Israel heyyo Jerusalem

Usually developers just describes what the prop is, but content editors may need more explanation:
- like max length max of string,
- tones to use in a textarea,

We had a client who wanted to be able to edit all fields/content type description, in case of a misuse, so those description became content with a module we built !
Like this if editors were making mistakes on how fill in content, their admin were able to improve those descriptions.

And LLM needs another sort of guidance i'm thinking about the slot restrictions as an example:
https://project.pages.drupalcode.org/canvas/ai-assistant/#restrictions-o...

But for AI we still have the way to override those descriptions in Drupal UI, but in my opinion it's less practical as developer to optimize those contexts.

🇮🇱Israel heyyo Jerusalem

I'm just mentioning those descriptions have at least 2 usages today:
- describe the props/slots for developers
- describe the props/slots for LLM for better usage in Canvas AI

Most of the time, the way we write them will be different according those 2 targets.

And adding a third target: "canvas editor" will complicate even more the situation.

🇮🇱Israel heyyo Jerusalem

I had this issue, when the div containing the slot is using display: flex

🇮🇱Israel heyyo Jerusalem

Don't forget we also use those props/slots descriptions as AI context.

🇮🇱Israel heyyo Jerusalem

Any plan to support media audio file too ?

🇮🇱Israel heyyo Jerusalem

Getting this issue too. All group are not collapsible, even Open Graph which has an arrow that indicates collapsed is open.
Video attached to illustrate the bug more clearly

🇮🇱Israel heyyo Jerusalem

I was reading the readme from the MR, it looks like the agent/assistant is outdated if I'm not mistaken.

I think the latest approach was to create first an assistant with rag selected. Saving this assistant will create automatically the agent with RAG search as a tool.

Some questions I had during this process:

1. I learn that I have to resave the generated Agent manually, if not I had this issue after saving changes the assistant.

Schema errors for ai_agents.ai_agent.content_drupal_assistant with the following errors: ai_agents.ai_agent.content_drupal_assistant:tool_settings variable type is NULL but applied schema class is Drupal\Core\Config\Schema\Sequence. These errors mean there is configuration that does not comply with its schema. This is not a fatal error, but it is recommended to fix these issues. For more information on configuration schemas, check out <a href="https://www.drupal.org/docs/drupal-apis/configuration-api/configuration-schemametadata">the documentation</a>.

2. It isn't clear to me how to handle the search into multiples content types from a chatbot.
Should I use one index with multiple content types.
Or multiple indices, if it's the best option, how to do it ? The assistant Rag option, handles only one index, if i'm not mistaken.

3. Also not clear to me how to structure the prompt/instructions in the agent, specially for formatting, usage of contextual, and filterable attributes. for example how to tell llm to deal will multilang content, or search by date(recent, in the future for event...)

4. Also during the configuration of the index of the fields, it was pretty clear what to use and why
- for Main content. Only body field, aggregated field of several fields (which ones ?), or rendered output
- for Contextual content. Not clear what the purpose of this, and How it's used by assistant. Can we use it in the instruction ? how to formulate ?
- for filterable attributes, same question than contextual content

5. Pick vector DB. In slack, I remember lots of people preferred Postgresql over Milvus. But other saw a lot of potential with Solr.
could be nice to have best use cases for each supported provider.

PS: Sorry if there is a lot of newby questions in my comment...

🇮🇱Israel heyyo Jerusalem

The MR didn't helped.
The Search recipe doesn't configure and doesn't place the simple_search_form block.

So I suppose it may be a Canvas bug, that should probably catch those errors, most of blocks are un-configured before being placed.

🇮🇱Israel heyyo Jerusalem
🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

heyyo made their first commit to this issue’s fork.

🇮🇱Israel heyyo Jerusalem

I just checked we have the same issue with canvas-demo.

But do we really need to add this conditional slot functionality, at least to allow multiple columns ?

We can do it differently, we can have a SDC container which has one slot for all columns.
and SDC child column. And no need to ask the editor how many columns he needs.

If he inserts 3 children, there will be 3 columns

🇮🇱Israel heyyo Jerusalem

Thanks for working on this issue, here my test results.

Missing component
- I deleted the whole SDC folder
- Cleared Drupal cache

ᯓ➤ Edition of the page and of the missing component is possible !
* We can clearly understand it was there before, restore it if possible, or remove it . Awesome 😎

ᯓ➤ Front page is also working, and shows an Oops message where was the component

* Restoring the folder, and clearing the drupal cache fixed the situation as expected.

Adding a New prop
- I added a new prop to an existing sdc already used in a canvas page
- Cleared Drupal cache

ᯓ➤ Edition of the page is working.
* I didn't see any change in UI, the SDC shown in edition is previous one (without new prop)
Remark: It would be great if there was a way to "migrate" to new version, without retyping/reconfiguring all props.

Making this new prop required +
- Make this exact same new prop required
- Clearing drupal cache

ᯓ➤ Edition of the page is working, but shows an error on first load

<b>Warning</b>:  Undefined array key "examples" in <b>/var/www/html/web/modules/contrib/canvas/src/Plugin/Canvas/ComponentSource/GeneratedFieldExplicitInputUxComponentSourceBase.php</b> on line <b>932</b><br>
<br>
<b>Warning</b>:  Trying to access array offset on null in <b>/var/www/html/web/modules/contrib/canvas/src/Plugin/Canvas/ComponentSource/GeneratedFieldExplicitInputUxComponentSourceBase.php</b> on line <b>932</b><br>

ᯓ➤ After second load, the component is visible in the tree(sidebar)
* We can also edit it.
* But rendering is broken

ᯓ➤ Front page is also working, and shows a warning at top and Oops message where was the component

Warning: Trying to access array offset on null in /var/www/html/web/modules/contrib/canvas/src/Plugin/Canvas/ComponentSource/GeneratedFieldExplicitInputUxComponentSourceBase.php on line 932

Removing a prop
- I removed a prop from a SDC already used in canvas page
- Cleared Drupal cache

ᯓ➤ Edition of the page is working.
* We can edit the SDC without issue,
* We even see deleted prop, edition of this old prop is working.
* No issue after saving the canvas page !

ᯓ➤ Front page is also working after saving the old version of SDC

🇮🇱Israel heyyo Jerusalem

What about renaming the tabs to
-Valid components
-Invalid components

In valid components, add a column status, which will show disabled or enabled.
Adding a checkbox for bulk operation will be awesome...

🇮🇱Israel heyyo Jerusalem

Not sure what is the missing part, but even after enabling the Datetime Range module, I still see this 500 error.
I still can't list components in Canvas interface.

🇮🇱Israel heyyo Jerusalem
🇮🇱Israel heyyo Jerusalem

you are right, I didn't pay attention it needs this module.

I understand this is a test module, but it's a great resources for SDC developers to learn about all available prop types and how to use them, by the way mentioned this module in the SDC user guide https://project.pages.drupalcode.org/canvas/sdc-components/props/#additi...

Concerning this error, I suppose it will be enough to add a dependency to this module.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

Not sure to understand why HTML tag br should not be part of inline element too ?
It could be really useful to support such design.

Here

Start you Drupal journey

is one heading on 2 lines, with emphasis on the word Drupal.

The twig could be of this form
<h2>Start your<br><em>Drupal</em> journey</h2>

So it will make totally sense to have one inline HTML prop with CKEditor support to be able to add the emphasis or strong, and to add line break (br)

For now CKEditor is not used.

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem
🇮🇱Israel heyyo Jerusalem

📻 🎶Let's tune back to Radio Canvas !🎶

MR is in the tube ! 🧪

🇮🇱Israel heyyo Jerusalem

heyyo changed the visibility of the branch 3538340-add-documentation-for to hidden.

🇮🇱Israel heyyo Jerusalem

I remember I had trouble to add a SDC without prop, until I found it's not enough to not add the props key, but instead we need to declare an empty props structure.

https://www.drupal.org/docs/develop/theming-drupal/using-single-director...

props:
  type: object
  properties: {}

Maybe that's the issue @Laurii encountered

🇮🇱Israel heyyo Jerusalem

I don't think we should assume, uploading an image, means creates a code component.
This image could be used as an example of creating a page, or even used in an existing component.
What about to force prompt text, if there is an uploaded image ?

🇮🇱Israel heyyo Jerusalem

It looks like, work in this previous issue wasn't enough
https://www.drupal.org/project/experience_builder/issues/3528368 🐛 Add warning if XB is installed from drupal config but without xb_stark Active

🇮🇱Israel heyyo Jerusalem

I tried to make this user guide as interesting as I could for an XB beginner.

Feel free to improve it, and correct all my language mistakes 📝

🇮🇱Israel heyyo Jerusalem

heyyo made their first commit to this issue’s fork.

🇮🇱Israel heyyo Jerusalem

I can share my experience with Extend (modules listing).
In my configuration, with Gin as admin theme, the INP is really bad with latest Drupal 11.X.
The search input could be completely stuck for 20 seconds, just after typing one extra character or removing one. I did the same test with Claro it went down to 2 or 3 seconds stuck, still really bad.
With this patch, search for module is instant, but initial INP is little bit high. ( with the patch I made, before knowing about this issue 🐛 Extend: Filter modules list by search strings could be stuck Active , the first INP was good too, to be checked)

  • 2 Videos attached with Gin about modules filtering without patch and with patch.
  • And one video containing all parts listed by Nic also in Gin module (5.0.3). All my tests were succesfull
🇮🇱Israel heyyo Jerusalem

I confirm similar speed with the patch of the issue you mentioned and my patch. Both are filtering instantly.
I tested in Claro and in Gin too, where this slowness is really more visible ( 2s for Claro, 18s for Gin when adding/removing character)
So no doubt my issue could be closed.

🇮🇱Israel heyyo Jerusalem

In this video I'm showing before vs after patch (from 0:50s)
its' look like I do nothing in the video after typing gro but I typed on on my keyboard, Drupal is just stuck from more or less 10 to 18 seconds

🇮🇱Israel heyyo Jerusalem

I confirm, that margin-top/margin-block issue is fixed with the other issue:
https://www.drupal.org/project/experience_builder/issues/3534490 🐛 Cannot use `h-screen` from Tailwind with XB Active

🇮🇱Israel heyyo Jerusalem

Your MR definitely helps !
3 times faster 🔥

🇮🇱Israel heyyo Jerusalem

Yes my test was against 0.x, but after I saw another issue on the same bug, didn't test it yet.
https://www.drupal.org/project/experience_builder/issues/3534490 🐛 Cannot use `h-screen` from Tailwind with XB Active

Can you share that SDC (or point me towards somewhere it lives in a repo)?

It's a local playground for now, still unsure to contribute.
But it's a custom theme with daisyui/tailwind, and this bug appears just by applying the tailwind class mt-{y} or my-{y}
which sets only margin-top or margin-block, nothing related to height of the container.
I didn't test outside tailwind, to see we have the same issue

🇮🇱Israel heyyo Jerusalem

I wonder if we can make use of a meta property on slots in the definition to flag a slot as inline?

Will be great

🇮🇱Israel heyyo Jerusalem

In terms of the space, this is needed for the sake of drop-targets. I guess we could hide that unless something was being dragged but that might make dropping difficult if when drag start occurs we added back collapsed/empty slots

When editing, for sure we need to keep displaying slots.
But my issue is about after clicking Preview, in this case I think empty slots shouldn't take any space

🇮🇱Israel heyyo Jerusalem

I experienced the same bug, just by setting margin-top, or margin-block (but not margin-bottom).
Video attached.

🇮🇱Israel heyyo Jerusalem

@heyyo That is incredibly fast testing! 😮 Thanks!

You are the superman, man ! @wim
You are in all issues, commenting, testing, coding, patching, reviewing always nicely and with humor

Looks like I missed a bunch of cases; sorry — absolutely didn’t mean to waste your time 🫣

Waste my time ? When you and all developers are making such a great product, giving from your time for so many intense days.

🎤 is back to @laurii 😂

🇮🇱Israel heyyo Jerusalem

Applying the 2 patches on last dev of XB(#e9d0d1c6d)
- https://git.drupalcode.org/project/experience_builder/-/merge_requests/1...
- https://git.drupalcode.org/project/experience_builder/-/merge_requests/1...

Rebuild of the bundle + clear cache of drupal + disable cache in browser console

1. Rename a prop from paddingInline to padding_inline + drush cr
Viewing or editing a page using previous prop name we got the error:
`OutOfRangeException

'padding_inline' is not a prop on the component 'Single-directory component: Linno Container'.`

  private function getDefaultStaticPropSource(string $prop_name, bool $validate_prop_name = TRUE): StaticPropSource {
    assert(isset($this->configuration['prop_field_definitions']));
    assert(is_array($this->configuration['prop_field_definitions']));
    $component_schema = $this->getSdcPlugin()->metadata->schema ?? [];
    if ($validate_prop_name && !array_key_exists($prop_name, $component_schema['properties'] ?? [])) {
      throw new \OutOfRangeException(sprintf("'%s' is not a prop on the component '%s'.", $prop_name, $this->getComponentDescription()));
    }

2. Deleting a prop from a SDC with content using this prop + drush cr
Exact same error than in 1.

3. Adding a new prop to an existing SDC with existing content + drush cr
- Visiting a previous page, the page is ok
- Editing the page, then selecting the SDC to edit: impossible we got the error "An unexpected error has occurred while rendering the component's form. SyntaxError: Unexpected token '<', "

🇮🇱Israel heyyo Jerusalem

It looks like it's working great 🎉

🇮🇱Israel heyyo Jerusalem

Thanks a lot for the quick work in this issue, I'm offline for now, I'll check tomorrow 🙏

🇮🇱Israel heyyo Jerusalem

I also got an error, when adding a new prop(enum) to an existing sdc.
It's impossible to edit previous version of this same sdc.

Error in drupal logs when we want to edit this SDC:
Path: /xb/api/v0/form/component-instance/xb_page/10
Message:
TypeError: array_key_exists(): Argument #2 ($array) must be of type array, null given in array_key_exists() (line 151 of /var/www/html/web/modules/contrib/experience_builder/src/Plugin/ExperienceBuilder/ComponentSource/GeneratedFieldExplicitInputUxComponentSourceBase.php).

Is there any workaround ? except recreating the page using it ?

🇮🇱Israel heyyo Jerusalem

heyyo created an issue.

🇮🇱Israel heyyo Jerusalem

Another one which surprised me, was the paste of text into the chat with CTRL+V. If a component was copied previously, instead of pasting the text, it pastes the component into the viewport.
Workaround, use the paste from contextual menu(right click)

🇮🇱Israel heyyo Jerusalem

My idea is to regenerate response only if prop is not required and invalid enum value

🇮🇱Israel heyyo Jerusalem

If enums prop is not required, maybe we can just removed non valid option, instead of regenerating the response again, also we can enter into infinite loop if LLM is stubborn 😄

🇮🇱Israel heyyo Jerusalem

right payload is ok, so backend issue.

🇮🇱Israel heyyo Jerusalem

I just checked, the POST request xb/api/v0/config/pattern doesn't contain the full tree of the selected component.

🇮🇱Israel heyyo Jerusalem

I also saw this issue outside xb-demo, and I didn't have any region enabled in my theme to be managed by XB.

🇮🇱Israel heyyo Jerusalem

And not a bug, but more a feature request, today it's possible to insert SDC, but what about blocks and patterns (sections) ?
It will be a great addition if we were able to place a section, and let the LLM to fill existing props according prompt, should decrease unexpected results of llm

🇮🇱Israel heyyo Jerusalem

A more problematic issue, sometimes LLM will set value of enums which doesn't exist, so it will trigger an error in XB to the impossibility to render the sdc

🇮🇱Israel heyyo Jerusalem

Another issue I encountered was with SDC which has multiple slots.
If in the prompt, we specify to insert components inside a slot by providing it's name, the LLM will always insert the SDC into the first slot.
Following the advice of Akhil to better understand what's the going on, prompting something like insert a button in all slots of a specified component will do work.

🇮🇱Israel heyyo Jerusalem

I suppose the instructions given to LLM should be improved, but I have to mention it doesn't happen all the time.
I don't even remember which prompt I used to obtain such behavior, maybe also related to the abilities of the LLM picked.

Production build 0.71.5 2024