Material Design Lite (MDL) can be included in your project in a couple of ways:
1. Using a CDN: The easiest way to get started is by including MDL via a CDN link in your HTML file’s <head>
section. This method is ideal for quick prototyping and small projects. Use the following link:
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
Remember to replace 1.3.0
with the latest version number if available. The defer
attribute on the script tag ensures that the MDL JavaScript is loaded after the page’s HTML is parsed, preventing potential rendering issues. The CSS includes a specific theme; explore other available themes in the documentation.
2. Downloading the files: For larger projects or those requiring more control, download the MDL files directly from the https://getmdl.io/. Extract the contents and include the CSS and JavaScript files in your project. This allows for offline access and customization.
Regardless of the installation method, ensure your project has a basic HTML structure. You’ll need to include the MDL CSS file in the <head>
and the MDL JavaScript file before the closing </body>
tag. Correct placement is crucial for proper functionality. If using a build system (like Webpack or Parcel), you’ll need to configure it to handle the CSS and JavaScript files appropriately. Consult your build system’s documentation for specifics.
A minimal HTML structure for an MDL project looks like this:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My MDL Project</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
</head>
<body>
<!-- Your MDL components will go here -->
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
</body>
</html>
Remember to replace the placeholder CDN links with your local file paths if you downloaded MDL directly.
Let’s add a simple button:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My MDL Project</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
</head>
<body>
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect">
Click Me!</button>
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
</body>
</html>
This code adds a raised button with a ripple effect. The mdl-js-button
and mdl-js-ripple-effect
classes are essential for enabling the MDL JavaScript functionality. Notice how simple it is to incorporate a fully styled and interactive component into your page. Explore the documentation for more components and customization options. Remember to replace the placeholder CDN links with your local file paths if you downloaded MDL directly.
MDL text fields provide a standardized input experience. They are highly customizable, allowing for various input types (text, email, password, etc.) and validation states.
Basic Usage:
<form action="#">
<div class="mdl-textfield mdl-js-textfield">
<input class="mdl-textfield__input" type="text" id="sample">
<label class="mdl-textfield__label" for="sample">Label</label>
</div>
</form>
This creates a basic text field. The mdl-js-textfield
class is crucial for enabling MDL’s JavaScript functionality. You can add attributes like required
, pattern
, and minlength
for input validation. MDL will automatically handle styling and feedback based on the input’s state. For more advanced options like floating labels and hints, refer to the full documentation.
MDL offers a variety of buttons, including raised, flat, icon, and colored buttons. They are designed for consistency and ease of use.
Basic Usage (Raised Button):
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect">
Raised Button</button>
Replace mdl-button--raised
with mdl-button--fab
for floating action buttons, mdl-button--icon
for icon buttons, and remove mdl-button--raised
for a flat button. The mdl-js-ripple-effect
class adds a ripple effect on click.
Cards are used to present information in a structured and visually appealing way. They can contain various content, including text, images, and other components.
Basic Usage:
<div class="mdl-card mdl-shadow--2dp">
<div class="mdl-card__title">
<h2 class="mdl-card__title-text">Card Title</h2>
</div>
<div class="mdl-card__supporting-text">
Supporting text...</div>
<div class="mdl-card__actions mdl-card--border">
<a class="mdl-button mdl-button--colored mdl-js-button mdl-js-ripple-effect">
Action</a>
</div>
</div>
This creates a card with a title, supporting text, and an action button. The mdl-shadow--2dp
class adds a subtle shadow effect.
MDL provides both simple and complex list implementations.
Basic Usage (Simple List):
<ul class="mdl-list">
<li class="mdl-list__item">List Item 1</li>
<li class="mdl-list__item">List Item 2</li>
</ul>
For more complex lists with icons and actions, see the MDL documentation for detailed examples of using mdl-list__item--two-line
and mdl-list__item--three-line
.
MDL offers several types of menus, including contextual menus and dropdown menus.
Basic Dropdown Menu:
<button class="mdl-button mdl-js-button mdl-button--icon">
<i class="material-icons">more_vert</i>
</button>
<ul class="mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect" for="menu-lower-right">
<li class="mdl-menu__item">Menu Item 1</li>
<li class="mdl-menu__item">Menu Item 2</li>
</ul>
Remember to assign an id
to your button and reference it in the for
attribute of the menu.
Progress bars visually represent the progress of a task.
Basic Usage:
<div class="mdl-progress mdl-js-progress mdl-progress__indeterminate"></div>
This creates an indeterminate progress bar. For determinate progress bars, omit mdl-progress__indeterminate
and use the progress
attribute on the div.
Sliders allow users to select a value from a range.
Basic Usage:
<input class="mdl-slider mdl-js-slider" type="range" min="0" max="100" value="50">
Switches provide a simple on/off toggle.
Basic Usage:
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
<input type="checkbox" class="mdl-switch__input">
</label>
MDL styles HTML tables for improved readability and visual appeal.
Basic Usage:
<table class="mdl-data-table mdl-js-data-table">
<thead>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Row 1, Cell 1</td>
<td>Row 1, Cell 2</td>
</tr>
</tbody>
</table>
MDL utilizes Google Material Icons. To use them, include the Material Icons link in your HTML <head>
and use the icon class within an element.
Basic Usage:
<i class="material-icons">favorite</i>
This will display a “favorite” icon. Replace favorite
with the desired icon name from the Material Icons library. Remember to include the Material Icons CSS link as shown in the “Getting Started” section.
MDL utilizes a flexible grid system based on CSS flexbox for creating responsive and adaptable layouts. It doesn’t enforce a fixed grid structure like some frameworks, offering greater flexibility in arrangement and customization. Instead, it provides utility classes to aid in aligning and distributing elements within their containers. The core principle is to use flexbox properties on containers to manage the arrangement of child elements.
For example, to create a simple two-column layout, you would use the flexbox properties display: flex
and flex-direction: row
on the parent container and then control the width of each child element using percentage-based widths or the flex-grow
property. MDL itself doesn’t offer specific grid classes like col-md-6
, but its components often utilize these underlying principles for consistent layout.
MDL offers several components specifically designed to aid in building complex layouts. While not a rigid grid system, these components provide structure and visual consistency:
Cards: Cards are excellent for creating modular sections within a page, often used for displaying items in a grid-like fashion. Their inherent structure and styling promote visual separation.
Lists: Lists are useful for presenting structured information vertically, often used within sections or as a primary content organization method.
Text Fields and Buttons: These components, despite their individual function, contribute greatly to the layout structure by providing clear visual separations and containers for interactive elements.
By strategically combining these components, you can create complex, yet visually consistent layouts.
MDL embraces responsive design principles, making your applications adapt seamlessly across different screen sizes. This is achieved primarily through:
CSS Flexbox: As mentioned earlier, the foundational layout mechanism is CSS Flexbox, inherently responsive. Flexbox adapts to available space dynamically.
Media Queries (implicitly): While MDL doesn’t enforce specific media query breakpoints, its components are designed to visually adjust based on screen size. The CSS utilized inherently makes use of media queries to handle different viewport sizes. Developers are free to add their own media queries to further customize the responsiveness of their layouts.
Component Flexibility: The individual MDL components are flexible in their presentation. Many adapt their layout and presentation automatically based on the screen size and available space.
While MDL incorporates responsiveness into its core components, developers are encouraged to leverage CSS media queries for fine-grained control over layout behavior at specific screen sizes. You would use standard CSS media queries to target different screen widths and make adjustments to your layout as needed. MDL’s components should generally adapt well without significant media query intervention, but they provide a mechanism for custom tailoring. For example:
@media (max-width: 600px) {
.my-element {
flex-direction: column; /* Stack elements vertically on smaller screens */
} }
This example shows how a media query can change the flex-direction
property of an element, modifying the layout on smaller screens. Remember to always test your responsive design across various devices and screen sizes.
Dialogs provide a modal interface for displaying important information or prompting the user for input. They temporarily interrupt the user’s workflow to focus their attention.
Basic Usage:
<button id="show-dialog" class="mdl-button mdl-js-button mdl-button--raised">Show Dialog</button>
<dialog class="mdl-dialog">
<h4 class="mdl-dialog__title">Dialog Title</h4>
<div class="mdl-dialog__content">
<p>This is the dialog content.</p>
</div>
<div class="mdl-dialog__actions">
<button type="button" class="mdl-button close">Close</button>
</div>
</dialog>
You’ll need JavaScript to open and close the dialog. This is typically done by attaching an event listener to the button and using dialog.showModal()
and dialog.close()
. MDL doesn’t automatically handle the opening and closing of dialogs; you are responsible for this interaction via JavaScript.
Tooltips provide brief, informative text when the user hovers over an element. They’re excellent for providing context or additional details without cluttering the interface.
Basic Usage:
<button class="mdl-button mdl-js-button mdl-button--raised mdl-tooltip mdl-tooltip--large"
data-mdl-for="tooltip-top">
Tooltip on Hover</button>
<span class="mdl-tooltip mdl-tooltip--large" data-mdl-for="tooltip-top" id="tooltip-top">
Tooltip Text Here</span>
The mdl-tooltip
class styles the tooltip, and the data-mdl-for
attribute links it to the element that triggers it. Ensure to include the mdl-js-tooltip
class if using JS for tooltip placement. The id
attribute on the span is important for the correct linking between the trigger and tooltip elements.
Snackbars provide lightweight feedback messages at the bottom of the screen. They briefly appear to inform the user of an action’s outcome, usually without interrupting their current task.
Basic Usage:
<button id="show-snackbar" class="mdl-button mdl-js-button mdl-button--raised">Show Snackbar</button>
<div id="snackbar" class="mdl-snackbar mdl-js-snackbar">
<div class="mdl-snackbar__text"></div>
<button class="mdl-snackbar__action"></button>
</div>
JavaScript is necessary to control the snackbar’s appearance and message. Use componentHandler.upgradeElement(snackbar)
to initialize it and snackbar.showSnackbar({message: 'Message'})
to display it.
Tabs allow users to switch between different views or sections of content within a single container.
Basic Usage:
<div class="mdl-tabs mdl-js-tabs mdl-js-ripple-effect">
<div class="mdl-tabs__tab-bar">
<a href="#tab-1" class="mdl-tabs__tab is-active">Tab 1</a>
<a href="#tab-2" class="mdl-tabs__tab">Tab 2</a>
</div>
<div class="mdl-tabs__panel is-active" id="tab-1">
Content for Tab 1</div>
<div class="mdl-tabs__panel" id="tab-2">
Content for Tab 2</div>
</div>
This creates a simple tab structure. Ensure that the href
attributes of the tab links match the id
attributes of the corresponding panels. MDL’s JavaScript handles the tab switching functionality.
Navigation drawers provide off-screen navigation menus, commonly used in mobile applications or applications with extensive navigation options.
Basic Usage:
<button id="demo-menu-lower-left"
class="mdl-button mdl-js-button mdl-button--icon">
<i class="material-icons">menu</i>
</button>
<ul class="mdl-menu mdl-menu--bottom-left mdl-js-menu mdl-js-ripple-effect"
for="demo-menu-lower-left">
<li class="mdl-menu__item">Menu Item 1</li>
<li class="mdl-menu__item">Menu Item 2</li>
</ul>
This example shows a simple menu. For a full navigation drawer, you’ll likely want to incorporate it into a more complex layout, possibly within a side-panel structure that you control the opening and closing of using JavaScript. Remember to utilize appropriate styling to integrate the drawer seamlessly into your layout. MDL provides the styling for the menu items, but the overall drawer structure is up to the developer.
MDL utilizes a flexible theming system based on color palettes. While pre-defined themes (like indigo-pink
) are provided via CDN links, you can significantly customize the color scheme to match your branding. MDL doesn’t directly offer a palette-selection tool, but the underlying CSS allows for modification of color variables. You’ll need to modify the CSS to change colors. Inspect the included CSS (or the source files if you downloaded them) to locate the variables controlling the colors and adjust them accordingly. Consider using a CSS preprocessor like Sass (detailed below) for more manageable customization.
MDL employs a specific set of typography styles based on Material Design guidelines. You can adjust the fonts, font sizes, and line heights to a degree by modifying the CSS. However, significant deviations from the default typography might impact the visual consistency and overall feel of the components. You’ll need to examine the CSS to identify the relevant styles and adjust them, being careful not to disrupt the overall design language. Again, using a CSS preprocessor like Sass can simplify this process.
Customizing MDL’s styles is primarily done by overriding its CSS. You can achieve this by adding your own CSS rules that are more specific than MDL’s rules, ensuring your customizations take precedence. Place your custom CSS after including the MDL CSS file in your HTML. Remember to use CSS specificity rules (e.g., IDs, classes, and important!) judiciously to prevent unintended consequences. If you’re modifying existing MDL classes, use more specific selectors to target only the elements you intend to alter. Overriding core MDL styles requires a good understanding of CSS specificity and potentially involves inspecting the MDL source CSS to understand which styles to target.
For more advanced theming and customization, using Sass (or another CSS preprocessor) is highly recommended. Sass allows you to define variables, mixins, and functions that make it easier to manage and maintain your customizations. You’ll need to install Sass and then compile your Sass files into CSS that can be included in your HTML. You can either modify the provided MDL Sass files (if available) or create your own Sass files to override or extend the existing MDL styles. Using Sass enables a more structured approach to customizing colors, typography, and other aspects of the MDL theme. This approach gives you greater control and maintainability compared to directly editing the compiled CSS. Remember to consult the Sass documentation for specifics on its usage and compilation process.
MDL components require JavaScript for their interactive features (e.g., ripples, animations, dynamic behavior). While some styling is applied directly by the CSS, the JavaScript library is crucial for functionality. Initialization is typically done automatically by the mdl-js-*
classes added to the HTML elements. However, for more complex scenarios or when you add components dynamically, manual initialization might be necessary.
The core function for upgrading an element (making it interactive) is componentHandler.upgradeElement(element)
, where element
is a DOM element. You can upgrade individual elements or a group of elements. For automatic upgrading, the library attempts to upgrade elements when the DOM is ready. However, for dynamically added elements, this step is crucial to ensure proper functionality.
// Upgrade a single element
const myButton = document.getElementById('myButton');
.upgradeElement(myButton);
componentHandler
// Upgrade all elements matching a selector
const allButtons = document.querySelectorAll('.mdl-button');
.forEach(button => componentHandler.upgradeElement(button)); allButtons
MDL components typically trigger standard DOM events (e.g., click
, focus
, change
). You can attach event listeners to these elements using standard JavaScript methods like addEventListener
. For instance, to handle a button click, you would use:
const myButton = document.getElementById('myButton');
.addEventListener('click', function() {
myButton// Handle the click event
console.log('Button clicked!');
; })
Some components may offer specific events or methods within their APIs, but in most cases, the standard DOM events will suffice.
MDL itself doesn’t have a built-in data-binding mechanism like some frameworks (e.g., Angular, React). Data binding needs to be implemented manually using JavaScript to update the component’s properties based on data changes. You would need to write your own JavaScript code to listen for data changes (e.g., from a form input, AJAX response, etc.) and then update the relevant MDL component’s properties accordingly. There are no direct MDL functions for data binding.
MDL doesn’t provide a dedicated API for creating custom components in the same way some frontend frameworks do. To create custom components, you would need to build your own HTML elements, CSS styles, and JavaScript behavior. You can leverage the existing MDL styling and JavaScript patterns for consistency but will need to manage the component’s lifecycle and interactions manually. Essentially you are creating a new element that visually and functionally aligns with MDL’s design language.
The MDL JavaScript library is the core of the interactive functionality. It’s a relatively lightweight library designed to work with the provided components. The key functions are componentHandler.upgradeElement()
for initializing components, and various component-specific methods (consult the documentation for specifics on individual component APIs). Remember that the library relies on the presence of the appropriate CSS classes on your HTML elements. Incorrect class usage can prevent proper initialization and functionality. The library itself is relatively straightforward; most interactions involve event handling and updating component properties directly through JavaScript. Keep in mind that this is not a framework, but a set of utilities to add Material Design to your HTML.
MDL components are designed with accessibility in mind and incorporate appropriate ARIA (Accessible Rich Internet Applications) attributes where necessary. These attributes provide semantic information to assistive technologies, helping users with disabilities interact with the components effectively. For example, buttons will typically have role="button"
and appropriate aria-label
or aria-labelledby
attributes for proper screen reader communication. While MDL adds some ARIA attributes, it’s crucial to ensure your implementation correctly uses them and adds any missing ones. Always verify the ARIA attributes are present and correctly configured for each component. If you are customizing components significantly, you may need to manually add ARIA attributes to ensure appropriate screen reader functionality.
MDL components support keyboard navigation, allowing users to interact with them using only the keyboard. Tab order should be logical and intuitive. Focus states should be clearly visible. Many components will handle basic keyboard navigation automatically. However, you might need to add additional JavaScript or CSS to handle more complex navigation scenarios or to ensure elements are appropriately focusable. Testing your application thoroughly with keyboard-only navigation is crucial to confirm accessibility for users who rely on keyboard interaction.
MDL components are designed to be compatible with screen readers. The use of ARIA attributes, appropriate HTML semantics, and clear labels ensures that screen readers can effectively communicate the components’ functionality and content to visually impaired users. Thorough testing with various screen readers is necessary to guarantee compatibility and identify any potential issues. Remember that screen reader compatibility hinges heavily on proper usage of ARIA attributes and well-structured HTML.
To ensure your MDL application is accessible:
Use semantic HTML: Employ appropriate HTML elements to represent the content’s meaning, rather than relying solely on CSS for styling.
Provide alternative text for images: Use the alt
attribute on <img>
tags to describe the image’s content for screen readers.
Use sufficient color contrast: Ensure adequate color contrast between text and background to improve readability.
Clearly define interactive elements: Use ARIA attributes to explicitly define interactive elements (buttons, links, etc.) for assistive technologies.
Test with assistive technologies: Thoroughly test your application with screen readers and keyboard-only navigation to identify and address any accessibility issues. Different screen readers may interpret content differently; use multiple readers if possible.
Follow WCAG guidelines: Adhere to the Web Content Accessibility Guidelines (WCAG) for best practices.
Keep it Simple: Avoid overly complex layouts or interactions which could confuse assistive technology.
Remember that accessibility is an ongoing process. Regular testing and review are crucial to maintaining accessibility as your application evolves.
</body>
tag and that the defer
attribute is used.mdl-js-*
class is a common cause of non-functional components.componentHandler.upgradeElement()
.Use your browser’s developer tools: The developer tools (usually accessed by pressing F12) are invaluable for inspecting HTML, CSS, and JavaScript. Use the console to view errors and warnings, the network tab to analyze resource loading, and the elements tab to check the applied styles.
Simplify your code: If you’re facing complex issues, temporarily remove or comment out sections of your code to isolate the problem.
Check the MDL documentation: Review the official documentation to ensure you’re correctly using the components and their APIs.
Search for existing issues: Check online forums and issue trackers for solutions to known problems.
Console Logging: Strategically use console.log()
statements to track the values of variables and the execution flow of your JavaScript code. This helps pinpoint where problems occur.
Upgrade individually: If you have many MDL elements, you may find it easier to upgrade them individually in the console rather than relying on auto-upgrade, this can reveal which elements are causing issues.
MDL aims for broad browser compatibility, but some older browsers might have limited support. Modern browsers (Chrome, Firefox, Edge, Safari) are generally well-supported. Testing on various browsers and browser versions is always recommended, especially if targeting a broad audience. If you encounter compatibility problems, consider using polyfills or alternative implementations for unsupported features. Older browsers might require specific CSS hacks or workarounds.
Remember to provide clear, concise information when seeking help, including the relevant code snippets, browser details, and a precise description of the problem you are encountering.
Maintain a well-organized project structure to improve code readability and maintainability. Consider using a modular approach, separating your HTML, CSS, and JavaScript into distinct files. Organize your files into logical folders (e.g., components, styles, scripts). Use meaningful names for your files and classes. For larger projects, consider using a build system (like Webpack or Parcel) to manage dependencies and optimize your code. A well-structured project makes it easier to find, understand, and modify code later. This is especially important as projects grow in size and complexity.
Write clean, well-documented code to simplify maintenance and future development. Use consistent coding styles and conventions throughout your project. Add comments to explain complex logic or unusual approaches. Use version control (like Git) to track changes and collaborate effectively. Regularly review and refactor your code to keep it clean, efficient, and easy to understand. Break down complex tasks into smaller, manageable functions or modules. Well-documented code reduces the time needed to understand existing components when making modifications or debugging. Follow the DRY (Don’t Repeat Yourself) principle to avoid code duplication.
Optimize your application’s performance for a smooth user experience. Minimize HTTP requests by combining CSS and JavaScript files. Use efficient CSS selectors to avoid unnecessary computations. Optimize images by compressing them without significant quality loss. Lazy-load images to reduce initial page load time. Use browser caching to improve subsequent page loads. Avoid unnecessary JavaScript computations, and use appropriate data structures for efficient data management. In general, follow standard web performance best practices to create a responsive and fluid user experience. Tools like Lighthouse can help analyze and identify areas for improvement.
Consider search engine optimization (SEO) best practices to improve your application’s visibility in search results. Use descriptive and relevant titles and meta descriptions. Ensure your content is easily crawlable by search engines. Use structured data markup (schema.org) to help search engines understand the context of your content. Use appropriate headings (<h1>
to <h6>
) to structure your content logically. Ensure that all your links work correctly. For single-page applications, consider server-side rendering (SSR) to improve SEO, allowing search engines to easily crawl the content. Using ARIA attributes for accessibility will also improve SEO as accessibility and SEO are often intertwined. Use descriptive link text, making links easily understandable for both users and search engines.
(This section should contain a detailed list of changes made across various versions of MDL. Each entry should specify the version number, date, and a description of the changes. For example: )
Version 1.3.0 (YYYY-MM-DD):
mdl-carousel
Version 1.2.0 (YYYY-MM-DD):
mdl-spinner
(use mdl-progress
instead)(Continue adding entries for each version)
Contributions to MDL are welcome! To contribute, follow these steps:
(You may want to add details on specific coding style guidelines or preferred tools to be used)
(This section should contain the full text of the license under which MDL is distributed. For example, the MIT License):
MIT License
Copyright (c) [year] [copyright holders]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.