Specbee: Using Drupal 10’s Asset Library to Streamline Asset Handling

Drupal 7 lacked a streamlined mechanism for handling assets, which necessitated the development of more efficient solutions like the Asset Library introduced in Drupal 8 and the latest versions. Asset library solves the problem of loading JS and CSS files on every page. However, unless specified, Drupal does not load these assets as it can affect front-end performance.
Let’s learn more about asset libraries in Drupal 10 and how to work with them.

What is an Asset Library in Drupal
An Asset library in Drupal is nothing but a YAML data structured inside a THEMENAME.libraries.yml file and they contain only CSS and JS files. They are the bundles of CSS and JavaScript files that present inside a module or theme and perform together for style and functionality.

The Asset Library in Drupal provides a centralized and organized repository for managing various types of digital assets.
Assets Library boasts various features designed to enhance usability, scalability, and flexibility.
Asset Library in Drupal is designed to support responsive web design, ensuring that assets are displayed consistently on various devices.
Drupal places a strong emphasis on accessibility, and the Asset Library follows these standards to ensure a positive user experience for all.
Drupal’s Asset Library includes version control features, allowing users to manage and track changes to assets over time.
Performance Optimization

Define an Asset Library
Let’s declare a new Asset library named custom-slider.
custom-slider:
  version: 1.0
  CSS:
    theme:
      css/custom-slider-theme.css: {}
  js:
    js/custom-slider.js: {}Some of the attributes used include:

Minified: If the file is already minified, set this to True to avoid minifying it again, else default value is False.
Preprocess: Default value is True, set to False to exclude a file from Aggregation.
Type (Javascript Only):        ◦ The default value is a file, if you leave it blank.       ◦ For external files, use type as external like:

//cdn.com/js/example.js: {type: external}Assets Loading Order

By default, all JS files are loaded in the order in which files are listed.
By default, JS files are loaded in the footer.
Set header: true for a library to get loaded in the header.
For example:

jquery.ui:
  header: true
  js:
    assets/vendor/jquery.ui/ui/core-min.js: {}SMACSS Categorization

Drupal follows a SMACSS-style categorization and all CSS files are loaded first based on their category and then by the order.
SMACSS categorization is used to set the weight of CSS files, this will not work for JS files.
To set CSS weights there are 5 different levels:       ◦ base – This rule consists of styling HTML elements only. CSS_BASE = -200       ◦ layout – Macro management of page or arrangements of elements on the page, including any grid system. CSS_LAYOUT = -100       ◦ component – Components are reusable and discrete UI elements. CSS_COMPONENT = 0       ◦ state – Styles that deal mostly with client-side changes such as hovering links, opening modal dialog, etc. CSS_STATE = 100       ◦ theme – This is purely visual styling such as box-shadow, backgrounds, borders, colors, etc. CSS_THEME = 200

Attach an Asset Library
1. Globally: 

We can attach the asset library globally via the THEMENAME.info.yml file, but this approach would work only for a Theme.
For any modules you should use hook_page_attachments_alter() or similar.
For example:

name: ‘My Custom Theme’
type: theme
description: ‘A custom Drupal 9 theme for demonstration purposes.’
package: Custom
core_version_requirement: ^8 || ^9 || ^10
base theme: false

libraries:
  – THEMENAME/global-styling
  – THEMENAME/global-scripts2. Conditionally, via a preprocess function using #attached: 
If you need to restrict the library to a particular page or element, then this is the best way to add libraries.
For example:Taking a case where we need to attach a library to our page, then we can use hook_page_attachments_alter():
/**
* Implements hook_page_attachments_alter().
*/
function custom_module_page_attachments_alter(array &$attachments) {
  // Adding stylesheet to the page.
  $attachments[‘#attached’][‘library’][] = ‘custom_module/custom-styles’;
 
  // Add a custom JavaScript file to the page.
  $attachments[‘#attached’][‘library’][] = ‘custom_module/custom-scripts’;

  }Or hook_preprocess_page():
/**
* Implements hook_preprocess_page().
*/
function custom_module_preprocess_page(&$variables) {
  // Adding stylesheet to the page.
  $attachments[‘#attached’][‘library’][] = ‘custom_module/custom-styles’;
}Similarly, with different preprocess functions we can attach a library using the #attached render array property like:
/**
* Implements hook_page_attachments_alter
*/
function custom_module_attachments_alter(array &$page) {
  // Get the current path.
  $path = $current_path = Drupal::service(‘path.current’)->getPath();
  // If we’re on the node listing page, add our retro library.
  if ($path == ‘/node’) {
    $page[‘#attached’][‘library’][] = ‘custom_module/custom-styles’;
  }
}3. Inside a Twig template file:
Use attach_library() in twig template.
{# Attach a CSS library #}
{% attach_library(‘my_theme/global-styling’) %}

{# Attach a JavaScript library #}
{% attach_library(‘my_theme/global-scripts’) %}Final Thoughts
Assets Library in Drupal (versions 8 and above) has a profound impact on web development. It centralizes the management of CSS and JavaScript files within modules or themes, ensuring consistency and ease of maintenance across a website or application. By bundling these assets together, developers can efficiently control the presentation and functionality of their digital creations. If you’re looking to implement fantastic features of Drupal like this one in your next project, we have a team of Drupal experts who can help you. We’d love to talk!

Julia Janssen creates art to be an ambassador for data protection

Julia Janssen creates art to be an ambassador for data protection

At Mozilla, we know we can’t create a better future alone, that is why each year we will be highlighting the work of 25 digital leaders using technology to amplify voices, effect change, and build new technologies globally through our Rise 25 Awards. These storytellers, innovators, activists, advocates, builders and artists are helping make the internet more diverse, […]

The post Julia Janssen creates art to be an ambassador for data protection appeared first on The Mozilla Blog.

The VGA attribute controller is weird

The grabber in Windows 3.1 was improved to save and restore the index register as well, but it does not attempt to restore the flip-flop state, which is significant. The problem with the VGA emulation was that it erroneously applied the flip-flop state to reads from port 3C0h, and Windows 3.1 would save the wrong index register value… but only the second time through, because the flip-flop state was different at that point. That is to say, the Windows 3.1 standard mode grabber read from port 3C0h to query the attribute controller index register state, but the emulation returned the currently selected data register contents instead. And then, when restoring the attribute controller index register the next time around, the register would be restored to the wrong value which didn’t have bit 5 set, causing the screen to go blank. ↫ Michal Necasek It’s not every day that you learn how an aspect of the workings of VGA causes a blank screen under very specific circumstances when running Windows 3.1 in Standard mode under emulation, and that this specific aspect of the workings of VGA was implemented to maintain backwards compatibility with EGA. Absolutely bonkers.

Why datasets built on public domain might not be enough for AI

Common Corpus is a public domain dataset for training large language models (LLMs). Boasting 500 billion words in multiple languages, drawn from various cultural initiatives, it offers researchers a powerful tool to develop smaller and more efficient LLMs. It should not be abused as a tool to promote public policies that expand the reach of copyright law.

Event Organizers: Connect with Event Organizers at DrupalCon Portland ’24

There are many opportunities to connect with fellow event organizers throughout the week at DrupalCon Portland 2024.

All Week

Community Events Booth
Expo Hall – #106
Visit with the EOWG board and other event organizers in the Expo Hall. Be sure to bring some of your stickers and swag to share with the community!

Monday, May 6 – 2:00 – 3:00pm

Event Organizers Roundtable BOF
Room G132, Table 1
Open discussion time for Drupal Event Organizers to gather and for others who are interested in organizing their own events or learning more about the Event Organizers Working Group.

Wednesday, May 8 – 9:00am – 5:00pm

Contribution Day
Room B115-116
Find us to help improve the Community Events page.

Thursday, May 9 – 9:00am – 4:00pm

Community Summit 
Room C120-122
EOWG Board members will present a panel at 9:15am. Join us for a day of community discussions. The summit is open to everyone in the Drupal community, at no additional cost.

Not joining DrupalCon? Join us online any time:

Open Meeting via Slack!
Tuesday, May 14 starting at 16:00 UTC / 12:00 pm ET

  • Initiative Updates
  • Camp Reports
  • DrupalCon Report

Join us to discuss these and other topics in the #event-organizers channel.

If there is something you want to share or discuss related to your camp, meetup, or other events organizer topics either leave a message in the Slack channel or comment on the Drupal.org meeting agenda issue.